Resposta curta à sua pergunta revisada é que existem duas maneiras de fazer isso; ambos exigem que você remova a segunda etapa do NAT (que destrói as informações que você está procurando). Suas opções depois de fazer isso são:
1) Torne o Servidor A o próximo salto para o Servidor B para o tráfego em questão, e é por isso que ele funciona para o seu roteador como mencionado. Isso pode ser feito, em ordem de cludagem, tornando o servidor A a rota padrão para o Servidor B ou usando roteamento de políticas , ou usando alguns iptables sofisticados , ou usando um túnel de algum tipo.
2) "Manualmente" invertendo NAT do servidor A no servidor B, resultando em fluxo de tráfego assimétrico (geralmente desencorajado). Algo como iptables -t nat -I POSTROUTING -j SNAT -s 2.2.2.3 --to 1.1.1.3
Estou 100% confiante na opção (1). Tenho cerca de 90% de confiança em (2).
Para entender isso, você precisa entender o fluxo de tráfego.
- O cliente X envia um pacote para o 1.1.1.3.
- Servidor A NATs o destino desse pacote para 2.2.2.3 pré-roteamento, em seguida, roteia o tráfego para 2.2.2.3, então NATs a origem desse pacote para 1.1.1.3 pós-roteamento, então envia o pacote para o Servidor B .
- O servidor B recebe o pacote no 2.2.2.3 e vê um endereço de origem de 1.1.1.3, conforme a segunda etapa do NAT. Ele processa o pacote e envia a resposta de volta à sua origem (1.1.1.3).
- O servidor A recebe o pacote no 1.1.1.3, inverte o NAT de origem, encaminha o pacote, inverte o NAT de destino e envia o pacote de volta ao cliente X.
- O cliente X recebe a resposta de 1.1.1.3
Agora vamos imaginar o que aconteceria se você não tivesse o segundo NAT:
- O cliente X envia um pacote para o 1.1.1.3.
- Servidor A NATs o destino desse pacote para 2.2.2.3 pré-roteamento, em seguida, encaminha o tráfego para 2.2.2.3, mas deixa o endereço de origem como X quando envia o pacote para o Servidor B.
- O servidor B recebe o pacote no 2.2.2.3 e vê um endereço de origem do X. Ele processa o pacote e envia a resposta de volta à sua origem X.
- O cliente X recebe a resposta do 2.2.2.3 e descarta porque não sabe 2.2.2.3 de Adam!
Para que o Cliente X entenda o pacote, ele precisa chegar ao Cliente X com o mesmo endereço de origem que o destino do pacote original.
A maneira normal de isso acontecer é que o Servidor B tenha a oportunidade de reverter o NAT de pré-roteamento. Para que isso aconteça, você precisa que o pacote retorne posteriormente. Atualmente, você faz isso alterando o endereço de origem do pacote, mas isso destrói as informações que você está solicitando na sua pergunta revisada.
Portanto, o primeiro passo de sua resposta é: você não pode fazer o segundo passo NAT (pós-roteamento SNAT): no servidor A run iptables -t nat -D POSTROUTING -j SNAT --to 1.1.1.3
.
Agora você tem o desafio de reverter o primeiro passo do NAT.
Se o Servidor B vai fazer isso, você precisa do Servidor B para receber os pacotes.
- Isso é relativamente fácil se o servidor A tiver um endereço C na mesma LAN que o servidor B. No servidor B:
ip route replace default via C
, ORip route add default via C table a; ip rule add from 2.2.2.3 table a
. - Caso contrário, você tem que fazer algo extravagante com túneis.
Se, no entanto, o roteador na localização do Servidor B não for particularmente sofisticado (inspecionar os pacotes com antecedência e rejeitar aqueles que não estão na seqüência correta para um fluxo de tráfego conhecido), você terá uma opção um pouco mais simples, se super-feia: inverter o NAT no servidor B com base no seu conhecimento do que foi feito no servidor A: no servidor B iptables -t nat -I POSTROUTING -j SNAT -s 2.2.2.3 --to 1.1.1.3
deve fazer o exemplo proposto. Isso deixará o sistema de rastreamento de conexão Linux em A e B um pouco confuso (os servidores não poderão associar o tráfego de retorno ao tráfego de entrada para que o rastreamento de conexão deixe conexões no estado UNREPLIED), mas deve funcionar bem para a maioria do tráfego nas centenas de megabits.
Andando pelo fluxo de tráfego uma última vez neste caso:
- O cliente X envia um pacote para o 1.1.1.3.
- Servidor A NATs o destino desse pacote para 2.2.2.3 pré-roteamento, em seguida, encaminha o tráfego para 2.2.2.3, mas deixa o endereço de origem como X quando envia o pacote para o Servidor B.
- O servidor B recebe o pacote no 2.2.2.3 e vê um endereço de origem do X. Ele processa o pacote e encaminha a resposta de volta para a sua origem X, mas antes de enviá-lo faz o NAT de pós-roteamento do source source 1.1.1.3.
- O cliente X recebe a resposta que afirma ser da versão 1.1.1.3 e está feliz.