Port forwarding, noto anche come mappatura delle porte, è un metodo per consentire ai dispositivi remoti di connettersi a uno specifico servizio all'interno della rete locale privata (LAN). Come suggerisce il nome, il processo comporta l'inoltro delle richieste per una porta specifica a un'altra porta o rete. Modifica la destinazione del pacchetto in transito ed è considerato un tipo di operazione di traduzione degli indirizzi di rete (NAT).
L'abilitazione del port forwarding consente a quei dispositivi o host non connessi alla rete interna di accedere l'uno all'altro, cosa che altrimenti sarebbe limitata se disabilitata. È possibile sfruttare i vantaggi del port forwarding per bloccare i siti web di destinazione, migliorare la sicurezza e aggirare il firewall NAT a proprio piacimento.
In questo tutorial, ti guideremo attraverso i passaggi per l'inoltro delle porte con iptables in Linux.
Prerequisiti
Per seguire questo tutorial, avrai bisogno di:
- Ubuntu installato sul tuo sistema.
- Due host Ubuntu 20.04 nello stesso data center con rete privata abilitata.
- Account utente non root configurato con privilegi sudo in ogni macchina.
Dettagli dell'host
Per prima cosa, dobbiamo conoscere i dettagli delle interfacce e degli indirizzi dei server di lavoro. Controlliamo le interfacce di rete del nostro sistema:
|
1 |
ip -4 addr show scope global |
Vedrai l'output:
|
1 2 3 4 5 6 7 8 9 |
Esempio di output 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 198.51.100.45/18 brd 45.55.191.255 scope global eth0 valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.1.5/16 brd 10.132.255.255 scope global eth1 valid_lft forever preferred_lft forever |
Qui, l'output evidenziato mostra due interfacce, la prima eth0 assegnata all'indirizzo 192.51.100.45, e la seconda eth1 assegnata all'indirizzo 192.168.1.5. Di queste due interfacce, una è pubblica e l'altra è privata. Eseguiremo un comando per distinguere tra le due e individuare l'interfaccia pubblica, quella connessa al gateway predefinito. Per distinguerle, digita:
|
1 |
ip route show | grep default= |
Vedrai l'output:
|
1 2 3 |
Output: ip route show | grep default |
Dati fittizi per il tutorial
Useremo indirizzi e assegnazioni di interfaccia fittizi in questo tutorial. Sei libero di usare questi dati o di sostituirli, a tua convenienza.
Dettagli di rete del server web:
-
Indirizzo IP pubblico: 203.0.113.2
-
Indirizzo IP privato: 192.0.2.2
-
Interfaccia pubblica: eth0
-
Interfaccia privata: eth1
Dettagli di rete del firewall:
-
Indirizzo IP pubblico: 203.0.113.15
-
Indirizzo IP privato: 192.0.2.15
-
Interfaccia pubblica: eth0
-
Interfaccia privata: eth1
Configurazione del server web
Iniziamo con l'host del nostro server web. Per prima cosa, accedi con il tuo sudo utente.
Installare Nginx
Per prima cosa, installeremo Nginx sul nostro host del server web e lo bloccheremo in modo che ascolti solo sulla sua interfaccia privata. Ciò consentirà al nostro server web di essere disponibile solo se abbiamo configurato il port forwarding in modo corretto.
Successivamente, aggiorna la cache dei pacchetti locali e usa apt to scaricare e installare Nginx:
|
1 |
sudo apt-get update |
|
1 |
sudo apt-get install nginx |
Aggiungere restrizioni
Una volta installato Nginx sul nostro host del server web, lo bloccheremo per assicurarci che accetti input solo dalle interfacce private e da nessun'altra parte. Inoltre, ciò garantirà che i nostri server web siano attivi solo se la configurazione del port forwarding è corretta.
Per aggiungere restrizioni, apri il file di configurazione del blocco server predefinito /etc/nginx/sites-enabled/default on any text editor of your choice (here we’re using nano text editor), and type:
|
1 |
sudo nano /etc/nginx/sites-enabled/default |
Nell'output, vedrai la direttiva listen apparire due volte:

