멀티캐스트 프레임이 Linux 브리지에서 삭제됩니다.

멀티캐스트 프레임이 Linux 브리지에서 삭제됩니다.

libvirt다음과 같이 생성된 .VM 인터페이스를 사용하여 x86 호스트에서 실행되는 가상 머신이 있습니다 .

<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호스트 인터페이스를 사용하여 실제 라우터에도 동일한 구성이 구성됩니다.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 가상 스위치의 멀티캐스트 프레임나는 다음과 같이 IGMP 스누핑을 비활성화했습니다.

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

다음 값을 전환할 수도 있습니다./sys/devices/virtual/net/intfe2/bridge/multicast_querier

어떤 충고?

답변1

내 생각에 당신이 겪고 있는 문제는 기본적으로 Linux 브리지가 01:80:c2:00:00:00 ~ 01:80:c2:00:00:0f 범위의 대상 MAC 주소로 프레임을 전달하지 않는다는 것입니다. IEEE는 MAC 브리지에 의해 전달되어서는 안 되는 프로토콜을 위해 이 주소 블록을 예약합니다. LLDP, LACP, xSTP 및 기타 프로토콜이 이 범위 내에 있습니다.

IEEE에는 훌륭한 기사가 있습니다.표준 그룹 MAC 주소: 튜토리얼 가이드. 원하는 경우 브리지 커널 모듈을 다시 컴파일하여 이러한 프레임의 전달을 허용할 수 있지만 그렇게 할 때 발생하는 위험은 사용자 본인의 책임입니다! 을(를) 편집하고 <source_path>/net/bridge/br_private.h설정 해야 합니다 . 드라이버를 컴파일하고 다시 로드한 후 다음을 실행합니다.#defineBR_GROUPFWD_RESTRICTED0x0u

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

이를 통해 LLDP를 통과할 수 있을 뿐만 아니라 스패닝 트리 프레임도 허용할 수 있습니다. 따라서 브리징 루프를 도입하지 않도록 하십시오!

답변2

사용 가능한 정보로는 귀하의 설정이 무엇인지 정확히 이해하기가 약간 어렵습니다. 하지만 여러분이 보고 비교할 수 있도록 설정을 알려 드리겠습니다. 브리지의 멀티캐스트에서 중요한 것은 멀티캐스트 수신입니다. 따라서 브리지는 어느 포트가 멀티캐스트 그룹에 합류했는지 알고 멀티캐스트 스트림을 해당 포트에만 전달할 수 있습니다. 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초 동안 멀티캐스트 그룹에 유지됩니다. 브리지는 다음 멀티캐스트 라우터(소스)가 포트에 있음을 발견합니다.enpu1s0소스가 이전에 igmp QUERY를 전송하지 않은 경우 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은 스트리밍 클라이언트의 게스트입니다.

관련 정보