Affinché un servizio offerto da un server sia effettivamente fruibile, è necessario che il server disponga di un indirizzo IP pubblico al quale gli utenti possano connettersi. Solitamente ciò avviene assegnando un indirizzo IP pubblico statico ad una delle interfacce di rete del server.
Tuttavia, esistono diversi casi in cui questa tecnica non è attuabile. Ad esempio, si pensi al caso di un server installato presso un piccolo ufficio, in presenza di un'unica connessione ad Internet e di un solo indirizzo IP pubblico. Oppure ad uno scenario in cui per esigenze strutturali si voglia sfruttare lo stesso indirizzo IP per raggiungere macchine diverse, posto che esse offrano servizi diversi.
In tutti questi casi si ricorre alla tecnica del Network Address Translation (in breve NAT), che consente di alterare il contenuto dei datagrammi IP per permettere la connessione di due reti IP con indirizzi differenti.
Nella sua forma più semplice, il NAT è comunemente utilizzato dai router per permettere a più dispositivi di condividere la stessa connessione ad Internet.
Un router che implementa NAT altera i pacchetti in uscita (cioé provenienti da un nodo locale) sostituendo l'indirizzo IP del mittente con il proprio indirizzo IP pubblico, ed analogamente altera i pacchetti in ingresso sulla propria interfaccia pubblica (alla quale è associato un indirizzo IP pubblico) ritrasmettendoli al nodo locale opportuno.
La determinazione del nodo locale a cui ritrasmettere i pacchetti in ingresso si basa su una tabella, detta tabella di port forwarding (inoltro porte), opportunamente configurata dall'amministratore di rete. Per ovvi motivi, tale tabella non può contenere ambiguità: il router deve sapere con esattezza a quale nodo interno ritrasmettere i pacchetti ricevuti dall'esterno. Pertanto, nella configurazione di questa tabella si ricorre ai numeri di porta TCP o UDP oltre che agli indirizzi IP, dato che la maggior parte del traffico Internet si basa comunque su uno di questi due protocolli di trasporto.
Le righe di una tabella di port forwarding sono composte essenzialmente da quattro parametri: protocollo (TCP, UDP o entrambi), numero di porta pubblico, indirizzo IP privato, numero di porta privato.
Esempio pratico
Per meglio comprendere il funzionamento del port forwarding, si supponga di operare nello scenario mostrato in figura 1.
In questo esempio, si dispone di un solo indirizzo IP pubblico (30.40.10.2) per poter raggiungere i server web ed FTP mostrati in figura. Grazie al NAT ed al port forwarding implementato nel router, è possibile raggiungere entrambi i server con il medesimo indirizzo IP pubblico, distinguendo le connessioni in base al numero di porta.
Le connessioni TCP all'indirizzo IP 30.40.10.2 e porta 443 (HTTPS) verranno reindirizzate all'indirizzo privato 10.0.0.20, mentre le connessioni all'indirizzo IP 30.40.10.2 e porta 21 (FTP) verranno reindirizzate all'indirizzo privato 10.0.0.30.
Una tabella di port forwarding che implementa quanto descritto sopra, potrebbe quindi essere la seguente:
Protocollo | IP pubblico | Porta pubblica | IP privato | Porta privata |
---|---|---|---|---|
TCP | 30.40.10.2 | 443 | 10.0.0.20 | 443 |
TCP | 30.40.10.2 | 21 | 10.0.0.30 | 21 |
Si noti come la tabella di port forwarding consenta anche di specificare numeri di porta pubblici e privati differenti. Ciò consente di avere più server privati tutti in ascolto sulla stessa porta, purché essi siano assegnati a porte pubbliche differenti. L'assenza di ambiguità nella tabella di port forwarding è infatti garantita dal fatto che almeno uno dei 5 parametri sia differente.
Conclusioni
Il port forwarding è disponibile su moltissimi router, indipendentemente dalla scala e dal campo di applicazione (si va dal piccolo router casalingo alle soluzioni integrate per i datacenter). Ricordiamo inoltre, che è possibile configurare opportunamente un server Linux per agire da router. In questo caso, il port forwarding viene implementato mediante le tabelle di iptables.