Como posso alterar o IP de origem de um pacote recebido antes que ele chegue ao serviço em execução?
Tenho dois aparelhos, um Gerenciador e um Servidor, conectados via VPN e possui NAT entre eles.
IP da interface do gerenciador: A IP da interface do servidor: B
O gerente se conecta ao servidor usando NAT IP Y e o servidor vê o IP X quando o gerente se conecta
Como configuro o iptables no servidor de forma que quando o pacote chegar com o IP X de origem, altere-o para IP.
Eu sei que isso não deve ser um problema em uma rede e um produto bem projetados, mas precisamos de uma solução alternativa por enquanto, até que seja corrigido no lado do software.
Até agora, as regras do iptables abaixo não têm ajudado:
iptables -t nat -A POSTROUTING -s <X> -o eth0 -j SNAT --to <A>
Qualquer ajuda será apreciada.
Responder1
NAT depende de serviços "solicitados" portabelas de ipe fornecido peloconexãosubsistema. O SNAT não é disponibilizado antes da decisão de roteamento ser tomada, mas ainda está disponível quando o pacote foi escolhido para ser roteado para o host: no raramente usadonat/ENTRADAcadeia, conforme documentado nopágina de manual:
SNAT
Este alvo só é válido na tabela nat, no
POSTROUTING
eINPUT
cadeias e cadeias definidas pelo usuário que são chamadas apenas a partir dessas cadeias. [...]
Portanto, desde que o servidor esteja recebendo o tráfego (sem roteá-lo posteriormente), ao receber um pacote do endereço IP de origem <X> no endereço IP de destino do servidor <B> através da interfaceeth0, pode ser SNATed para aparecer como endereço de origem <A> (que era o endereço de origem IP original, mas esta informação é perdida), com isto:
iptables -t nat -A INPUT -s <X> -d <B> -i eth0 -j SNAT --to <A>
Ou usando uma versão mais simples:
iptables -t nat -A INPUT -s <X> -j SNAT --to <A>
Você poderia adicionar mais restrições como -p tcp --dport XXXX
(XXXX para o serviço real alcançado), e provavelmente deveria: se você encontrar o problema descrito abaixo, poderá impedir o acesso ao sistema através da VPN. Tenha um método de acesso de backup ou não faça isso remotamente, a menos que tenha certeza.
A regra acima pode não ser suficiente devido ao roteamento. Se o endereço IP <A> não estiver em uma rota conhecida para o Servidor (isso aconteceria apenas se o Servidor não tivessepadrãorota). Embora o sistema nunca envie um pacote de volta (IP ou mesmo ARP) para este destino (as respostas não são SNAT), uma rota para ele ainda é necessária para um manuseio correto pela pilha de roteamento que não sabe que o SNAT aconteceu.
Então se otabelas de ipregra acima não for suficiente (provavelmente se o servidor não tiver rota padrão), você pode adicionar:
ip route add <A>/32 dev eth0