【问题标题】:Relaying multicast traffic between docker network and host network在 docker 网络和主机网络之间中继多播流量
【发布时间】: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


    【解决方案1】:

    显然我应该将套接字绑定到接口 IP。将sock.bind((multicast_address, port)) 更改为sock.bind((iface_ip, port)) 就成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 2016-03-25
      • 2016-02-27
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多