IP 패킷을 전달하지 않지만 ARP를 전달하는 가상 머신용 Linux 브리지

IP 패킷을 전달하지 않지만 ARP를 전달하는 가상 머신용 Linux 브리지

커널: 5.5.8-arch1-1

물리적 인터페이스에 연결된 브리지를 사용하여 가상 네트워킹을 작동시키려고 합니다. 이것은 일반적인 설정입니다. 아무것도 시도하지도 않습니다.기이한.

  • 다리:br0
  • 물리 인터페이스:enp6s0f0

문제는 Linux가 IP 트래픽을 물리적 인터페이스 밖으로 전달하지 않는다는 것입니다. 전달중이에요ARP 트래픽ARP 확인이 작동하므로 양방향으로 작동하지만 IP 트래픽은 전송되지 않습니다.enp6s0f0에서 전송됨.

내가 시도한 것들:

  • enp6s0f1브리지에 추가 , enp7s0f0VM에 제공, 케이블을 사용하여 enp7s0f0연결enp6s0f1
    • 동일한 결과(ARP 트래픽은 전달되고 IP 트래픽은 전달되지 않음)
  • 도커 중지 및 모든 테이블 플러시
    • 변경 없음
  • rp_filter 비활성화
    • 변경 없음
  • 온보드 NIC 사용
    • 변경 사항 없음(실제로는 초기 설정이었고 온보드 NIC가 문제를 일으키는지 확인하기 위해 이 쿼드 포트 카드를 넣었습니다)
  • 다른 머신에서 VM을 핑하는 중
    • 에코 요청이 오는 것을 볼 수 있었습니다~에볼 수는 있지만 VM 포트(vnet 포트 또는 ) br0로 전달되지 않았습니다.enp6s0f1
  • 브리지에서 STP 활성화(처음에는 비활성화됨)
    • 변경 없음
○ → ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp6s0f0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
    link/ether 00:10:18:85:1c:c0 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::210:18ff:fe85:1cc0/64 scope link 
       valid_lft forever preferred_lft forever
3: enp6s0f1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:10:18:85:1c:c2 brd ff:ff:ff:ff:ff:ff
4: enp7s0f0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:10:18:85:1c:c4 brd ff:ff:ff:ff:ff:ff
5: enp7s0f1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:10:18:85:1c:c6 brd ff:ff:ff:ff:ff:ff
6: enp9s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether b4:2e:99:a6:22:f9 brd ff:ff:ff:ff:ff:ff
7: wlp8s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 08:71:90:4e:e9:77 brd ff:ff:ff:ff:ff:ff
8: br-183e1a17d7f6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:ba:03:e1:9d brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-183e1a17d7f6
       valid_lft forever preferred_lft forever
9: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:02:61:00:66 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
10: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:10:18:85:1c:c0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.205/24 brd 192.168.1.255 scope global dynamic noprefixroute br0
       valid_lft 9730sec preferred_lft 7930sec
    inet6 fe80::210:18ff:fe85:1cc0/64 scope link 
       valid_lft forever preferred_lft forever
11: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UNKNOWN group default qlen 1000
    link/ether fe:54:00:be:eb:3e brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:febe:eb3e/64 scope link 
       valid_lft forever preferred_lft forever

○ → brctl showstp br0
br0
 bridge id      8000.001018851cc0
 designated root    1000.44e4d9d88a00
 root port         1            path cost          4
 max age          19.99         bridge max age        19.99
 hello time        1.99         bridge hello time      1.99
 forward delay        14.99         bridge forward delay      14.99
 ageing time         299.99
 hello timer           0.00         tcn timer          0.00
 topology change timer     0.00         gc timer          25.78
 flags          


enp6s0f0 (1)
 port id        8001            state            forwarding
 designated root    1000.44e4d9d88a00   path cost          4
 designated bridge  1000.44e4d9d88a00   message age timer     19.21
 designated port    800d            forward delay timer    0.00
 designated cost       0            hold timer         0.00
 flags          

vnet0 (2)
 port id        8002            state            forwarding
 designated root    1000.44e4d9d88a00   path cost        100
 designated bridge  8000.001018851cc0   message age timer      0.00
 designated port    8002            forward delay timer    0.00
 designated cost       4            hold timer         0.22
 flags          

○ → bridge -d link show
2: enp6s0f0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 4 
    hairpin off guard off root_block off fastleave off learning on flood on mcast_flood on mcast_to_unicast off neigh_suppress off vlan_tunnel off isolated off enp6s0f0
8: br-183e1a17d7f6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 master br-183e1a17d7f6 br-183e1a17d7f6
9: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 master docker0 docker0
10: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 br0
11: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100 
    hairpin off guard off root_block off fastleave off learning on flood on mcast_flood on mcast_to_unicast off neigh_suppress off vlan_tunnel off isolated off vnet0

