Nastny Poprzedni Spis Trei

6. Określanie jak zmieniaæ pakiety

Wiesz już jak wybraæ pakiety do modyfikacji. By skompletowaæ naszą regułê, musimy poinformowaæ jeszcze kernel co zrobiæ z pasującymi pakietami.

6.1 Źródłowy NAT

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

Maskarada

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

6.2 Docelowy NAT

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

Przekierowywanie (ang. redirection)

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!

6.3 Wiêcej o mapowaniach

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.

Wybór wielu adresów z zakresu

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.

Wykonywanie pustych mapowañ NAT

Możesz użyæ celu '-j ACCEPT' by pozwoliæ na przejście połączenia bez wykonania NAT.

Standardowe zachowanie 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.

Mapowanie portów źródłowych wynikające z innych połączeñ

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:

  1. Nawiązywane jest połączenie przez maszynê 192.1.1.1 z portu 1024 do maszyny www.netscape.com na port 80.
  2. Połączenie jest maskaradowane przez maszynê prowadzącą NAT i używa jej adresu IP (1.2.3.4).
  3. Maszyna ta stara siê wykonaæ połączenie do www.netscape.com na port 80 z 1.2.3.4 (swojego adresu zewnêtrznego) z portu 1024.
  4. Kod NAT zmieni port źródłowy drugiego połączenia na 1025 tak by te dwa porty nie kolidowały ze sobą.

Kiedy odbywa siê takie mapowanie, porty dzielone są na trzy klasy:

Port nie zostanie nigdy zmapowany w tym przypadku do innej klasy.

Co dzieje siê gdy NAT zawiedzie

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.

Wiele mapowañ, nakładanie siê i konflikty

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

Zmiana adresu docelowego dla lokalnie generowanych połączeñ

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.


Nastny Poprzedni Spis Trei