Excluí minha resposta original, porque não estava totalmente confiante de que estava correta. Desde então, tive tempo para configurar uma pequena rede virtual de VMs para simular a rede em questão. Aqui está o conjunto de regras de firewall que funcionaram para mim (em iptables-save
formato, apenas para a nat
tabela):
-A PREROUTING -d 89.179.245.232/32 -p tcp -m multiport --dports 22,25,80,443 -j DNAT --to-destination 192.168.2.10
-A POSTROUTING -s 192.168.2.0/24 -o ppp0 -j MASQUERADE
-A POSTROUTING -s 192.168.2.0/24 -d 192.168.2.10/32 -p tcp -m multiport --dports 22,25,80,443 -j MASQUERADE
A primeira POSTROUTING
regra é uma maneira direta de compartilhar a conexão da Internet com a LAN. Deixei por completo.
A PREROUTING
regra e a segunda POSTROUTING
regra juntos estabelecem os NATs apropriados, para que as conexões com o servidor através do endereço IP externo possam ocorrer, independentemente de as conexões serem originárias de fora ou de dentro da LAN. Quando os clientes na LAN se conectam ao servidor por meio do endereço IP externo, o servidor vê as conexões como provenientes do endereço IP interno do roteador (192.168.2.1).
Curiosamente, verifica-se que existem algumas variações da segunda regra POSTROUTING que também funcionam. Se o destino for alterado para -j SNAT --to-source 192.168.2.1
, o efeito é (sem surpresa) o mesmo que MASQUERADE
: o servidor vê as conexões dos clientes locais da LAN como originárias do endereço IP interno do roteador . Por outro lado, se o destino for alterado para -j SNAT --to-source 89.179.245.232
, os NATs ainda funcionarão, mas desta vez o servidor verá as conexões dos clientes locais da LAN como originárias do endereço IP externo do roteador (89.179.245.232).
Por fim, observe que o seu original PREROUTING
/ DNAT
regra com -i ppp0
não funciona, porque a regra nunca corresponde aos pacotes provenientes dos clientes da LAN (pois eles não entram no roteador pela ppp0
interface). Seria possível fazê-lo funcionar adicionando uma segunda PREROUTING
regra apenas para os clientes LAN internos, mas seria deselegante (IMO) e ainda precisaria se referir explicitamente ao endereço IP externo.
Agora, mesmo depois de ter apresentado uma solução "NAT em gancho de cabelo" (ou "loopback NAT", ou "reflexão NAT", ou o que alguém preferir chamá-lo) em detalhes, ainda acredito que uma solução DNS com horizonte dividido - -com clientes externos resolvendo para o IP externo e clientes internos resolvendo para o IP interno --- seria o caminho mais recomendável a seguir. Por quê? Como mais pessoas entendem como o DNS funciona do que o NAT, e uma grande parte da criação de bons sistemas é optar por usar peças que possam ser mantidas. É mais provável que uma configuração de DNS seja entendida e, portanto, mantida corretamente, do que uma configuração arcana de NAT (IMO, é claro).