NAT pravilo koje je trebalo dati jednom bazenu VPN klijenata njegovu vlastitu javnu adresu stoji na nula paketa, dok isti bazen i dalje izlazi pod pogrešnim izvorom. Pravilo obično nije pogrešno u vezi s adresom; pogrešno je u vezi s interfejsom. -o eth0:0 upućuje na uređaj koji ne postoji, jer eth0:0 je oznaka vezana za adresu, a uređaj te adrese je eth0. Praćenje brojača najbrži je način da to potvrdite, a ispravka je manja nego što istraga sugeriše.

Provjerite kako jezgro zove uređaj

Pročitajte dva prikaza odvojeno prije nego što išta promijenite:

ip link show
ip address show dev eth0
ip route get 203.0.113.20

Popis linkova prikazuje interfejse. Popis adresa može prikazati drugu adresu IPv4 koja nosi oznaku: eth0:0, a uređaj za tu adresu je i dalje eth0. Priručnik za adrese u iproute2 tretira oznaku kao ime adrese, a ne kao drugi link, i upravo na tom razlikovanju počiva cijeli problem.

Historija objašnjava zabunu. Stara sintaksa ifconfig eth0:0 je zaista izgledala kao novi interfejs, a skripte iz tog doba i dalje se pozivaju na jedan. Na savremenom sistemu alias je oznaka na adresi i ništa na putu rutiranja ili netfiltera ne tretira ga kao zasebnu izlaznu točku.

Provjerite šta je pravilo zaista pogodilo

Čitajte brojače uz popis pravila, a ne po sjećanju:

iptables -t nat -L POSTROUTING -v -n --line-numbers

Pravilo čiji brojač paketa ostaje na nuli dok odgovarajući saobraćaj teče ne evaluira se, a uslov izlaznog interfejsa koji imenuje eth0:0 češće je uzrok. Izlazni uređaj koji je odabrala ruta je eth0, pa uslov koji traži drugo ime nikada ne postaje istinit, bez obzira na to koju je izvornu adresu jezgro odabralo.

Promijenite uslov na stvarni uređaj i ostavite oznaku izvan njega. Ako treba razlikovati dva bazena klijenata koji dijele taj uređaj, razlikujte ih po prefiksu izvora, a ne po imenu interfejsa koje ne može postojati. Dva pravila s nepreklapajućim -s podudaranjima su čitljiva i provjerljiva; jedno pravilo s izmišljenim uređajem nije ni jedno ni drugo. Dajte svakom pravilu komentar koji imenuje bazen, jer za šest mjeseci samo prefiks nikome neće reći zašto je tu.

Provjerite rutu koja je odabrala uređaj

Postrouting NAT se izvršava nakon što je ruta već odabrala izlazni interfejs, pa interfejs u pravilu mora biti onaj koji je ruta odabrala. Pitajte jezgro direktno pomoću ip route get za reprezentativnu adresu klijenta i pročitajte i uređaj i izvor koji prijavljuje.

Ako odgovor imenuje eth0, dio s interfejsom je riješen. Ako imenuje tunelski uređaj, paket nikada ne stiže do pravila koje uređujete, a pretraga se seli na tablicu rutiranja i njene prioritete. Pravilo koje nikada ne odgovara jer je paket otišao drugdje izgleda u izlazu brojača isto kao pravilo s pogrešno napisanim uređajem. Potvrdite koji od ta dva slučaja imate prije nego što išta uredite, jer drugi zahtijeva promjenu rutiranja, a ne promjenu teksta.

Svjesno odaberite prevedeni izvor

Kada je uređaj ispravan, izvorna adresa je zasebna odluka. Ovo je ilustrativni bazen IPv4 i samo primjer adrese:

iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 \
  -j SNAT --to-source 203.0.113.20

Upisivanje adrese u --to-source ne čini da je bilo ko rutira natrag prema vama. Uzvodni provajder ili vlasnik adrese mora dostavljati odgovore za tu adresu ovom hostu, a adresa mora biti ona koju ste ovlašteni koristiti. Ako nije, pravilo će se podudariti i prevesti, a odgovori će i dalje ići negdje drugo.

Promjena izvorne adrese nije isto što i promjena uzlaznog linka. Kada je stvarni zahtjev drugačiji fizički put, politika rutiranja prvo mora odabrati taj put; SNAT zatim prepisuje izvor na uređaju koji je politika odabrala. Dodavanje još oznaka na eth0 ne daje ni rutu ni ovlaštenje.

Provjerite na vezi koju ste upravo otvorili

Otvorite novu klijentsku vezu umjesto da ponovo koristite postojeću. Praćenje veza čuva prijevod koji je zabilježilo kada je tok počeo, pa stara sesija može nastaviti koristiti prethodnu izvornu adresu i učiniti da ispravno novo pravilo izgleda pokvareno. Gledajte kako brojač raste, zatim promatrajte prevedeni izvor na žici ili na udaljenom kraju.

Za nekoliko bazena koji dijele jedan interfejs, dajte svakome izričito podudaranje izvora i vlastitu adresu prijevoda, držite ih u upravljanoj konfiguraciji firewalla i zabilježite redoslijed kojim se evaluiraju. Zatim zabilježite šta ste provjerili: uređaj iz ip route get, brojač koji se pomjerio i izvor koji je udaljena strana vidjela. Taj zapis odgovara na sljedeći izvještaj bez ponavljanja zabune s aliasom.

Povezani članci