DNAT do host local (127.0.0.1)

3

Eu gostaria de configurar um DNAT TCP de 127.0.0.1, porta 4242 a 11.22.33.44, porta 5353 no Linux 3.x (atualmente 3.2.52, mas posso atualizar se necessário).

Parece que a configuração simples da regra DNAT não funciona, telnet 127.0.0.1 4242 trava por um minuto em Trying 127.0.0.1... e depois expira. Talvez seja porque o kernel está descartando os pacotes de retorno (por exemplo, SYN + ACK), porque os considera marcianos. Eu não preciso de uma explicação porque a solução simples não funciona, eu preciso de uma solução, mesmo que seja complicada (por exemplo, envolve a criação de regras).

Eu poderia configurar um DNAT normal de outro endereço IP local, fora da rede 127.0.0.0/8 , mas agora preciso 127.0.0.1 como o endereço de destino. Eu sei que posso configurar um processo de encaminhamento de portas em nível de usuário, mas agora preciso de uma solução que possa ser configurada usando iptables e não precise de processos auxiliares.

Eu estava pesquisando por uma hora. Foi perguntado várias vezes, mas não encontrei nenhuma solução de trabalho.

Também há muitas perguntas sobre o DNAT para 127.0.0.1, mas eu não preciso disso, eu preciso do oposto.

Por favor, note que uma única regra iptables -j REDIRECT não funcionaria, porque eu preciso alterar o endereço IP do pacote de saída de 127.0.0.1 para 11.22.33.44, e -j REDIRECT não pode alterar o endereço IP.

    
por pts 07.11.2013 / 22:02

3 respostas

4

Isso funciona para mim, roteando o tráfego de localhost:8081 para 172.17.0.1:80 , onde 172.17.0.1 é um veth por trás da interface da ponte chamada docker0 .

sysctl -w net.ipv4.conf.docker0.route_localnet=1
iptables -t nat -A OUTPUT -o lo -p tcp -m tcp --dport 8081 -j DNAT --to-destination 172.17.0.1:80
iptables -t nat -A POSTROUTING -o docker0 -m addrtype --src-type LOCAL --dst-type UNICAST -j MASQUERADE

Uma peça fundamental do quebra-cabeça é a regra MASQUERADE .

Mais inspiração:

por 30.03.2016 / 18:33
3

Você terá que executar os três comandos a seguir para que funcione:

iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 4242 -j DNAT --to 11.22.33.44:5353
sysctl -w net.ipv4.conf.eth0.route_localnet=1
iptables -t nat -A POSTROUTING -p tcp -s 127.0.0.1 -d 11.22.33.44 --dport 5353 -j SNAT --to $your-eth0-ip

Aqui está a explicação detalhada.

O primeiro comando fará o DNAT como esperado. No entanto, se você tentar capturar pacotes apenas com este conjunto de regras, verá que não recebe nada:

tcpdump -i any -n port 5353

Isso ocorre porque o kernel do Linux descarta esse tipo de pacote por padrão, se o pacote tiver 127.0.0.0/8 como uma extremidade e um endereço IP externo como a outra extremidade.

O segundo comando altera o parâmetro do kernel, para permitir que esse tipo de pacote passe (é claro, você deve alterar eth0 de acordo). Depois disso, quando você capturar o pacote no eth0, você verá os pacotes enviados, mas com o endereço de origem 127.0.0.1 e o endereço de destino 11.22.33.44 . Se este pacote pode ou não atingir o servidor de destino (os roteadores intermediários descartarão esse pacote), não há como esse pacote retornar. Portanto, você deve adicionar uma regra SNAT para alterar o endereço de origem para sua eth0. E agora deve funcionar.

    
por 12.04.2018 / 11:54
1

É algo assim que você precisa? O redirecionamento de porta do iptables não funciona para o host local

iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 443 -j REDIRECT --to-ports 8080

Adrien

    
por 07.11.2013 / 23:09