Razões para o comportamento observado
O motivo pelo qual o iptables não obtém as informações da bridge física quando o pacote chega de uma interface sem ponte é que o pacote nunca esteve perto do mecanismo de bridging, embora neste ponto nós saibamos que estamos enviando o pacote a ponte.
No caso em que o pacote chegou através de uma porta de bridge, mas é uma ponte N > 2, o problema é que a extensão do PHYSDEV do iptables só fornece um valor para "out", então não faz nada Não nos incomodamos em dizer se há dois.
Solução
Use ebtables em vez de iptables. O ebtables OUTPUT
chain saberá em qual interface física em ponte ele está enviando pacotes.
No cenário acima, onde você deseja filtrar os pacotes que saem por meio de uma interface específica em ponte ( eth0
), independentemente de como ela chegou ao sistema, adicione uma regra de ebtables nas seguintes linhas:
-A OUTPUT -o eth0 -j <target>
Em um cenário mais complexo, onde você deseja filtrar pacotes que chegam de uma interface específica e sair por uma interface em ponte, fica mais difícil. Digamos que queremos descartar todo o tráfego de eth2
(sem ponte) para eth0
(como parte de br0
) precisamos adicionar essa regra a iptables :
-A FORWARD -i eth2 -o br0 -j MARK --set-mark 1234
Isso marcará qualquer pacote que venha de eth2
e esteja vinculado à ponte. Em seguida, adicionamos essa regra a ebtables :
-A OUTPUT -physdev-out eth0 --m mark --mark 1234 -j DROP
Qual será DROP
de qualquer pacote marcado pelo iptables (como sendo de eth2
) que está saindo através da porta de ponte específica eth0
.
Agradecimentos
Obrigado a Pascal Hambourg na lista de discussão do iptables do netfilter por sua ajuda na criação desta solução.