将组播流量转发到桥接接口

将组播流量转发到桥接接口

我正在尝试将到达接口 eth1 的多播流量转发到我用ip link add br0 type bridge.

ip route add 226.3.2.1 dev docker0在其他地方,我用一台简单的(其他机器)完成了这个任务。

我现在已经尝试了一些方法,并且还使用了像 pimd 这样的多播路由器。但是,我无法重定向或转发流量。当我在测试设置中使用该ip route add命令时,我仍然可以看到多播流量,tcpdump但在多播接收脚本(在 eth1 上)中看不到。

在上下文中,我想将多播流量转发到网桥,我以某种方式通过 multus-cni 将其包含在 kubernetes 容器中。

接口(eth1 正在接收 226.3.2.1 上的多播流量):

2324: eth0@if2325: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:80:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.128.2/20 brd 192.168.143.255 scope global eth0
       valid_lft forever preferred_lft forever
21: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether be:ec:42:84:8c:35 brd ff:ff:ff:ff:ff:ff
2340: eth1@if2341: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:90:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.144.5/20 brd 192.168.159.255 scope global eth1
       valid_lft forever preferred_lft forever

eth1 226.3.2.1 的 tcpdump

15:07:52.288989 IP (tos 0x0, ttl 3, id 22735, offset 0, flags [DF], proto UDP (17), length 34)
    192.168.144.1.37394 > 226.3.2.1.9000: [bad udp cksum 0x34ce -> 0xd209!] UDP, length 6
15:07:52.435168 IP (tos 0x0, ttl 3, id 22745, offset 0, flags [DF], proto UDP (17), length 34)
    192.168.144.1.37394 > 226.3.2.1.9000: [bad udp cksum 0x34ce -> 0xd209!] UDP, length 6
15:07:52.620215 IP (tos 0x0, ttl 3, id 22758, offset 0, flags [DF], proto UDP (17), length 34)
    192.168.144.1.37394 > 226.3.2.1.9000: [bad udp cksum 0x34ce -> 0xd209!] UDP, length 6
15:07:52.747806 IP (tos 0x0, ttl 3, id 22783, offset 0, flags [DF], proto UDP (17), length 34)
    192.168.144.1.37394 > 226.3.2.1.9000: [bad udp cksum 0x34ce -> 0xd209!] UDP, length 6

ip地址

21:     br0
        link  33:33:00:00:00:01
        link  01:00:5e:00:00:6a
        link  33:33:00:00:00:6a
        link  01:00:5e:00:00:01
        link  01:00:5e:03:02:01
        inet  226.3.2.1
        inet  224.0.0.1
        inet  224.0.0.106
        inet6 ff02::6a
        inet6 ff02::1
        inet6 ff01::1
2324:   eth0
        link  33:33:00:00:00:01
        link  01:00:5e:00:00:01
        inet  224.0.0.1
        inet6 ff02::1
        inet6 ff01::1
2340:   eth1
        link  33:33:00:00:00:01
        link  01:00:5e:00:00:01
        link  01:00:5e:03:02:01
        inet  226.3.2.1
        inet  224.0.0.1
        inet6 ff02::1
        inet6 ff01::1

如果我在本地运行 iperf,服务器绑定到 br0,客户端绑定到 eth1,而没有任何 ip 路由,则 br0 上的服务器会接收流量。 (iperf -c 226.3.2.1%eth1 -u -T 32 -t 3 -i 1iperf -s -u -B 226.3.2.1%br0 -i 1

另外,如果我iperf -c 226.3.2.1%eth1 -u -T 32 -t 3 -i 1在服务器上和iperf -s -u -B 226.3.2.1%eth1 -i 1容器内运行 iperf,它会接收流量(这里的 eth1 是不同的接口)。

问题是我如何从 eth1->br0 转发

编辑:

网络环境

好的,所以我尝试提供更多背景信息。我使用 multus-cni 将多个网络接口附加到容器。容器内的这个附加接口称为 eth1,并与主机上的 br0 桥接(通过 cni 桥接插件)。

当前正在运行的一件事是,如果我在主机上的 eth1 接口上运行 iperf 客户端,并在容器上的 eth1 上运行 iperf 客户端,则会显示流量。

问题是主机上的 eth1->br0 部分,此多播流量不会被转发,因此无法访问 br0 接口。如果转发成功,我无法判断容器内是否可以访问它。

目前,如果我运行一个小的 python 脚本,它绑定在网络接口上并加入 226.3.2.1 多播组,它仅显示绑定到主机上的 eth1 的流量。使用 br0 它什么也不显示。

udp 数据包的 TTL 是 3,但如果需要我可以增加它。

答案1

因此,在完全重置我的测试环境并清除所有内容后,它开始工作。

  1. 我添加了一个桥接接口
ip link add br0 type bridge

# The ip addr add step is optional but otherwise 
# pimd will not recognize the interface as present.
ip addr add 10.10.0.1/16 brd + dev br0

ip link set up br0
  1. 编辑 pimd 配置/etc/pimd.conf附加以下内容:
phyint eth1 enable ttl-threshold 1
phyint br0 enable ttl-threshold 1
  1. 启动 pimdpimd --disable-vifs -l debug
  2. 在 kubernetes 集群内安装 multus-cni
  3. 创建桥接网络连接
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: udp-multicast-conf
  namespace: kube-system
spec:
  config: '{
      "cniVersion": "1.0.0",
      "type": "bridge",
      "bridge": "br0",
      "ipMasq": true,
      "isGateway": true,
      "hairpinMode": true,
      "ipam": {
          "type": "host-local",
          "subnet": "10.10.0.0/16"
      }
    }'
  1. k8s.v1.cni.cncf.io/networks: kube-system/udp-multicast-conf@eth1通过添加注释将桥连接到您的 pod 。

笔记

如果 br0 端有任何设备加入了特定的多播组,pimd 只会将 eth1 的流量路由到 br0 接口。对于多个网络接口,请确保加入右侧的多播组。默认实现将默认使用默认 ip 路由加入 nic。

参考:C/Python -> IP_ADD_MEMBERSHIP

相关内容