Encontrei a resposta! O Linux ethernet bridge consulta ebtables para decidir quais pacotes encaminhar e quais serão descartados. Flushing ebtables resolveu meu problema.
Eu tenho pesquisado esse problema por alguns dias e ainda não encontrei uma resposta. Sua ajuda será muito apreciada!
Eu tenho algumas VMs (máquinas virtuais) em execução em um servidor físico. O servidor usa o Linux bridge (br100) para conectar essas VMs em conjunto:
# brctl show
bridge name bridge id STP enabled interfaces
br100 8000.984be15fe7e3 no eth1.1729
vnet0
vnet1
vnet0 e vnet1 são NICs virtuais de VMs.
br100 (servidor físico) é atribuído ao IP 172.16.0.11. A VM conectada ao vnet1 é atribuída a 172.16.0.3, a que o vnet0 é 172.16.0.5.
Até aí tudo bem. 172.16.0.3 pode pingar 172.16.0.5 sem problemas.
Agora estou tentando configurar o 172.16.0.3 como um roteador (servidor openvpn, se isso for importante) para a sub-rede 10.8.0.0/16.
Aí vem o meu problema: máquinas em 10.8.0.0/16 (neste caso 10.8.0.6) podem fazer ping para 172.16.0.3, mas não conseguem fazer ping em 172.16.0.5.
(eu acho) descartei todas as causas óbvias: ip_forward ativado, iptables liberado, etc. Agora eu reduzi a causa para: br100 não está encaminhando pacotes como deveria!
Quando faço ping de 172.16.0.5 a partir de 10.8.0.6, os pacotes foram entregues no vnet1 (VM 172.16.0.3) no servidor físico:
# tcpdump -leni vnet1 icmp
tcpdump: WARNING: vnet1: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vnet1, link-type EN10MB (Ethernet), capture size 65535 bytes
07:45:03.858356 02:16:3e:6a:42:57 > 02:16:3e:02:40:82, ethertype IPv4 (0x0800), length 98:
10.8.0.6 > 172.16.0.5: ICMP echo request, id 63242, seq 1046, length 64
07:45:04.858239 02:16:3e:6a:42:57 > 02:16:3e:02:40:82, ethertype IPv4 (0x0800), length 98:
10.8.0.6 > 172.16.0.5: ICMP echo request, id 63242, seq 1047, length 64
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel
Mas não são encaminhados para vnet0 (172.16.0.5):
# tcpdump -leni vnet0 icmp
tcpdump: WARNING: vnet0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vnet0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel
Também segui os conselhos em este post e defini 0 como / proc / sys / net / bridge / bridge nf- *, mas não parece ajudar.
Além de descarregar filtros do iptables, eu também ativei o TRACE no iptables, o que mostrou que esses pacotes nunca atingem o iptables.
Quaisquer outras razões pelas quais o Linux bridge não encaminharia pacotes entre portas?