Ho cancellato la mia risposta originale, perché non ero del tutto sicuro che fosse corretta. Da allora ho avuto il tempo di creare una piccola rete virtuale di macchine virtuali per simulare la rete in questione. Ecco il set di regole del firewall che ha funzionato per me (in iptables-save
formato, solo per la nat
tabella):
-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
La prima POSTROUTING
regola è un modo semplice di condividere la connessione Internet con la LAN. L'ho lasciato lì per completezza.
La PREROUTING
regola e la seconda POSTROUTING
regola stabiliscono insieme i NAT appropriati, in modo che possano verificarsi connessioni al server tramite l'indirizzo IP esterno, indipendentemente dal fatto che le connessioni provengano dall'esterno o dall'interno della LAN. Quando i client sulla LAN si connettono al server tramite l'indirizzo IP esterno, il server vede le connessioni come provenienti dall'indirizzo IP interno del router (192.168.2.1).
È interessante notare che ci sono un paio di varianti della seconda regola POSTROUTING che funzionano anche. Se la destinazione viene cambiata in -j SNAT --to-source 192.168.2.1
, l'effetto è (non sorprendentemente) lo stesso di MASQUERADE
: il server vede le connessioni dai client LAN locali come originate dall'indirizzo IP interno del router . D'altra parte, se la destinazione viene cambiata in -j SNAT --to-source 89.179.245.232
, i NAT funzionano ancora, ma questa volta il server vede le connessioni dai client LAN locali come originate dall'indirizzo IP esterno del router (89.179.245.232).
Infine, nota che l'originale PREROUTING
/ DNAT
regola con -i ppp0
non funziona, perché la regola non corrisponde mai ai pacchetti provenienti dai client LAN (poiché quelli non entrano nel router tramite l' ppp0
interfaccia). Sarebbe possibile farlo funzionare aggiungendo una seconda PREROUTING
regola solo per i client LAN interni, ma sarebbe inelegante (IMO) e dovrebbe comunque fare riferimento esplicitamente all'indirizzo IP esterno.
Ora, anche dopo aver presentato una soluzione NAT "a forcina" (o "loopback NAT", o "riflessione NAT", o qualunque cosa si preferisca chiamarla) in dettaglio, continuo a credere che una soluzione DNS split-horizon - -con client esterni che si risolvono in IP esterno e client interni che si risolvono in IP interno --- sarebbe la strada più consigliabile da prendere. Perché? Perché più persone capiscono come funziona il DNS che capire come funziona il NAT, e gran parte della costruzione di buoni sistemi sta scegliendo di utilizzare parti che sono gestibili. È più probabile che una configurazione DNS sia compresa, e quindi correttamente mantenuta, rispetto a una configurazione NAT arcana (IMO, ovviamente).