○ → sysctl net.bridge.bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 1

○ → sysctl net.ipv4.conf.br0.forwarding
net.ipv4.conf.br0.forwarding = 1

답변1

도커잔뜩그만큼br_netfilter모듈(얻기 위해sysctl속성 net.bridge.bridge-nf-call-iptables=1) iptables를 사용할 때. 이것은 만든다브리지된프레임(이더넷, 레이어 2)iptables필터링(IP, 계층 3):

브리지넷필터란 무엇인가요?

Linux 커널 3.18-rc1부터 br_netfilter를 modprobe하여 bridge-netfilter를 활성화해야 합니다.

bridge-netfilter 코드는 다음 기능을 활성화합니다.

{Ip,Ip6,Arp} 테이블은 브리지된 IPv4/IPv6/ARP 패킷을 필터링할 수 있습니다., 802.1Q VLAN 또는 PPPoE 헤더에 캡슐화된 경우에도 마찬가지입니다. 이는 상태 저장 투명 방화벽의 기능을 활성화합니다. 따라서 3개 도구의 모든 필터링, 로깅 및 NAT 기능을 브리지 프레임에서 사용할 수 있습니다. 따라서 ebtables와 결합된 bridge-nf 코드는 Linux를 매우 강력한 투명 방화벽으로 만듭니다. 이는 투명한 가장 머신(즉, 모든 로컬 호스트가 자신이 인터넷에 직접 연결되어 있다고 생각하는)의 생성을 가능하게 합니다. {ip,ip6,arp} 테이블에 브리지된 트래픽이 표시되도록 허용하는 것은 적절한 proc 항목을 사용하여 비활성화하거나 활성화할 수 있습니다., 에 위치한 /proc/sys/net/bridge/:

  • bridge-nf-call-arptables

  • bridge-nf-call-iptables

  • bridge-nf-call-ip6tables

이 모듈로 인해 발생하는 부작용을 설명하는 문서가 있습니다. 그 부작용은예정된브리지 투명 방화벽에 사용할 때. 또한,iptables physdev( br_netfilter자체가 로드될 때 로드됨) 일치가 없으면 제대로 작동할 수 없습니다(단순히 더 이상 일치하지 않습니다). 특히 다음과 같은 경우에 그 영향을 방지하는 방법도 설명되어 있습니다.7장:

br-nf 코드로 인해 프레임/패킷이 지정된 3개의 iptables 체인을 통과할 수 있는 방법은 두 가지가 있습니다.첫 번째 방법은 프레임이 브리지되는 경우이므로 브리지 코드에 의해 iptables 체인이 호출됩니다.. 두 번째 방법은 패킷이 라우팅되는 경우입니다.

통화를 비활성화하는 대신iptables님 의 br_netfilter코드는 다음과 같습니다.

sysctl -w net.bridge.bridge-nf-call-iptables=0

적응해야 해iptables예를 들어 라우팅이 아닌 브리징을 위한 FORWARD 체인에 허용 규칙을 추가하여 부작용을 피하기 위해 7장에 설명된 대로(네트워크 네임스페이스가 무엇이든 포함) 규칙을 적용합니다. 하나의 문제를 해결하기 위해 이를 비활성화하면 Docker의 내부 컨테이너 격리부터 시작하여 이에 의존하는 애플리케이션이 중단됩니다.

최근까지~에 커널 5.3이 모듈은 네임스페이스를 인식하지 못했으며 갑자기 로드되어 모든 네트워크 네임스페이스에서 활성화되어 예상치 못한 경우 모든 종류의 문제를 일으켰습니다. 또한 그 이후로는 ip link set dev BRIDGE type bridge nf_call_iptables 1네임스페이스가 아닌 브리지( )별로 활성화하는 것이 가능해졌습니다 .

도구(Docker...)와 커널(>= 5.3)이 진화를 따른다면 단순히 선택한 네트워크 네임스페이스와 브리지에서 활성화하는 것만으로도 충분하지만 현재는 그렇지 않을 것입니다. 또한커널 5.3또한 다음에서 사용할 수 있는 기본 브리지 상태 저장 방화벽을 상속받았습니다.nftables이는 이 모듈의 사용을 더 이상 사용하지 않는 단계입니다(VLAN 및 PPPoE에 대한 브리지에서 직접 캡슐화/캡슐화 해제 지원이 사용 가능해지면).

넷필터

브리지에 대한 기본 연결 추적 지원을 추가합니다. 이 패치 세트 이전에는 사람들이 상태 기반 필터링을 수행할 수 있는 유일한 기회는 br_netfilter 에뮬레이션 레이어를 사용하는 것이었습니다. 이는 더 이상 사용되지 않는 단계입니다.

관련 정보