Estou procurando um caminho em iptables
para corresponder aos pacotes encaminhados em que o endereço de origem é na mesma rede que o endereço de destino, sem especificar a rede .
Claro, quando eu especificar a rede, isso é simples:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.0/24
Mas digamos que eu queira fazer isso para qualquer rede de classe C (e eu não quero especificar todos eles, obviamente).
Eu olhei para a correspondência rpfilter
, mas de acordo com a página de manual:
This match can only be used in the PREROUTING chain of the raw or mangle table.
Então isso não tem utilidade para mim.
A correspondência u32
parece promissora, mas é muito complexa, não entendo.
Eu tentei uma abordagem diferente: combinar os pacotes que saem na mesma interface em que eles entraram, assim:
iptables -t nat -A POSTROUTING -i eth0 -o eth0
mas isso também não funciona, pois -i
não pode ser usado na cadeia POSTROUTING:
iptables v1.4.21: Can't use -i with POSTROUTING
Uma solução em que pensei é usar marcação de pacotes: marcar pacotes que chegam em eth0
e corresponder à interface de saída e à marca na cadeia POSTROUTING, da seguinte forma:
iptables -t mangle -A PREROUTING -i eth0 -j MARK --set-mark 0x01/0xff
iptables -t nat -A POSTROUTING -o eth -m mark --mark 0x01/0xff
Isso funciona na maioria dos casos, com base na suposição de que você executa apenas uma rede em uma determinada interface, mas não exatamente o que eu quero, pois funciona em interfaces e não em redes.
Então, o problema ainda não foi resolvido. Eu não estou procurando uma solução de trabalho completa, mas para conselhos sobre uma maneira de resolver isso que eu perdi. Obrigado!
-EDIT -
A razão pela qual eu preciso disso é a seguinte. Eu tenho multihomed host linux, vamos chamá-lo de alice. Alice tem uma interface eth0 e Bob e Charly são os hosts dessa rede. Algumas portas no Alice são encaminhadas com as regras DNAT do iptables. Vamos dizer que eu encaminho a porta tcp 456 de Alice para a porta 456 em Bob. Eu quero que esse encaminhamento funcione também para o tráfego proveniente de hosts no eth0. Com apenas a regra DNAT em vigor, um pacote enviado por Charly para a porta Alice 456 é encaminhado para Bob, o bit seu endereço de origem permanece o da Charly. Assim, o pacote de retorno é enviado diretamente por Bob para Charly, o que torna o fluxo de tráfego não simétrico.
Para corrigir isso, quero SNAT este tráfego em Alice. Então, se o tráfego deixar Alice, tiver um endereço de destino em eth0 e um endereço de origem na rede eth0 (mas não em Alice), preciso SNAT it.
Isso não é difícil de fazer se você especificar os intervalos de endereços. Mas agora eu tenho várias interfaces, e gostaria de fazer isso genericamente.