マルチキャストトラフィックをブリッジインターフェイスに転送する

マルチキャストトラフィックをブリッジインターフェイスに転送する

インターフェイス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でどのように渡しますか?

編集する:

Web環境

いいですね。もっと詳細を提供したいと思います。 multitus-cniを使用して、複数のネットワークインターフェイスをコンテナに接続します。コンテナ内のこの追加インターフェイスはeth1と呼ばれ、ホストのbr0に接続されます(cniブリッジプラグインを介して)。

現在動作していることの1つは、ホストの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

関連情報