Por que meu firewall (iptables) interfere na minha bridge (brctl)?

Por que meu firewall (iptables) interfere na minha bridge (brctl)?

Configurei uma ponte br0"anexada" a duas interfaces:

  • eth0, minha interface física conectada à LAN real,
  • vnet0, uma interface virtual KVM (conectada a uma VM do Windows).

E eu tenho esta única regra de firewall na cadeia direta:

iptables -A FORWARD -j REJECT

Agora, o único ping que funciona é da VM para o host.

A br0interface possui o endereço IP da minha máquina host. eth0e vnet0não "possui" nenhum IP, do ponto de vista do host. A VM do Windows possui uma configuração de IP estático.

Se mudar minha iptablesregra para ACCEPT(ou até usar uma mais restritiva iptables -A FORWARD -o br0 -j ACCEPT), tudo estará funcionando bem! (ou seja, posso executar ping em qualquer máquina LAN da VM e vice-versa também).

Todas as opções do kernel de encaminhamento de IP estão desabilitadas (como net.ipv4.ip_forward = 0).

Então, como o firewall do netfilter pode bloquear algo que nem está habilitado?

Além disso, o tráfego VM-LAN deve implicar apenas eth0e vnet0. No entanto, parece que permitir o tráfego FORWARD com -o br0"funciona" (embora não verifiquei com muito cuidado).

Responder1

OComentede Stéphane Chazelas dá a dica para a resposta.

De acordo comPerguntas frequentes sobre Bridge-nfbridge-nf permite que iptables, ip6tables ou arptables vejam o tráfego em ponte.

A partir da versão 2.6.1 do kernel, existem cincoentradas sysctlpara controle comportamental bridge-nf:

  • bridge-nf-call-arptables- passar o tráfego ARP em ponte para a cadeia FORWARD dos arptables.
  • bridge-nf-call-iptables- passar tráfego IPv4 em ponte para cadeias de iptables.
  • bridge-nf-call-ip6tables- passar o tráfego IPv6 em ponte para as cadeias do ip6tables.
  • bridge-nf-filter-vlan-tagged- passar tráfego ARP/IP com tag vlan em ponte para arptables/iptables.
  • net.bridge.bridge-nf-filter-pppoe-tagged- passar tráfego IP/IPv6 marcado com pppoe para tabelas {ip,ip6}

Você pode desativar o bloqueio do firewall netfilter com:

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

informação relacionada