Dato che questa è stata elevata alla domanda canonica sul NAT tornante , ho pensato che probabilmente avrebbe dovuto avere una risposta più generalmente valida di quella attualmente accettata, che (sebbene eccellente) si riferisce specificamente a FreeBSD.
Questa domanda si applica ai servizi forniti dai server su reti IPv4 indirizzate a RFC1918, che sono resi disponibili agli utenti esterni introducendo il NAT di destinazione (DNAT) sul gateway. Gli utenti interni tentano quindi di accedere a tali servizi tramite l'indirizzo esterno. Il loro pacchetto esce dal client al dispositivo gateway, che riscrive l'indirizzo di destinazione e lo immette immediatamente nella rete interna. È questa brusca virata che il pacchetto fa al gateway che dà origine al nome di tornante NAT , per analogia con il tornante .
Il problema sorge quando il dispositivo gateway riscrive l'indirizzo di destinazione, ma non l'indirizzo di origine. Il server riceve quindi un pacchetto con un indirizzo di destinazione interno (il proprio) e un indirizzo di origine interno (il client); sa che può rispondere direttamente a tale indirizzo, quindi lo fa. Poiché tale risposta è diretta, non passa attraverso il gateway, che quindi non ha mai la possibilità di bilanciare l'effetto del NAT di destinazione in entrata sul pacchetto iniziale riscrivendo l'indirizzo di origine del pacchetto di ritorno.
Il client invia quindi un pacchetto a un indirizzo IP esterno , ma ottiene una risposta da un indirizzo IP interno . Non ha idea che i due pacchetti facciano parte della stessa conversazione, quindi non avviene alcuna conversazione.
La soluzione è quella per i pacchetti che richiedono tale NAT di destinazione e che raggiungono il gateway dalla rete interna , per eseguire anche il NAT di origine (SNAT) sul pacchetto in entrata, di solito riscrivendo l'indirizzo di origine come quello del gateway. Il server quindi pensa che il client sia il gateway stesso e risponde direttamente ad esso. Ciò a sua volta offre al gateway la possibilità di bilanciare gli effetti di DNAT e SNAT sul pacchetto in entrata riscrivendo gli indirizzi di origine e di destinazione sul pacchetto di ritorno.
Il client pensa che stia parlando con un server esterno. Il server pensa che stia parlando con il dispositivo gateway. Tutte le parti sono felici. Un diagramma può essere utile a questo punto:
Alcuni dispositivi gateway consumer sono abbastanza luminosi da riconoscere quei pacchetti per i quali è necessario il secondo passaggio NAT e probabilmente funzioneranno immediatamente in uno scenario NAT a forcina. Altri non lo sono, e quindi non lo faranno, ed è improbabile che possano essere fatti funzionare. Una discussione su quali dispositivi di livello consumer sono fuori tema per Server Fault.
In genere si può dire che i dispositivi di rete adeguati funzionino, ma - poiché non si tratta di indovinare i propri amministratori - devono essere informati di farlo. Linux usa iptables
per fare il DNAT in questo modo:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.3.11
che abiliterà DNAT semplice per la porta HTTP, su un server interno acceso 192.168.3.11
. Ma per abilitare il tornante NAT, è necessario anche una regola come:
iptables -t nat -A POSTROUTING -d 192.168.3.11 -p tcp --dport 80 -j MASQUERADE
Si noti che tali regole devono essere nel posto giusto nelle catene pertinenti per funzionare correttamente e, a seconda delle impostazioni nella filter
catena, potrebbero essere necessarie regole aggiuntive per consentire il flusso del traffico NATted. Tutte queste discussioni non rientrano nell'ambito di questa risposta.
Ma come altri hanno già detto, abilitare correttamente il tornante NAT non è il modo migliore per gestire il problema. Il migliore è DNS a orizzonte diviso , in cui l'organizzazione fornisce risposte diverse per la ricerca originale a seconda di dove si trova il client richiedente, sia con server fisici diversi per utenti interni che esterni o configurando il server DNS per rispondere in modo diverso in base a l'indirizzo del cliente richiedente.