Linux 2.4 NAT HOWTO.pdf

(261 KB) Pobierz
file://J:\linux24-nat.html
mr0vka.eu.org
Linux 2.4 NAT HOWTO
Rusty Russell, lista pocztowa netfilter@lists.samba.org
Wersja oryginalna: 1.18, 2002/01/14 09:35:13
Oryginał tego dokumentu znajduje się pod adresem: http://netfilter.samba.org/unreliable-guides/NAT-
HOWTO/index.html
Tłumaczenie: Łukasz Bromirski, l.bromirski@mr0vka.eu.org
Wersja tłumaczenia: 2.9, $Date: 2002/08/29 21:59:17 $
Oryginał tłumaczenia znajduje się pod adresem: http://mr0vka.eu.org/tlumaczenia/linux24-nat.html
Dokument ten opisuje jak wykonać maskaradę, transparentne proxy, przekazywanie portów i inne formy NAT w pracy z
linuksowymi kernelami 2.4.
1. Wprowadzenie
Witam, szanowny czytelniku.
Właśnie zanurzasz się w fascynujący (choć czasami koszmarny) świat NAT: Translacji Adresów Sieciowych, a ten
dokument HOWTO będzie dla Ciebie w miarę dokładnym przewodnikiem, do tego i nie tylko, tematu dla kernela
linuksa 2.4.
W linuksie 2.4 dodano infrastrukturę do manipulowania pakietami nazwaną 'netfilter'. Warstwa zbudowana na jej
fundamentach zapewnia NAT, kompletnie przepisany w porównaniu do poprzednich kerneli.
(C) 2000 Paul `Rusty' Russell. Na licencji GNU GPL.
2. Gdzie znajduje się oficjalna strona WWW i lista?
Są trzy oficjalne strony:
z Dzięki Filewatcher .
z Dzięki Zespołowi Samba i SGI .
z Dzięki Harald'owi Welte .
Możesz osiągnąć je korzystając z mechanizmu round-robin DNS, posługując się adresami http://www.netfilter.org/ i
http://www.iptables.org/ .
Oficjalna lista pocztową netfilter znajduje się na serwerze list Samba .
2.1 Co to jest Translacja Adresów Sieciowych (NAT)?
Zwykle, pakiety podróżują od źródła (takiego jak twój komputer) do swojego przeznaczenia (takiego jak
www.gnumonks.org) przez wiele różnych połączeń: około 19 stąd gdzie jestem, w Australii. Żaden z tych węzłów nie
zmienia twojego pakietu: po prostu przesyła go dalej.
Jeśli jeden z tych węzłów miałby wykonać NAT, zmieniłby adres źródłowy lub przeznaczenia w trakcie jak pakiet
przechodziłby przez niego. Jak sobie pewnie wyobrażasz, nie jest to sposób w jaki system miał działać, i w związku z
tym używanie NAT jest zawsze trochę ryzykowne. Zwykle węzeł który wykonuje NAT zapamięta sposób w jaki zmienił
pakiet i kiedy nadejdzie odpowiedź na niego, wykona odwrotne czynności tak, by wszystko działało.
47140860.002.png
mr0vka.eu.org
2.2 Po co miałbym stosować NAT?
W idealnym świecie, nie byłoby powodu. Ale, głównymi powodami są:
Modemowe połączenie do Internetu
Większość ISP (dostawców internetowych) daje ci jeden IP gdy się do nich wdzwaniasz. Możesz wysyłać pakiety
z dowolnym adresem źródłowym, ale tylko odpowiedzi przeznaczone do tego konkretnego IP który został Ci
przydzielony dotrą z powrotem do Ciebie. Jeśli chcesz używać wielu komputerów (jeśli posiadasz na przykład
sieć w domu) i zapewnić im dostęp do Internetu, będziesz potrzebował NAT.
Aktualnie jest to najczęstsze zastosowanie NAT, znane pod nazwą 'masquerading' w świecie linuksa. Nazywam
to SNAT, ponieważ zmieniasz adres źródłowy pierwszego pakietu ( Source-NAT , czyli Źródłowa Translacja
Adresów - przypomnienie tłum.).
Wiele serwerów
Czasami chcesz zmienić sposób w jaki pakiety rozprowadzane są w twojej sieci. Zwykle dzieje się tak ponieważ
masz jeden adres IP, ale chciałbyś by ludzie mogli się dostać do maszyn w środku sieci tak jakby miały
'prawdziwe' adresy IP. Jeśli zmienisz adres przeznaczenia przychodzących pakietów, możesz to osiągnąć. Ten typ
NAT nazywany był w dotychczasowych wersjach Linuksa przekazywaniem portów (ang. port-forwarding ).
Najczęstszym rodzajem tego sposobu jest rozkładanie obciążenia (ang. load-sharing ), mapowanie wskazuje
wtedy na listę maszyn które dzielą się nadchodzącymi wywołaniami. Jeśli zamierzasz robić coś takiego na
poważnie, warto zajrzeć pod adres linuksowego serwera wirtualnego .
Transparentne Proxy
Czasami chcesz udawać że każdy pakiet który przechodzi przez twój komputer z Linuksem, przeznaczony jest do
jakiejś aplikacji uruchomionej właśnie na nim. Używa się tego do tworzenia transparentnych proxy: proxy to
program który pośredniczy w wymianie informacji między twoją siecią a światem zewnętrznym.
Transparentnych dlatego, że twoja sieć nie wie nawet że rozmawia z proxy, dopóki oczywiście proxy działa.
Można tak skonfigurować Squida, i nazywa się to przekierowywaniem (ang. redirection ) lub transparentnym
proxy we wcześniejszych wersjach Linuksa.
3. Dwa typy NAT
Dzielę NAT na dwa rodzaje: Źródłowy NAT (SNAT) i Docelowy NAT (DNAT).
SNAT ma miejsce wtedy, gdy zmieniasz adres źródłowy pierwszego pakietu: tzn. kiedy zmieniasz adres maszyny z
której inicjowane jest połączenie. SNAT wykonywany jest zawsze po routingu (ang. post-routing ), tuż przed tym jak
pakiet opuści maszynę po kablu. Masquerading jest specjalizowaną formą SNAT.
DNAT ma miejsce wtedy, gdy zmieniasz adres docelowy pierwszego pakietu: tzn. kiedy zmieniasz adres maszyny do
której ma dotrzeć połączenia. DNAT wykonywany jest zawsze przed routingiem, w momencie gdy pakiet zostaje
odebrany z łącza. Przekazywanie portów, rozkładanie obciążenia i transparentne proxy to wszystko różne rodzaje
DNAT.
4. Szybkie przejście z kerneli 2.0 i 2.2
Przepraszam wszystkich nadal zszokowanych po przejściu z 2.0 (ipfwadm) do 2.2 (ipchains). Są dobre i złe wiadomości
Przede wszystkim, możesz używać dalej ipchains i ipfwadm tak jak kiedyś. By to zrobić, musisz włączyć do kernela
( insmod ) moduły 'ipchains.o' lub 'ipfwadm.o' które znajdują się w najnowszej dystrybucji pakietu netfilter. Moduły
mogą być załadowane tylko rozłącznie (zostałeś ostrzeżony) i nie powinny być łączone z innymi modułami netfilter.
Kiedy już zainstalujesz jeden z tych modułów, możesz używać ipchains i ipfwadm tak jak do tej pory, z następującymi
różnicami:
47140860.003.png
mr0vka.eu.org
z Ustawienie czasu wygaśnięcia dla połączeń maskaradowanych opcjami ipchains -M -S lub ipfwadm -M -s
nic nie robi. Ponieważ jednak czasy wygasania dla nowej infrastruktury NAT są dużo dłuższe, nie powinno mieć
to znaczenia.
z Pola init_seq , delta i previous_delta w listingu szczegółowym maskarady są zawsze ustawione na zero.
z Zerowanie i listowanie liczników w tym samym momencie ' -Z -L ' nie działa: liczniki nie zostaną wyzerowane.
z Warstwa zapewniająca kompatybilność wstecz nie skaluje się zbyt dobrze dla dużych ilości połączeń: nie używaj
jej na firmowej bramie!
Hakerzey mogą również zauważyć, że:
z Możesz się teraz bindować do portów 61000-65095 nawet jeśli działa maskarada. Jej kod zakładał do tej pory że
w tym zakresie portów mógł się rządzić, więc programy nie mogły go używać.
z (Nieudokumentowana) opcja ' getsockname ', której programy pracujące jako transparentne proxy mogły użyć by
uzyskać prawdziwe adresy przeznaczenia połączeń już nie działa.
z (Nieudokumentowana) opcja ' bind-to-foreign-address ' również nie została zaimplementowana; była
używana to stworzenia kompletnej iluzji transparentnego proxy.
4.1 Ja chcę tylko maskarady! Ratunku!
Większość ludzi chce. Jeśli masz dynamicznie przydzielany IP podczas wdzwaniania się po PPP (jeśli nie wiesz o co
chodzi to zapewne tak właśnie jest), możesz po prostu powiedzieć swojej maszynie że wszystkie pakiety wychodzące z
twojej sieci wewnętrznej powinny być zmieniane tak, by wyglądały jak pakiety wychodzące z komputera
wdzwaniającego się.
# Załaduj moduł NAT (usuwa inne).
modprobe iptable_nat
# W tabeli NAT (-t nat), dodaj regułę (-A) po routingu
# (POSTROUTING) dla wszystkich pakietów wychodzących przez ppp0 (-o ppp0)
# która mówi by prowadzić maskaradowanie połączenia (-j MASQUERADE).
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
# Włącz przekazywanie IP
echo 1 > /proc/sys/net/ipv4/ip_forward
Zauważ że nie prowadzimy tutaj żadnego filtrowania pakietów: jeśli chcesz je zastosować, przeczytaj Filtrowanie
Pakietów HOWTO a w szczególności sekcję: 'Łączenie NAT i filtrowania pakietów'.
4.2 A co z ipmasqadm?
Istnieje dużo mniejsza liczba użytkowników, więc specjalnie nie przejmowałem się wsteczną kompatybilnością. Możesz
po prostu użyć ' iptables -t nat ' by wykonywać przekazywanie portów. Na przykład, dla Linuksa 2.2 mógłbyś
zrobić:
# Linux 2.2
# Przekaż pakiety TCP kierowane do portu 8080 na 1.2.3.4 do 192.168.1.1 na port 80
ipmasqadm portfw -a -P tcp -L 1.2.3.4 8080 -R 192.168.1.1 80
A teraz zrobisz:
# Linux 2.4
# Dodaj regułę przed routingiem (-A PREROUTING) do tabeli NAT (-t nat) mówiącą, że
# pakiety TCP (-p tcp) kierowane do 1.2.3.4 (-d 1.2.3.4) na port 8080 (--dport 8080)
# mają być zmapowane (-j DNAT) na 192.168.1.1, port 80 (--to 192.168.1.1:80).
iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 8080 \
-j DNAT --to 192.168.1.1:80
5. Kontrolowanie tego, co poddawać NAT
Musisz stworzyć takie reguły NAT, by kernel wiedział które połączenia poddawać modyfikacjom i jak to robić. By tego
dokonać, używamy bardzo szczegółowego narzędzia iptables i wskazujemy kernelowi jak zmienić tabelę NAT przez
47140860.004.png
mr0vka.eu.org
podanie opcji ' -t nat '.
Tabela NAT zawiera dwie listy zwane 'łańcuchami' (ang. chains ): każda reguła w takiej liście jest sprawdzana dopóki
któraś nie pasuje. Te dwa łańcuchy nazywają się: PREROUTING (dla DNAT, ponieważ pakiety najpierw do nas
docierają), POSTROUTING (dla SNAT, po którym pakiety opuszczają nasz system). Trzeci, OUTPUT (dla DNAT) jest
tu ignorowany.
Poniższy rysunek ilustrowałby to dosyć dobrze gdybym miał choć trochę talentu artystycznego:
_____ _____
/ \ / \
PREROUTING -->[Decyzja ]----------------->POSTROUTING----->
\D-NAT/ [Rutingu ] \S-NAT/
| ^
| |
| |
| |
| |
| |
| |
--------> Local Process ------
W każdym z węzłów powyżej, gdy dociera do niego pakiet, sprawdzane jest z jakim połączeniem jest skojarzony. Jeśli
jest to nowe połączenie, sprawdzamy odpowiedni łańcuch w tabeli NAT by sprawdzić co mamy z nim zrobić.
Odpowiedź której udziela tabela dotyczyć będzie wszystkich przyszłych pakietów dla tego połączenia.
5.1 Proste przykłady z użyciem iptables
iptables pobiera pewną liczbę standardowych opcji tak jak podano to niżej. Wszystkie opcje z podwójnym znakiem
minus mogą być skrócone, tak długo jak iptables może je rozróżnić od innych możliwych znaczeń. Jeśli twój kernel
ma wkompilowaną obsługę iptables jako moduł, musisz go najpierw załadować: ' insmod ip_tables '.
Najważniejszą opcją jest wybierająca tabelę, ' -t '. Dla wszystkich operacji które dotyczą NAT, używać będziesz opcji ' -t
nat '. Drugą ważną opcją jest ' -A ', która służy do dodawania nowej reguły na koniec łańcucha (np. ' -A POSTROUTING '),
oraz ' -I ', która służy do dodawania jej na początku (np. ' -I PREROUTING ').
Możesz podawać adresy źródłowe (' -s ' lub ' --source ') i docelowe ( ' -d ' lub ' --destination ' ) pakietów których ma
dotyczyć NAT. Opcjom tym może towarzyszyć pojedyńczy adres IP (np. 192.168.1.1), nazwa (np. www.gnumonks.org)
lub adres sieci (np. 192.168.1.0/24 albo 192.168.1.0/255.255.255.0).
Możesz również wskazać interfejs wejściowy ( ' -i ' lub ' --in-interface ' ) lub wyjściowy ( ' -o ' lub ' --out-
interface '), ale który konkretnie zależy również od tego który łańcuch wskażesz: w łańcuchu PREROUTING możesz
wskazać tylko interfejs wejściowy, a w łańcuchu POSTROUTING możesz wskazać tylko interfejs wyjściowy. Jeśli
użyjesz niewłaściwego, iptables zwrócą błąd.
5.2 Dokładniejsze informacje o wyborze pakietów do modyfikowania
Powiedziałem wyżej, że możesz wskazać adresy źródłowe i docelowe. Jeśli ominiesz adres źródłowy, pasować będzie
każdy adres źródłowy. Jeśli pominiesz adres docelowy, pasować będzie każdy adres docelowy.
Możesz również wskazać konkretny protokół ( ' -p ' lub ' --protocol ' ), taki jak TCP czy UDP; pasować będą pakiety
tylko z tego protokołu. Głównym powodem dla którego chciałbyś wskazać konkretny protokół jest to, że z każdym z
nich skojarzone są dodatkowe opcje: w szczególności ' --source-port ' i ' --destination-port ' (które można skrócić
do ' --sport ' i ' --dport ').
Opcje te pozwalają ci określić o jakie pakiety chodzi z dokładnością do portu źródłowego i docelowego. Jest to
użyteczne w przekazywaniu na przykład wywołań do serwerów WWW (port TCP 80 lub 8080) i jednocześnie pomijaniu
innych pakietów.
Opcjom tym musi towarzyszyć opcja ' -p ' (która ma ten skutek uboczny, że doładowywuje współdzielone rozszerzenie
biblioteczne dla konkretnego protokołu). Do wskazania numeru portu możesz używać numerów, lub nazw z
47140860.005.png
mr0vka.eu.org
pliku /etc/services .
Wszystkie sposoby na które możesz wskazać określony typ pakietów wyszczególnione zostały w podręczniku ( man
iptables ).
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 \
47140860.001.png
Zgłoś jeśli naruszono regulamin