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).