giovedì, Novembre 21, 2024

NAT in ambiente Linux con Iptables

Denis Maggiorotto
Denis Maggiorottohttps://www.sunnyvale.it
Senior System Architect and Software Developer in a small consulting company named Sunnyvale where Denis is also CEO and founder. Mainly focused on enterprise application integration projects, he also write techical article and paper about application security and research.

Introduzione

Il Network Address Translation è la tecnica grazie alla quale un nodo di rete capace di lavorare al layer Network (quale un router, un gateway ecc) modifica l’header dei pacchetti che transitano attraverso di esso, mantenendo traccia dello storico delle modifiche effettuate per redirigere una connessione verso un’altra macchina (Destination NAT), per modificare l’indirizzo IP sorgente di un pacchetto (Source NAT), condividere una connessione ad Internet tra tutta la rete che utilizza un gateway (Masquerading) o infine reindirizzare un pacchetto destinato ad una porta verso un’altra. I vantaggi di utilizzare questa tecnica sono molteplici e spaziano dal risparmio di indirizzi pubblici fino a utilizzarne uno per molteplici hosts (anche intere LANs contenenti decine di hosts), al rendere “nascosta” la vostra rete dietro il router ch applica il NAT.

Attenzione a non scambiare quest’ultima funzione del NAT per una ossibilità di far sicurezza.

Il NAT NON E’ UNA SECURITY FEATURE, e con questo ci prendiamo la briga di unirci al coro di voci che non si stancheranno mai di ripeterlo. Le motivazioni di tale affermazione le potete leggere su NAT is not a security feature. Consiglio caldamente di farlo.
Questa confusione tra NAT, firewalling e falsi miti, posso ipotizzare provenga, per quanto riguarda alcune implementazioni *nix di cui è un tipico esempio netfilter e iptables su Linux, queste funzioni sono svolte da un unico software, (iptables-netfilter appunto nel nostro caso), che spesso fonde assieme le sue capacità integrando firewalling e NAT in una unica soluzione… da qui potrebbe nascere la malcomprensione (questa è comunque solo un’ipotesi); altra fonte di questo errore potrebbe essere la funzione di “occultamento” operato dal NAT, scambiato per una e vera proprio funzionedi firewalling e quindi protezione attiva perimetrale.
Procediamo:

Su Linux con kernel 2.4.x si utilizza iptables, capace di sfruttare a pieno un kernel modulare, successore dell’ormai superato ipchains dei kernel 2.2.x dove per qualsiasi modifica nel trattamento dei socket occorreva la ricompilazione dell’intero kernel.

A proposito di moduli, il NAT necessita che i seguenti moduli vengano caricati con il comando modprobe, chiaramente questo è vero se avete intenzione di sfruttare le capacità avanzate che gli stessi introducono:

  • Iptable_nat
  • Ip_nat_ftp
  • Ip_nat_tftp
  • Ip_nat_irc
  • Ip_nat_snmp_basis
  • Ip_nat_Amanda
  • Ipt_MASQUERADE

Il Destination NAT

Il Destination NAT o DNAT viene particolarmente utilizzato quando si hanno più server in DMZ con indirizzamento privato del tipo 10.0.0.x ed un solo server firewall dotato di IP pubblico è quindi visibile da Internet. Ricordiamo sempre che il DNAT avviene nella chain di PREROUTING ossia prima della routing decision. Il DNAT sarà utilissimo in quanto ci permetterà di proteggere i server pubblici in DMZ filtrando il traffico a loro destinato dal firewall che farà NAT solamente per i servizi HTTP e MAIL come da diagramma qui sotto:

La sintassi:

iptables -t nat -A PREROUTING -p {tcp | udp | icmp}
-s (source address)
--source-port <­porta>
-d (destination address)
--destination-port <­porta>
-j DNAT
--to-destination (destination address)

Con i seguenti comandi abilitiamo il DNAT:

iptables -t nat -A PREROUTING -p tcp -d 80.182.53.192 -dport 80 -j DNAT -to-destination 10.0.0.2:80
iptables -t nat -A PREROUTING -p tcp -d 80.182.53.192 -dport 110 -j DNAT -to-destination 10.0.0.3:110
iptables -t filter -P FORWARD ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward

Si può notare che le richieste HTTP arrivate al firewall da internet (80.182.53.192) sono nattate tramite l’interfaccia 10.0.0.1 del firewall verso 10.0.0.2 sul server adibito, mentre le richieste pop3 sono nattate su 10.0.0.3.

Abbiamo poi abilitato il forward dei pacchetti sia tramite iptables (iptables -t filter -P FORWARD -j ACCEPT) che a livello kernel (echo 1 > /proc/sys/net/ipv4/ip_forward).

Il MASQUERADING

Il masquerading è ampiamente usato per permettere ad una rete interna con indirizzamento privato come 10.0.0.x e quindi non routabile all’esterno, di uscire su internet con il solo IP pubblico del dispositivo(router, firewall) sul quale è in funzione un’implementazione di questa tecnica. E’ molto usato in aziende medio-piccole, anche in questo caso, con lo scopo di risparmiare IP pubblici e “nascondere”, come già detto (vedere osservazioni precedenti), la rete locale.

Più di molte spiegazione vale il diagramma qua sotto.

La sintassi:

iptables -t nat -A POSTROUTING -o (interfaccia sulla extranet) -s (intranet/mask) --source-address

Una possibile configurazione potrebbe essere

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -t filter -P FORWARD ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward

Il Source NAT

Il Source NAT, come si può intuire, modifica nell’header del pacchetto l’indirizzo ip sorgente. Si può quindi far credere ad un server remoto che il pacchetto non arrivi dal proprio firewall ma da un IP diverso. Il server remoto dunque risponderà al nuovo IP sorgente specificato nel pacchetto.

Diamo un’occhiata al diagramma:

La sintassi

iptables -t nat -A POSTROUTING -p (protocol {tcp | udp })

-s (source address)

–sport <­porta>

-d (destination)

–dport <­porta>

-j SNAT

–to-source (source address modificato)

iptables -t nat -A POSTROUTING -o ppp0 -j SNAT -to-source 150.92.48.25

</pre>

Se il PC 10.0.0.7 manda un pacchetto verso internet, il firewall inserirà come indirizzo di provenienza 150.92.48.25, di conseguenza la risposta a quel pacchetto verrà mandata al nuovo IP 150.92.48.25.

E’ simile al masquerading ma con la differenza che ci è permesso specificare un indirizzo IP di sorgenza che deve essere presente nel pacchetto.

Il (port)REDIRECT

Concludiamo il discorso sul NAT, parlando del REDIRECT che consente di mutare la porta di destinazione di un pacchetto. Anche questa operazione si svolge nella chain di PREROUTING.
La sintassi è la seguente:

iptables -t nat -A PREROUTING

-p (protocol {tcp | udp }) -d (inditizzo di destinazione nell’ header)

–destination-port (porta di destinazione nell’header)

-j REDIRECT -to-port (nuova porta di destinazione)
Un esempio pratico, potrebbe essere reindirizzare tutte le chiamate http alla porta 10000:

iptables -t nat -A PREROUTING -d 192.168.1.1 destination-port 80 -j REDIRECT -to-port 10000

Eccoci alla fine della nostra panoramica sul Network Address Translation, questo tutorial è stato scritto per fornire delle conoscenze per così dire pronte alla uso sulla funzione di NAT con iptables. Per saperne di più su iptables, vi rimando ai numerosi libri ed howto che sono stati scritti e che sono presenti su Internet.

Articoli correlati

Noleggia una Tesla per il tuo evento ICT!

Categorie