Fork me on GitHub

Linux nat

Ecco un caso in cui una stazione linux a costo zero puo fungere da "raccordo" e salvarti la giornata (o una settimana di permanenza fuori sede).
Immaginate un azienda che possieda una wide area network (che per brevità chiameremo "rete W") in cui le macchine ad essa connesse siano dislocate nelle piu' svariate citta'.
La gestione delle macchine collegate e' affidata sia centralmente che a livello periferico a dei sistemisti (che non potete interpellare) in grado di assolvere alle esigenze di configurazione delle singole stazioni, ma che non possono pero' configurare i router che indirizzano le comunicazioni, ne operare alcun controllo sulla banda passante della rete (poiché dipendenti da una ditta esterna).
In questo "amichevole" contesto vi viene chiesto di trasferire una macchina originariamente collegata all'interno di una lan separata dal resto della rete aziendale (che chiameremo "rete B"), in un altra città.
Non solo, vi viene poi chiesto di far comunicare questa macchina (ormai esterna) con un server all'interno della rete B.
Una volta ottenuto un accesso alla rete W, ho risolto il problema con una macchina linux da pochi soldi che ho messo a fare da router firewall fra la nostra rete B e la rete W.
Certo, la mia cultura informatica e le mie capacità sistemistiche lasciano a desiderare, ma tutto funziona egregiamente.
Il router è costituito da un pentium 2 a 300 mhz, provvisto di 2 schede di rete, 3 hd di cui il piu grande non supera il gb, e su di esso gira redhat 7.3.
In origine ho utilizzato le capacità di ip masking di questa macchina, visibile su entrambe le reti per poter utilizzare, un client di interrogazione dati, da più pc sulla rete B, verso un server sulla rete W.
Ora voglio utilizzarla per interrogare una specifica macchina sulla rete B dal calcolatore che ho dovuto trasportare sulla rete W.
Il pacchetto netfilter/iptables in dotazione a questa distribuzione di linux, ci offre questa opportunità...
Cito: "If you are running a recent Linux system (Kernel 2.4.x or above) on a router, you can use netfilter/iptables for all kinds of firewalling, NAT or other advanced packet processing."
Let's go!
Se dovessimo affrontare il problema appena esposto da una macchina installata di fresco, ci dovremo assicurare che sia già in grado di ruotare i pacchetti da un interfaccia di rete ad un altra (packet forwarding); controlliamo:

# cat /proc/sys/net/ipv4/ip_forward

ci deve restituire un valore pari a 1.
Se così non fosse possiamo impostarlo con:

# echo 1 > /proc/sys/net/ipv4/ip_forward

per impostare in modo permanente tale opzione:

# vi /etc/sysctl.conf
...
net.ipv4.ip_forward=1
...


Usciamo e salviamo con il consueto shift+ZZ.
Una volta sicuri di avere il packet forwarding attivato, utiliziamo in questa occasione, la capacità di NAT (network address traslator) di iptables; per questo motivo ci assicuriamo che sia caricato nel kernel il suo modulo:

# lsmod
...
iptable_nat 21752 3 [ip_nat_irc ip_nat_ftp ipt_MASQUERADE ipt_REDIRECT]
...

Se nella lista non appare iptable_nat lo carichiamo:

# modprobe iptable_nat

Il modulo NAT si controlla mediante il comando iptables. Il traffico tcp viene sottoposto alle regole descritte in una tavola (-t nat) contente tre liste chiamate catene (CHAINS); le tre catene prendono il nome di PREROUTING (per attuare quella tipologia di controllo chiamato "Destination NAT"), POSTROUTING (per attuare quella tipologia di controllo chiamato "Source NAT") e l'ultima chain (che non considereremo per questo caso) è la OUTPUT.
Il nostro caso, vuole che noi utiliziamo la tecnica di "Destination NAT" per cui dovremo eseguire le modifiche di pacchetto nella catena di PREROUTING.
Il pacchetto in transito all'interno della linux box, non subirà altre modifiche (dalle altre tabelle) e verrà visto come un pacchetto che dovrà semplicemente raggiungere la propria destinazione.
Il trattamento di prerouting di un pacchetto consente di specificare l'interfaccia d'ingresso -i (incoming interface).
Il Destination NAT è usato specificando l'opzione -j DNAT e l'opzione "--to-destination" specifica un indirizzo ip, un range di indirizzi ed un opzionale porta o range di porte (solo per i protocolli UDP e TCP).
Quindi per il nostro caso:

# iptables -t nat -A PREROUTING -p tcp --dport 6000 -i eth1 -j DNAT --to 198.234.2.10

-t nat Specificha la tavola in cui inserire il controllo
-A PREROUTING Specifica "Add" regola a catena PREROUTING
-p tcp Specifica il protocollo (tcp o udp)
--dport 6000 Indica la porta a cui era destinato il pacchetto che vogliamo ruotare.
-i eth1 Specifica l'interfaccia che dovrà accettare i pacchetti
--to 198.234.2.10 Indica la macchina che dovrà rispondere a quei pacchetti.
Finish.
Adesso configurerò la macchina installata nella rete W in modo tale di rivolgere al calcolatore redhat tutte le richieste per il server 198.234.2.10, e la redhat non farà altro che girarle in maniera trasparente.

Commenti !

blogroll

social