【发布时间】:2021-10-20 21:52:07
【问题描述】:
我一直在尝试在 docker 网络和主机网络之间多播流量。这是我当前设置的一个示例,紫色 docker 网络中的 docker 容器为蓝色,黄色主机网络中的主机网络 PC 为橙色:
如您所见,我正在尝试在“中继”docker 容器中捕获和中继多播流量。我已经给了它--net host 选项,使它可以使用主机网络接口(ens160)。这允许我在 docker 接口 (docker0) 和主机接口上捕获流量,然后我通过相反的接口重新发送流量(在 docker 接口上捕获的流量使用主机接口重新发送,反之亦然)。
当我将流量从 docker 网络重新发送到主机网络时,这似乎有效。但是来自主机网络的流量不想发送到 docker 网络。绿色箭头代表成功的多播流量,如我确认多播流量沿箭头发送和接收。红色箭头表示在箭头末端未接收到多播流量。所有流量都在同一个端口上发送/接收。
以下是中继程序的部分 Python 代码:
import socket, netifaces as ni
from scapy.all import sniff, Raw, IP, UDP
def pkt_found(other_sock, multicast_address, port, iface_ip):
def save_pkt(pkt):
if pkt[IP].src != iface_ip:
pkt[IP].src = iface_ip
pkt[IP].dst = multicast_address
pkt[UDP].sport = port
pkt[UDP].dport = port
del pkt[IP].chksum
pkt.show2()
other_sock.sendto(bytes(pkt[Raw]), (multicast_address, port))
return save_pkt
def listen_for_traffic(iface_name, other_sock, multicast_address, port, iface_ip):
sniff(iface=iface_name, filter="dst port "+str(port), prn=pkt_found(other_sock, multicast_address, port, iface_ip))
def createMulticastSocket(iface_ip, multicast_address, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
socket.inet_aton(multicast_address)+socket.inet_aton(iface_ip))
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 64)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 0)
sock.bind((multicast_address, port))
return sock
multicast_address = "225.0.0.0"
port = 1234
docker_iface_name = "docker0"
host_iface_name = "ens160"
docker_iface_ip = ni.ifaddresses(docker_iface_name)[ni.AF_INET][0]['addr']
host_iface_ip = ni.ifaddresses(host_iface_name)[ni.AF_INET][0]['addr']
docker_sock = createMulticastSocket(docker_iface_ip, multicast_address, port)
host_sock = createMulticastSocket(host_iface_ip, multicast_address, port)
docker_thread = threading.Thread(target=listen_for_traffic, args=(docker_iface_name, host_sock, multicast_address, port, docker_iface_ip,))
host_thread = threading.Thread(target=listen_for_traffic, args=(host_iface_name, docker_sock, multicast_address, port, host_iface_ip,))
docker_thread.start()
host_thread.start()
有人知道我做错了什么吗?
【问题讨论】:
标签: python docker sockets networking multicast