Epuizarea adreselor IPv4 în cadrul rețelelor curente a condus la folosirea de adrese IP din clase private (de ex. 192.168.0.0/24
). Pe lângă comunicația dintre stațiile unei rețele, dorim și accesul la Internet al acestora. De aceea s-a introdus conceptul de translatare de adrese (NAT: Network Address Translation) prin care mai multe stații dispun de acces la Internet folosind aceeași adresă IP rutabilă: adresa gateway-ului. Activarea translatării de adrese (NAT) pe gateway conduce la înlocuirea perechii <adresă IP sursă, port sursă> (aparținând stației) cu perechea <adresa IP gateway, port disponibil>.
Configurarea NAT pe Linux se realizează tot prin intermediul comenzii iptables
, la fel ca în cazul configurării firewall-ului. Dacă pentru configurarea firewall-ului foloseam tabela filter
(tabela implicită a iptables
), pentru configurarea translatării de adrese vom folosi tabela nat
.
Astfel, pentru a activa NAT pe un server Linux executăm comanda
root@host:~# iptables -t nat -A POSTROUTING -j MASQUERADE
În comanda de mai sus:
-t
specifică tabela pe care se aplică regula, în cazul nostru tabela nat
.-A
înseamnă adăugarea unei reguli la sfârșitul listei de reguli.POSTROUTING
se referă la momentul când va fi realizat procesul de translatare de adrese: după rutare.iptables
acesta se numește și lanț (chain).-j
este acțiunea ce va fi luată, iar în acest caz este MASQUERADE
(acțiune simplă de translatare de adrese).
Pentru a verifica și valida regula, afișăm intrările din lanțul POSTROUTING
din tabela nat
folosind comanda
root@host:~# iptables -t nat -L POSTROUTING -n -v Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * * 0.0.0.0/0 0.0.0.0/0
Vrem să verificăm configurarea corectă a NAT. Pentru acesta vom trimite de pe stația red
un pachet către 8.8.8.8
. Pachetul va trece prin gateway (adică stația host
) și va fi translatat. Pe stația red
rulăm comanda
root@red:~# ping -c 2 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. From 192.168.1.2 icmp_seq=1 Destination Host Unreachable From 192.168.1.2 icmp_seq=2 Destination Host Unreachable --- 8.8.8.8 ping statistics --- 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 999ms
Observăm că nu există conectivitate de la stația red
către adresa IP 8.8.8.8
. Consultăm întreaga tabelă nat
:
root@host:~# iptables -t nat -L -n -v Chain PREROUTING (policy ACCEPT 2 packets, 168 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * * 0.0.0.0/0 0.0.0.0/0
Observăm că pachetele ajung în lanțul PREROUTING
(înainte de rutare), dar nu ajung în lanțul POSTROUTING
(după rutare). Ne gândim că este posibil să fie o problemă cu rutarea pe gateway. Verificăm dacă rutarea este activată:
root@host:~# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0
Într-adevăr, rutarea nu este activată. Pentru a activa rutarea pe stația host
rulăm comanda
root@host:~# sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1
Intrăm din nou pe stația red
și folosim ping
pentru a testa conectivitatea la adresa IP 8.8.8.8
:
root@red:~# ping -c 2 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_req=1 ttl=61 time=92.9 ms 64 bytes from 8.8.8.8: icmp_req=2 ttl=61 time=81.2 ms --- 8.8.8.8 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 81.272/87.094/92.917/5.829 ms
Acum există conectivitate, lucru certificat și de prezența unor pachete în lista prelucrată pe lanțul POSTROUTING
:
root@host:~# iptables -t nat -L POSTROUTING -n -v Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 2 168 MASQUERADE all -- * * 0.0.0.0/0 0.0.0.0/0