멀티캐스트 트래픽을 브리지 인터페이스로 전달

멀티캐스트 트래픽을 브리지 인터페이스로 전달

인터페이스 eth1에 도착하는 멀티캐스트 트래픽을 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

IP 라우팅 없이 br0에 바인딩된 서버와 eth1에 바인딩된 클라이언트를 사용하여 로컬로 iperf를 실행하면 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에서 어떻게 전달합니까?

편집하다:

웹 환경

좋습니다. 좀 더 자세한 내용을 제공하려고 합니다. multitus-cni를 사용하여 여러 네트워크 인터페이스를 컨테이너에 연결합니다. 컨테이너 내부의 이 추가 인터페이스는 eth1이라고 하며 호스트의 br0에 연결됩니다(cni 브리지 플러그인을 통해).

현재 작동 중인 한 가지는 호스트의 eth1 인터페이스에서 iperf 클라이언트를 실행하고 컨테이너의 eth1에서 iperf 클라이언트를 실행하면 트래픽이 표시된다는 것입니다.

문제는 호스트의 eth1->br0 부분입니다. 이 멀티캐스트 트래픽은 전달되지 않으므로 br0 인터페이스에 연결할 수 없습니다. 전달이 성공하면 컨테이너 내에서 액세스할 수 있는지 알 수 없습니다.

현재 네트워크 인터페이스에 바인딩하고 226.3.2.1 멀티캐스트 그룹에 참여하는 작은 Python 스크립트를 실행하면 호스트의 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. PIMD 시작pimd --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주석을 추가하여 브리지를 포드에 연결합니다.

노트

br0 끝에 있는 장치가 특정 멀티캐스트 그룹에 참여하면 pimd는 eth1 트래픽만 br0 인터페이스로 라우팅합니다. 다중 네트워크 인터페이스의 경우 오른쪽의 멀티캐스트 그룹에 가입해야 합니다. 기본 구현에서는 기본 IP 경로를 사용하여 기본적으로 nic에 연결합니다.

참조: C/Python -> IP_ADD_MEMBERSHIP

관련 정보