web-dev-qa-db-ja.com

Linuxブリッジのマルチキャストフレームが削除されました

VM libvirtを使用してx86ホストで実行しています。VMのインターフェースは次のように作成されます:

<interface type='bridge'>
      <mac address='52:54:00:d0:18:eb'/>
      <source bridge='intfe2'/>
      <target dev='vnet4'/>
      <model type='virtio'/>
      <alias name='net4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
    </interface>

intfe2 =次のようにホスト上に存在するLinuxブリッジ:

# brctl show intfe2
bridge name     bridge id               STP enabled     interfaces
intfe2          8000.90e2bab68ff8       no              enp2s0f0
                                                        vnet4

現在、LACPは、インターフェイスvnet4上のVM=内に構成されており、ホストマシンのインターフェイスenp2s0f0を使用する実際のルーター上に構成されています。

ホスト上のこれらの両方のインターフェイスからのマルチキャストフレームを確認できます。

# tcpdump -ni vnet4 -e
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vnet4, link-type EN10MB (Ethernet), capture size 262144 bytes
15:56:48.160017 34:30:b4:59:06:00 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
15:56:49.162163 34:30:b4:59:06:00 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110

# tcpdump -ni enp2s0f0 -e
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp2s0f0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:57:46.173002 ac:4b:c8:89:d7:c1 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
15:57:47.171282 ac:4b:c8:89:d7:c1 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
15:57:48.171252 ac:4b:c8:89:d7:c1 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110

私はUbuntu Xenialを実行しています:

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.2 LTS
Release:        16.04
Codename:       xenial

私の質問は:

  1. なぜ彼らは氾濫しないのですか?
  2. LinuxブリッジはL2マルチキャストフレームの転送を回避しますか?

Linux virtual-switchのマルチキャストフレーム のようないくつかのリンクから、次のようにIGMPスヌーピングを無効にしました。

echo "0" > /sys/devices/virtual/net/intfe2/bridge/multicast_snooping

/sys/devices/virtual/net/intfe2/bridge/multicast_querierの値も切り替える

ポインタはありますか?

2
Tanvir K

あなたが直面している問題は、デフォルトでは、Linuxブリッジがフレームを01:80:c2:00:00:00から01:80:c2:00:00の範囲の宛先MACアドレスに転送しないことだと思います:ff。 IEEEは、MACブリッジによって転送されてはならないプロトコル用にこのアドレスブロックを予約しました。 LLDP、LACP、xSTPなどのプロトコルはすべてこの範囲にあります。

素敵なIEEEの記事 here があります。私はあなたがそれを望んでいる、これらのフレームの転送を許可するためにブリッジカーネルモジュールを再コンパイルすることは可能ですが、あなた自身の危険でそうしてください! /net/bridge/br_private.hを編集して、BR_GROUPFWD_RESTRICTEDの#defineを0x0uに設定する必要があります。ドライバーをコンパイルして再ロードし、実行します。

echo 255 > /sys/class/net/<bridge_name>/bridge/group_fwd_mask

上記のコマンドは、LLDPだけでなく、スパニングツリーフレームも通過させることに注意してください。したがって、ブリッジングループを導入しないようにしてください。

1
TerpEE93

利用可能な情報であなたの設定を正確に理解するのは少し難しいです。しかし、私はあなたが私の見た目を比較できるように私のセットアップを提供します。ブリッジでのマルチキャストに不可欠なのはマルチキャストスヌーピングです。そのため、ブリッジはどのポートがマルチキャストグループに参加しているかを認識し、このポートにのみマルチキャストストリームを転送できます。 multicast_snoopingのデフォルト設定はオンです。だから私はそれを無効にしないでください。

ブリッジのインターフェースの設定を見ると、次のことがわかります。

Host ~$  Sudo bridge -d link show
3: enp1s0 state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 4
    hairpin off guard off root_block off fastleave on learning on flood on mcast_flood on
5: vnet0 state UNKNOWN : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100
    hairpin off guard off root_block off fastleave on learning on flood off mcast_flood on

重要なのはmcast_flood onこれはデフォルト設定です。 fastleave onは便利ですが、マルチキャストには必要ありません。これは、ゲストがグループを離れた場合に、ブリッジでタイムアウトなしにマルチキャストグループを離れるためのものです。 flood on/offはユニキャストに属しており、ここでは関係ありません。

ゲストがマルチキャストグループに参加すると(マルチキャストクライアントプログラムを開始)、ブリッジはそれをスヌーピングし、マルチキャストデータベース(mdb)に追加します。私はそれをチェックします:

Host ~$ Sudo bridge -d -s mdb show
dev br0 port vnet0 grp 239.255.255.250 temp  vid 10 257.14
router ports on br0: enp1s0  238.17 temp

私はupnpクライアント(grp 239.255.255.250)を実行しているだけで、VLAN 10を使用します。ゲストは、IGMP REPORTを送信しないと、257.14秒間マルチキャストグループに残ります。 。ブリッジは、次のマルチキャストルーター(ソース)がポートenp1sにあることを確認し、ソースが以前にigmpクエリを送信しなかった場合、238.17秒後にそれをキックアウトします。

実行中のマルチキャストストリームで、次のigmpメッセージが表示されます。

Host ~$ Sudo tcpdump -i vnet0 -n igmp
18:38:59.628249 IP 192.168.10.2 > 224.0.0.1: igmp query v3
18:39:02.502110 IP 192.168.10.106 > 224.0.0.22: igmp v3 report, 2 group record(s)
18:41:04.647731 IP 192.168.10.2 > 224.0.0.1: igmp query v3
18:41:13.061858 IP 192.168.10.106 > 224.0.0.22: igmp v3 report, 2 group record(s)
18:43:09.637111 IP 192.168.10.2 > 224.0.0.1: igmp query v3
18:43:19.525836 IP 192.168.10.106 > 224.0.0.22: igmp v3 report, 2 group record(s)
...

192.168.10.2は私のインターネットルーター(マルチキャストソース)で、192.168.10.106はストリーミングクライアントを持つゲストです。

0
Ingo