Wiesz już jak wybraæ pakiety do modyfikacji. By skompletowaæ naszą regułê, musimy poinformowaæ jeszcze kernel co zrobiæ z pasującymi pakietami.
Chcesz prowadziæ Źródłowy NAT, czyli zmieniaæ adresy źródłowe
połączeñ na coś innego. Dzieje siê to w łañcuchu POSTROUTING, tuż
przed tym jak pakiety zostają wysłane; jest to bardzo ważny szczegół,
ponieważ oznacza że cokolwiek innego na tej maszynie oglądając ten pakiet
(routing, filtrowanie pakietów) bêdzie widziało go w stanie
jeszcze niezmienionym. Oznacza to, że można również używaæ opcji
`-o
'.
Źródłowy NAT wykonuje siê przez wpisanie '-j SNAT
',
i dodanie opcji '--to-source
', która określa adres lub grupê
docelowych adresów IP; opcjonalnie można również wskazaæ numer lub
zakres numerów portów (ale tylko dla protokołów TCP i UDP).
## Zmieñ adres źródłowy na 1.2.3.4.
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4
## Zmieñ adres źródłowy na 1.2.3.4, 1.2.3.5 lub 1.2.3.6
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6
## Zmieñ adresy źródłowy 1.2.3.4, porty z zakresu 1-1023
# iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023
Jest to specjalizowana odmiana Źródłowego NATu: powinna byæ używana tylko jeśli masz dynamicznie przydzielany adres IP, tak jak podczas wdzwaniania siê (jeśli masz statycznie przydzielony IP, użyj SNAT tak jak opisano to powyżej).
Nie musisz podawaæ adresów źródłowych by wykonaæ maskaradê: użyje ona adresu źródłowego interfejsu przez który pakiety bêdą opuszczały maszynê. Ale co ważniejsze, jeśli połączenie wdzwaniane zostanie zamkniête, połączenia (które i tak już zostały zerwane) zostaną zapomniane, co oznacza mniej zgrzytów w momencie gdy ponownie siê wdzwonisz z nowym IP.
## Maskaraduj wszystko wychodzące przez ppp0.
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Wykonywany jest w łañcuchu PREROUTING, zaraz po tym jak pakiet
zostaje odebrany, co oznacza że cokolwiek innego na tej maszynie
bêdzie pracowaæ z pakietem (routing, filtrowanie pakietów), zobaczy
go już skierowanego do 'prawdziwego' adresu docelowego. Oznacza to
również, że można również używaæ opcji '-i
' (interfejs
wejściowy).
Docelowy NAT wskazuje siê przez podanie opcji '-j DNAT
' i
`--to-destination
' która określa pojedyñczy adres lub zakres adresów IP;
opcjonalnie można wskazaæ port lub zakres portów (ale tylko dla
protokołów TCP i UDP).
## Zmieñ adresy docelowe na 5.6.7.8
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8
## Zmieñ adresy docelowe 5.6.7.8, 5.6.7.9 lub 5.6.7.10
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8-5.6.7.10
## Zmieñ adresy docelowe ruchu WWW na 5.6.7.8, port 8080
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 \
-j DNAT --to 5.6.7.8:8080
Jest to specjalizowany przypadek DNAT: dodano go dla wygodny, ponieważ jest to dokładnie to samo co wykonanie DNAT na adres interfejsu wejściowego.
## Wyślij przychodzący ruch WWW na port 80 do naszego transparentnego proxy (squida)
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \
-j REDIRECT --to-port 3128
Zwróæ uwagê na to, że squid musi zostaæ skonfigurowany tak by wiedział że jest transparentnym proxy!
Jest trochê różnych subtelności w NAT z którymi wiêkszośæ użytkowników nigdy nie bêdzie miała do czynienia. Są one tu udokumentowane dla ciekawskich.
W momencie gdy poda siê zakres adresów IP, są one wybierane na podstawie ostatnio używanego IP dla połączeñ o których kod wie. Daje to coś na kształt prymitywnego rozkładania obciążenia.
Możesz użyæ celu '-j ACCEPT
' by pozwoliæ na przejście
połączenia bez wykonania NAT.
Domyślnym zachowaniem jest zmiana połączenia tylko na tyle ile potrzeba, w granicach reguły podanej przez użytkownika. Oznacza to że nie bêdziemy remapowaæ portów jeśli wprost tego nie zażądano, chyba że bêdzie to konieczne.
Nawet gdy dla danego połączenia nie wykonuje siê NAT, może siê okazaæ że zostanie wykonana translacja adresu źródłowego, w związku z tym że jest już jakieś połączenie używające tego portu. Rozważmy nastêpujący przykład maskarady, który jest dosyæ powszechny:
Kiedy odbywa siê takie mapowanie, porty dzielone są na trzy klasy:
Port nie zostanie nigdy zmapowany w tym przypadku do innej klasy.
Jeśli nie istnieje sposób by unikalnie zmapowaæ połączenie na żądanie użytkownika, zostanie ono odrzucone. Dotyczy to również pakietów nie sklasyfikowanych jako czêśæ istniejącego połączenia, ponieważ są zniekształcone, maszyna wyczerpała pamiêæ itd.
Możesz stworzyæ reguły NAT które mapują pakiety do tego samego zakresu; kod NAT jest na tyle mądry by uniknąæ konfliktów. Oznacza to że dwie reguły mapujące adresy źródłowe 192.168.1.1 i 192.168.1.2 na 1.2.3.4 bêdzą działaæ poprawnie.
Co wiêcej, możesz mapowaæ nawet na realne, używane adresy IP dopóki przechodzą one przez maszynê mapującą. Jeśli masz zatem przydzieloną sieæ (1.2.3.0/24), ale masz jedną sieæ wewnêtrzną używającą tych adresów i jedną używającą zakresu adresów prywatnych 192.168.1.0/24, możesz po prostu wykonaæ NAT na adresy źródłowe 192.168.1.0/24 do sieci 1.2.3.0, bez strachu że coś rozsypie:
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \
-j SNAT --to 1.2.3.0/24
Ta sama logika dotyczy adresów używanych przez samą maszynê prowadzącą NAT: tak właśnie działa maskarada (współdzieląc adres interfejsu pomiêdzy pakiety maskaradowane a 'prawdziwe' pakiety wychodzące z tej maszyny).
Co wiêcej, możesz mapowaæ te same pakiety na wiele maszyn docelowych, i bêdą one współdzielone. Na przykład, jeśli nie chcesz mapowaæ niczego na 1.2.3.5 możesz napisaæ:
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \
-j SNAT --to 1.2.3.0-1.2.3.4 --to 1.2.3.6-1.2.3.254
Kod wykonujący NAT pozwala na wstawianie reguł wykorzystujących cel DNAT do łañcucha OUTPUT, ale nie jest to w pełni obsługiwane w wersji 2.4 (może byæ, ale wymaga to nowych opcji konfigurujących, testowania i trochê kodu do dopiania, wiêc jeśli ktoś nie zleci tego Rusty'emu nie spodziewałbym siê tego szybko).
Aktualne ograniczenie polega na tym, że możesz zmieniaæ tylko adres docelowy na maszynê lokalną (tzn. '-j DNAT --to 127.0.0.1'), a nie na dowolną inną, ponieważ odpowiedzi nie bêdą prawidłowo tłumaczone.