NAT (Network Address Translation) w Linuksie można zrobić
na dwa sposoby:
Oryginalna dokumentacja Netfilter w języku angielskim
Najlepszym sposobem jest wykorzystanie możliwości
netfilter, gdyż wykonuje
on nat przed (PREROUTING) lub po
(POSTROUTING) routingu, co daje nam możliwość
tak skonfigurowania firewalla, jak by nie było wykonywane NAT.
NAT w iptables tworzymy dodając regułki
do tabeli "nat". Żeby sprawdzić jakie są dostępne "Chains"
w tabeli nat, należy wykonać takie polecenie:
W poniższych przykładach założyliśmy, że 1.2.3.4 jest adresem IP
podniesionym na interfejsie zewnętrznym ($if_wan) zaś 192.168.1.0/16
to adresy na interfejsie sieci lokalnej ($if_lan).
DNAT
W PREROUTING są regułki do wykonania DNAT (Destination NAT).
Zamienia to adres hosta docelowego na nasz prywatny, w ten
sposób możemy przekierować ruch na dowolny host w sieci
prywatnej:
# iptables -t nat -A PREROUTING -d 1.2.3.4 -j DNAT --to 192.168.1.2 |
Można określić na jakim interfejsie będzie wykonany NAT
poprzez opcję -i $inteface. Opcja -o w PREROUTING nie jest
dostępna.
Możemy też dokonać przekierowania ruchu kierowanego na konkretny
port, zwanego potocznie przekierowaniem portu:
# iptables -t nat -A PREROUTING -i $if_wan -p TCP -d 1.2.3.4 --dport 8000 -j DNAT --to 192.168.1.11:80 |
SNAT i MASQUERADE
SNAT (Source NAT) zmienia to adres nadawcy np. z puli adresów
prywatnych na adres z puli publicznej, co jest wykorzytywane zwykle
do "dzielenia łącza".
# iptables -t nat -A POSTROUTING -s 192.168.1.2 -j SNAT --to 1.2.3.4 |
Jeśli podamy maskę podsieci, zostanie wykorzystana większa ilość
adresów.
MASQUERADE wykonuje to samo co SNAT z tym, że na adres interfejsu
jakim wychodzi pakiet. Używać go należy tylko kiedy nasz adres
publiczny zmienia się. (np. w połączeniach ze zmiennym IP
publicznym)
Zakończenie.
Po ustawieniu DNAT na adres wewnętrzny zauważymy, że jest problem z
dostępem do ip 1.2.3.4 z wewnątrz sieci. Dzieje się tak dlatego,
że adres source zostaje bez zmian, dlatego też pakiet nie wraca
do bramy. Musimy więc zmusić, aby host wysyłał
odpowiedź do bramy. Możemy wykonać to w następujący sposób:
# iptables -t nat -A POSTROUTING -o $if_lan -s 192.168.0.0/16 \
-d 1.2.3.4 -j SNAT --to 192.168.0.1 |
Gdzie $if_lan to interfejs lokalnej sieci, a 192.168.0.1 to adres na
tym interfejsie.
|