Criando um NAT de loopback para um servidor remoto

5

Meu objetivo é redirecionar conexões do host local para um servidor remoto e ser capaz de alterar o endereço remoto em tempo real, sem nenhuma alteração na configuração do cliente. Eu posso fazer isso agora usando um nat na interface externa da seguinte forma:

LOCAL_IP=10.1.1.10
LOCAL_PORT=8888
REMOTE_IP=10.1.1.11
REMOTE_PORT=9999

iptables -t nat -A OUTPUT -p tcp -d $LOCAL_IP --dport $LOCAL_PORT -j DNAT --to-destination $REMOTE_IP:$REMOTE_PORT
iptables -t nat -A POSTROUTING -p tcp -d $REMOTE_IP --dport $REMOTE_PORT -j SNAT --to-source $LOCAL_IP

Isso funciona bem, mas ainda associa a configuração do cliente ao endereço IP do host. O que seria realmente bom, é poder passar o tráfego NAT para 127.0.0.1:8888 , para 10.1.1.11:9999 . Isso parece algo que deve ser possível usando uma combinação DNAT / SNAT | MASQUERADE, mas ainda não encontrei uma configuração de trabalho. Quaisquer configurações que eu tente parecem deixar os pacotes silenciosamente (possivelmente capturados pelas regras marcianas? Eu tenho o ip_forward ativado).

    
por JimB 02.11.2012 / 17:04

1 resposta

3

O problema é que o Linux trata qualquer coisa dentro de 127.0.0.0/8 como sendo local, e até responde (tente pingar 127.99.88.77).

O que isto significa é que o pacote é originalmente transmitido na saída como o pacote está "deixando" lo . Quando "entra" vai para a cadeia INPUT (eu segui para ter certeza). É aqui que sua situação é quebrada.

Cadeias de roteamento PRE / POST de lado, nos pacotes Linux destinados ao sistema, irá atravessar apenas a cadeia INPUT. Os pacotes originados no sistema percorrerão somente a cadeia OUTPUT. Os pacotes que não são originados nem destinados ao sistema local irão percorrer apenas a cadeia FORWARD.

Então, o que você tem é que o Linux está selecionando a cadeia INPUT quando você quer que ela esteja selecionando a cadeia FORWARD.

Eu tentei algumas opções diferentes e também não consegui fazê-lo funcionar, mas sei definitivamente por que não está funcionando. Vou tentar ver isso mais tarde, quando tiver mais tempo.

P.S. No começo eu pensei que você simplesmente tinha um problema de roteador (e no fundo eu ainda sinto que o roteamento está envolvido). Traduzir os IPs em lo fora de 127.0.0.1 causará uma violação de roteamento que pode descartar pacotes de forma silenciosa. Para desabilitar isso, você precisa definir rp_filter=0 . Você ainda precisará fazer isso antes de poder fazê-lo funcionar, mas essa não é a raiz do problema. A questão principal é que o Linux está usando INPUT quando você quer OUTPUT.

    
por 02.11.2012 / 22:13