Eu deletei minha resposta original porque não tinha certeza de que estava correta. Desde então, tive algum 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 funcionou para mim (em iptables-save
format, apenas para a tabela nat
):
-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 regra POSTROUTING
é uma maneira direta de compartilhar a conexão à Internet com a LAN. Eu deixei por completo.
A regra PREROUTING
e a segunda regra POSTROUTING
estabelecem os NATs apropriados, de modo que as conexões com o servidor através do endereço IP externo podem acontecer, independentemente de as conexões serem originadas de fora ou de dentro da LAN. Quando os clientes na LAN se conectam ao servidor através 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, há algumas variações da segunda regra POSTROUTING que também funciona. Se o destino for alterado para -j SNAT --to-source 192.168.2.1
, o efeito é (não surpreendentemente) o mesmo que o MASQUERADE
: o servidor vê conexões de 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 vê 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 a regra original PREROUTING
/ DNAT
com -i ppp0
não funciona, porque a regra nunca corresponde aos pacotes provenientes dos clientes da LAN (já que eles não entram no roteador via ppp0
interface). Seria possível fazê-lo funcionar adicionando uma segunda regra PREROUTING
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 descrito detalhadamente uma solução "hairpin NAT" (ou "NAT loopback", ou "NAT reflection", ou qualquer que seja a sua preferência para chamá-la), ainda acredito que um DNS de split-horizon solução --- com clientes externos resolvendo para o IP externo e clientes internos resolvendo para o IP interno --- seria o caminho mais aconselhável para tomar. Por quê? Porque mais pessoas entendem como o DNS funciona do que entender como o NAT funciona, e uma grande parte da construção de bons sistemas é escolher usar partes que sejam passíveis de manutenção. É mais provável que uma configuração de DNS seja entendida e, portanto, mantida corretamente, do que uma configuração NAT arcana (IMO, claro).