Você precisa usar NAT hairpin nesse cenário. Observe que o PCI-DSS não permite esse tipo de regra de NAT.
Eu uso uma máquina Linux com duas conexões de internet diferentes como o gateway padrão da rede local. Cada conexão à Internet possui seu próprio endereço IP público. Eu usei o roteamento de origem com o comando "ip rule" para balancear o tráfego de saída entre essas duas conexões de internet.
eth0 é a rede local. eth1 e ppp0 estão conectados à internet. a própria máquina linux usa eth1 para se conectar à internet.
Tudo funciona bem, exceto que não consigo acessar o IP público ppp0 da rede local:
ping PPP0-PUBLIC-IP #works fine from the linux machine
ping PPP0-PUBLIC-IP #works fine from outside network
ping PPP0-PUBLIC-IP #**fails** from other machines on local network
Além disso:
$ip rule ls
0: from all lookup local
32763: from x.x.x.x lookup Home
32765: from 192.168.0.208/28 lookup Home
32766: from all lookup main
32767: from all lookup default
$ip route show table local
...
local x.x.x.x dev ppp0 proto kernel scope host src x.x.x.x
...
Onde x.x.x.x é o endereço IP público ppp0. O que eu estou fazendo errado aqui? Por que não consigo pingar o endereço IP pulic da rede local, mas posso fazer o ping da rede externa?
Atualizar : Eu uso dois comandos iptables para configurar o NAT. Não tenho certeza se é o caminho certo, mas funciona para mim:
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
Atualização 2 : Quando eu faço o ping do endereço IP público ppp0 de uma máquina na rede local, a saída tcpdump no gateway indica que os pacotes chegam corretamente da rede local, mas parece que o kernel não os está entregando para a camada de aplicação.
Você precisa usar NAT hairpin nesse cenário. Observe que o PCI-DSS não permite esse tipo de regra de NAT.
Tags routing policy-routing