Roteamento
A principal maneira de decidir onde os pacotes do kernel é a tabela de roteamento ( ip route
e amigos), não as regras de firewall ( iptables
, nftables
). Depois que você habilitar o encaminhamento de IP com net.ipv4.ip_forward = 1
, o kernel processará os pacotes recebidos pela tabela de roteamento e os enviará de volta. Então, se você quiser que o tráfego para 10.0.0.2 passe pela eth0, independentemente de onde ele veio:
ip route add 10.0.0.2/32 dev eth0
Agora, por padrão, quando o kernel vê o tráfego chegando na eth0 e voltando à mesma coisa, ele envia um redirecionamento de ICMP para dizer à máquina de origem: "Ei, isso é ineficiente! Envie-a diretamente!" Você precisa desativar isso ( net.ipv4.conf.eth0.send_redirects = 0
) Ele também verifica o endereço de origem para garantir que ele veio de onde esperava; talvez seja necessário desativá-lo também ( net.ipv4.conf.eth0.rp_filter = 0
).
Como isso passa pelo maquinário de roteamento do kernel, coisas obrigatórias como diminuir o IP TTL serão feitas. Mas coisas como o endereço IP de origem e destino não são alterados.
Roteamento + NAT
Se você também precisar que os endereços IP de origem ou de destino sejam alterados, adicione NAT por cima. Por exemplo, se você precisar que o endereço IP de origem seja esta máquina, adicione seu:
iptables -t nat -A POSTROUTING --out-interface eth0 -j MASQUERADE
Observe que, a menos que você tenha alterado o padrão, o FORWARD já deve aceitar. Caso contrário, você pode adicionar sua regra (ou, alternativamente, alterar o padrão).
NAT + Roteamento
Você também pode alterar o endereço IP de destino quando o pacote chegar, o que mudará como ele é roteado (porque essa alteração é feita antes que o roteamento o veja). Isso parece:
iptables -t nat -A PREROUTING -s 10.0.0.1 -j DNAT --to-dest 10.0.0.2
Observe que você não pode usar --out-interface
aqui porque a interface externa não é conhecida até depois do roteamento. Você pode usar --in-interface
embora.