Esta pergunta foi feita inúmeras vezes. Algumas semanas atrás, consegui fazer isso funcionar entre esta postagem ServerFault e esta postagem no blog Digital Ocean . Eu devo estar perdendo algo simples.
Meu objetivo é simplesmente encaminhar pacotes entre duas interfaces que realizam NAT ao longo do caminho. Especificamente, desejo encaminhar pacotes entre uma interface pública e uma NIC USB externa.
Verifiquei se o Kernel estava configurado para permitir o encaminhamento de porta:
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
Além das configurações de encaminhamento específicas da interface:
net.ipv4.conf.enp0s20u4u3.forwarding = 1
net.ipv4.conf.eno1.forwarding = 1
As regras iptables
que criei são:
iptables -t nat -A PREROUTING -i eno1 --protocol tcp --destination-port 10000 -j DNAT --to-destination 192.168.10.2:1234
iptables -A FORWARD -i eno1 -o enp0s20u4u3 --protocol tcp --destination-port 1234 -j ACCEPT
iptables -t nat -A POSTROUTING -o enp0s20u4u3 --protocol tcp --source 192.168.10.2 --source-port 1234 -j SNAT --to-source 192.168.10.1
Tentei testar essa configuração tentando estabelecer uma conexão TCP pela porta 10000 (se meu IP externo fosse 192.168.2.50).
$ nc -v 192.168.2.50 10000
nc: connect to 192.168.2.50 port 10000 (tcp) failed: Connection refused
Esse comportamento faz sentido se minhas entradas de regra estiverem incorretas. Então, eu despejei as estatísticas da regra
$ iptables -t nat -L -v
Chain PREROUTING (policy ACCEPT 15 packets, 2885 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- eno1 any anywhere anywhere tcp dpt:ndmp to:192.168.10.2:1234
Chain INPUT (policy ACCEPT 15 packets, 2885 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT tcp -- any enp0s20u4u3 192.168.10.2 anywhere tcp spt:search-agent to:192.168.10.1
Portanto, os pacotes TCP de entrada não estão correspondendo à primeira regra de PREROUTING
da cadeia. Não tenho certeza de onde está o erro; a primeira regra é tão simples. A ideia é:
O tráfego de entrada para 192.168.2.50:10000 recebe NAT para 192.168.10.2:1234 em uma interface privada.