In questo tutorial, useremo la prima direttiva per dimostrare l'inoltro IPv4. La seconda, configurata per IPv6, può essere rimossa. Aggiungi l'indirizzo IP privato del tuo server web con i due punti subito prima di 80 per informare Nginx di accettare input solo dall'interfaccia privata. Successivamente, modifica la direttiva:

Una volta fatto, salva e chiudi il file. Prima di procedere, assicurati che non ci siano errori di sintassi. Testiamo il file:
|
1 |
sudo nginx -t |

Se non viene visualizzato alcun errore, puoi riavviare Nginx e abilitare la nuova configurazione:
|
1 |
sudo service nginx restart |
Verifica della restrizione di rete
Verifichiamo il livello di accesso che abbiamo al nostro server web. Prova ad accedere al server web utilizzando l'interfaccia privata tramite il comando curl comando:
|
1 |
curl --connect-timeout 5 192.0.2.2 |
Vedrai l'output:

Se proviamo a utilizzare l'interfaccia pubblica, non saremo in grado di connetterci:
|
1 |
curl --connect-timeout 5 203.0.113.2 |
|
1 |
curl: (7) Failed to connect to 203.0.113.2 port 80: Connection refused |
Questo è esattamente ciò che ci aspettavamo.
Configurare il firewall per inoltrare la porta 80
Procediamo con il nostro lavoro implementando il port forwarding sulla nostra macchina firewall.
Abilitare l'inoltro nel kernel
Per impostazione predefinita, la maggior parte dei sistemi ha il port forwarding disattivato. Apporteremo alcune modifiche per attivarlo. Inoltre, c'è un'opzione per attivare il port forwarding in modo permanente utilizzando i privilegi sudo come mostrato nei passaggi successivi.
Per attivare l'inoltro del traffico a livello di kernel, digita:
|
1 |
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward |
Per attivare il port forwarding in modo permanente, modifica il file /etc/sysctl.conf . Apri il file con i privilegi sudo e digita:
|
1 |
sudo nano /etc/sysctl.conf |
All'interno, trova e decommenta la riga simile a questa:
|
1 |
net.ipv4.ip_forward=1 |
Una volta fatto, salva e chiudi il file. Quindi, usa i comandi sysctl per applicare le modifiche alle impostazioni in modo che abbiano effetto:
|
1 |
sudo sysctl -p |
|
1 |
sudo sysctl --system |
Configurazione di base del firewall
Prima di tutto, consulta la guida su how to set up a basic firewall sulla tua macchina. Al termine, avrai:
- Installato iptables-persistent
- Salvato il set di regole predefinito in /etc/iptables/rules.v4
- Conoscenza approfondita sull'aggiunta e la modifica delle regole utilizzando il iptables comando
Inoltre, puoi dare un'occhiata a how to list and delete iptables Firewall rules.
Aggiunta delle regole di inoltro
Configureremo il nostro firewall per garantire che il traffico che fluisce nella nostra interfaccia pubblica ( eth0 ) sulla porta 80 venga inoltrato alla nostra interfaccia privata ( eth1). Per impostazione predefinita, il nostro firewall di base ha una catena FORWARD impostata su DROP il traffico. L'aggiunta di regole del firewall consentirà l'inoltro delle connessioni al nostro server web. Per una maggiore sicurezza, bloccheremo le regole del firewall per consentire solo le richieste di inoltro.
Nella catena FORWARD , accetteremo nuove connessioni destinate alla porta 80 provenienti dalla nostra interfaccia pubblica e dirette alla nostra interfaccia privata. Identificheremo le nuove connessioni con l'aiuto dell'estensione conntrack e le rappresenteremo con un TCP SYN pacchetto:
|
1 |
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT |
È necessario consentire qualsiasi traffico successivo in entrambe le direzioni derivante dalla connessione in entrata. Digita i comandi seguenti per consentire il traffico ESTABLISHED e RELATED tra le nostre interfacce pubblica e privata:
|
1 |
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
|
1 |
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
Verifichiamo se la nostra policy sulla FORWARD chain è impostata su DROP:
|
1 |
sudo iptables -P FORWARD DROP |
Fino ad ora, abbiamo aggiunto alcune regole che consentono al traffico tra le nostre interfacce pubblica e privata di passare attraverso il nostro firewall. Tuttavia, iptables non è ancora informato su come indirizzare il traffico perché la configurazione delle regole del firewall deve ancora essere completata. Nei passaggi successivi, aggiungeremo le regole NAT e regoleremo il set di regole permanenti per indirizzare il traffico.
Aggiunta delle regole NAT per indirizzare i pacchetti
Eseguiremo due operazioni separate affinché iptables modifichi correttamente i pacchetti e ottimizzi la comunicazione con i client e il server web.
DNAT è la prima operazione che avvia la PREROUTING chain della tabella nat . L'operazione modifica l'indirizzo di destinazione del pacchetto e gli consente di essere instradato correttamente mentre passa tra le reti. Tuttavia, i client sulla rete pubblica si connetteranno al nostro server firewall e non avranno informazioni sulla topologia della nostra rete privata. Per scambiare informazioni con la rete privata, modifica l'indirizzo di destinazione di ciascun pacchetto per consentirgli di raggiungere correttamente il nostro server web di destinazione.
È fondamentale notare che ci stiamo concentrando sulla configurazione del port forwarding. L'esecuzione del NAT su ogni pacchetto che colpisce il firewall non fa parte del nostro tutorial. Assoceremo i pacchetti sulla porta 80 all'indirizzo IP privato del nostro server web:
|
1 |
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 |
Il pacchetto verrà instradato correttamente verso il nostro server web contenente l'indirizzo originale del client come indirizzo di origine. Nonostante i tentativi effettuati dal server di inviare la risposta direttamente a quell'indirizzo, non sarà possibile stabilire una connessione TCP legittima.
Per configurare un instradamento corretto, modificheremo l'indirizzo di origine del pacchetto. Modifichiamo l'indirizzo di origine con l'indirizzo IP privato del nostro server firewall. Dopo la modifica, la risposta verrà rispedita al firewall, che la inoltrerà al client.
Per abilitare questa funzionalità, aggiungi una regola alla POSTROUTING chain della tabella nat valutata subito prima che i pacchetti vengano inviati sulla rete. Quindi, associa i pacchetti destinati al nostro server web per indirizzo IP e porta:
|
1 |
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.0.2.2 -j SNAT --to-source 192.0.2.15 |
Una volta applicata questa regola, il nostro server web dovrebbe essere accessibile puntando il browser web all'indirizzo pubblico della nostra macchina firewall:
|
1 |
curl 203.0.113.15 |
Vedrai l'output:

La nostra configurazione del port forwarding è completata.
Regolare il set di regole permanenti
Dopo aver completato la configurazione del port forwarding, la salveremo nel nostro set di regole permanenti. Se desideri mantenere i commenti nel set di regole corrente, utilizza il servizio iptables-persistent per salvare le tue regole:
|
1 |
sudo service iptables-persistent save |
Puoi anche aprirlo e modificarlo manualmente per mantenere i commenti nel tuo file:
|
1 |
sudo nano /etc/iptables/rules.v4 |
Successivamente, configura la tabella filter e la tabella nat per aggiungere rispettivamente le regole della chain FORWARD e le regole di ROUTING . La regolazione della tabella nat ci consentirà di aggiungere le regole PREROUTING e POSTROUTING come mostrato nell'esempio seguente:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
/etc/iptables/rules.v4 *filter # Consenti tutto il traffico in uscita, ma scarta i pacchetti in entrata e di inoltro per impostazione predefinita :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # Catene personalizzate per protocollo :UDP - [0:0] :TCP - [0:0] :ICMP - [0:0] # Traffico UDP accettabile # Traffico TCP accettabile -A TCP -p tcp --dport 22 -j ACCEPT # Traffico ICMP accettabile # Criterio di accettazione standard -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT # Scarta i pacchetti non validi -A INPUT -m conntrack --ctstate INVALID -j DROP # Passa il traffico alle catene specifiche del protocollo ## Consenti solo nuove connessioni (quelle stabilite e correlate dovrebbero essere già gestite) ## Per TCP, consenti inoltre solo nuovi pacchetti SYN poiché questo è l'unico metodo valido ## per stabilire una nuova connessione TCP -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP # Rifiuta qualsiasi cosa sia arrivata fino a questo punto ## Cerca di essere specifico per il protocollo con il messaggio di rifiuto -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable # Regole per inoltrare la porta 80 al nostro server web # Dettagli di rete del server web: # * Indirizzo IP pubblico: 203.0.113.2 # * Indirizzo IP privato: 192.0.2.2 # * Interfaccia pubblica: eth0 # * Interfaccia privata: eth1 # # Dettagli di rete del firewall: # # * Indirizzo IP pubblico: 203.0.113.15 # * Indirizzo IP privato: 192.0.2.15 # * Interfaccia pubblica: eth0 # * Interfaccia privata: eth1 -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Fine delle regole di filtraggio Forward # Applica le modifiche COMMIT *raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # Regole per tradurre le richieste per la porta 80 dell'interfaccia pubblica # in modo da poter inoltrare correttamente al server web utilizzando l' # interfaccia privata. # Dettagli di rete del server web: # * Indirizzo IP pubblico: 203.0.113.2 # * Indirizzo IP privato: 192.0.2.2 # * Interfaccia pubblica: eth0 # * Interfaccia privata: eth1 # # Dettagli di rete del firewall: # # * Indirizzo IP pubblico: 203.0.113.15 # * Indirizzo IP privato: 192.0.2.15 # * Interfaccia pubblica: eth0 # * Interfaccia privata: eth1 -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 -A POSTROUTING -d 192.0.2.2 -o eth1 -p tcp --dport 80 -j SNAT --to-source 192.0.2.15 # Fine delle traduzioni NAT per il traffico del server web COMMIT *security :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT |
Dopo aver aggiunto i valori sopra indicati, salva e chiudi il file. Successivamente, digita il comando seguente per testare la sintassi delle tue regole:
|
1 |
sudo iptables-restore -t < /etc/iptables/rules.v4 |
Se non vedi errori, carica il set di regole:
|
1 |
sudo service iptables-persistent reload |
Verifichiamo che il nostro server web sia ancora accessibile tramite l'indirizzo IP pubblico del tuo firewall:
|
1 |
curl 203.0.113.15 |
Conclusione
Al termine di questo tutorial, dovresti avere familiarità con l'inoltro delle porte su un server Linux con iptables. Puoi sfruttare le funzionalità di port forwarding per mascherare la topologia della tua rete privata, consentendo al contempo al traffico dei servizi di fluire liberamente attraverso la macchina firewall gateway.
Poiché il processo si basa esplicitamente sulla sicurezza della tua rete e sulle porte utilizzate, è sicuro. Potrebbe esserci una possibilità di rischio se non disponi di un firewall di sicurezza o di una sicurezza VPN sulla tua rete. Pertanto, si consiglia di configurare il firewall como discusso in questo tutorial. Speriamo che questa guida ti aiuti a rimanere al sicuro su Internet quando utilizzi la tua rete privata.
Per esplorare ulteriormente altre soluzioni firewall che puoi implementare sul tuo sistema, consulta queste risorse dal nostro blog:
- Configurazione di un firewall con UFW su Ubuntu 18.04
- Configurazione di un firewall con FirewallD su CentOS 7
- Le basi di UFW: apprendere i comandi essenziali del firewall
Buon divertimento con l'informatica!
Commenti
Ancora nessun commento. Scrivi il primo.