我正在尝试将到达接口 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 1
和iperf -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
因此,在完全重置我的测试环境并清除所有内容后,它开始工作。
- 我添加了一个桥接接口
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
- 编辑 pimd 配置/etc/pimd.conf附加以下内容:
phyint eth1 enable ttl-threshold 1
phyint br0 enable ttl-threshold 1
- 启动 pimd
pimd --disable-vifs -l debug
- 在 kubernetes 集群内安装 multus-cni
- 创建桥接网络连接
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"
}
}'
k8s.v1.cni.cncf.io/networks: kube-system/udp-multicast-conf@eth1
通过添加注释将桥连接到您的 pod 。
笔记
如果 br0 端有任何设备加入了特定的多播组,pimd 只会将 eth1 的流量路由到 br0 接口。对于多个网络接口,请确保加入右侧的多播组。默认实现将默认使用默认 ip 路由加入 nic。
参考:C/Python -> IP_ADD_MEMBERSHIP