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 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) i OUTPUT (dla DNAT, dla pakietów generowanych lokalnie).
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.
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.
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 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
).