O iptables NAT não preserva o IP remoto

2

Eu tenho as regras do iptables abaixo para encaminhar o tráfego ssh recebido na porta 2222 para uma máquina virtual em execução em uma rede vmware "vmnet" no mesmo host.

192.168.1.1   192.168.1.40
+---------+     +------+     +-----------------+ 
| network |---->| host |__   | virtual machine |
+---------+     +------+ \\__+-----------------+
              192.168.2.1 \_____192.168.2.22  

No auth.log da máquina virtual, o endereço IP de entrada para logons remotos é sempre o IP do host que encaminhou os pacotes. Como preservar as informações IP remotas?

*filter
:INPUT ACCEPT [593178:45807398]
:FORWARD ACCEPT [881:158378]
:OUTPUT ACCEPT [859348:1232593358]
-A FORWARD -d 192.168.2.22/32 -o vmnet99 -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT

*nat
:PREROUTING ACCEPT [943:138565]
:INPUT ACCEPT [658:122878]
:OUTPUT ACCEPT [3266:229178]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 2222 -j DNAT --to-destination 192.168.2.22:22
-A POSTROUTING -j MASQUERADE
COMMIT
RaWkStAr
fonte

Respostas:

3

Sua última regra do iptables,

 -A POSTROUTING -j MASQUERADE

está mascarando todos os pacotes que saem do host, incluindo aqueles para a VM: esse é o motivo pelo qual você vê, no convidado, todos os pacotes provenientes do host. Em vez disso, você deve limitar o mascaramento aos pacotes que deixam o host para a Internet, algo como

 -A POSTROUTING -o eth0 -j MASQUERADE

se você chamar eth0, a interface conectada à Internet.

Editar:

Se a pergunta é o que mais eu preciso para fazer o encaminhamento de IP funcionar, uma resposta suficiente é:

  sudo iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.2.22:22
MariusMatutiae
fonte
Eu tenho procurado por aí, e me pergunto se preciso disso também. Devo adicionar essas regras também? -A POSTROUTING -o vmnet99 -j SNAT --to-source 192.168.1.40
RaWkStAr
Vejo suas edições e agradeço sua resposta. Você poderia me dizer por que o SNAT é necessário? Eu encontrei esse tipo de regra durante minha pesquisa e me perguntei se era necessário. Agora eu vejo isso na sua resposta e fico imaginando para que serve isso? Obrigado.
RaWkStAr
Não tenho reputação suficiente para votar sua resposta Marius, mas ofereço-lhe minha gratidão. Obrigado por tomar o tempo para ajudar. Boa resposta!
RaWkStAr
@linuxrawkstar A razão pela qual você não precisa da regra com o SNAT é que você já possui a regra MASQUERADE. Eles executam a mesma ação (para mascarar o IP de origem de cada pacote), mas o MASQUERADE verifica o endereço IP do roteador (no seu caso, seu PC) toda vez, enquanto o SNAT é usado quando você já sabe que deseja que o pacote venha de um pacote. determinado endereço IP. Em outras palavras: se o endereço do seu PC mudar sempre, use MASQUERADE; se tiver um IP estático, você pode usar o SNAT, que é mais rápido.
MariusMatutiae
Trabalhou para mim, estou encaminhando portas para o meu cliente openvpn e estava sempre vendo o sourceip como meu ip do servidor openvpn. isso corrigiu o problema #
Sudhir N