Poslužitelj se preselio na novu adresu, klijenti se još povezuju, a ništa od onoga što pošalju ne stiže do interneta. Ta podjela je trag: socket koji sluša i prosljeđivanje porta preživjeli su selidbu, pa se tunel podigne, dok prevođenje izvora primijenjeno na proslijeđene pakete još navodi adresu koju host više ne posjeduje. Odgovori na te prepisane pakete idu prema stroju kojeg više nema.

Povezivanje i prosljeđivanje padaju na različitim mjestima

Uspostavljanje zavisi od odredišta koje klijenti već znaju: javne adrese, prosljeđivanja porta ispred nje i slušatelja unutra. Proslijeđeni promet zavisi od druge odluke donesene nakon što paket uđe u tunel, kada host prepiše svoj izvor kako bi odgovori mogli naći put natrag.

Promjena adrese kvari samo drugu odluku, i zato se simptom čita kao "povezano ali bez interneta". To objašnjava i zašto uobičajene provjere na strani klijenta izgledaju zdravo: rukovanje se završi, klijent dobije adresu, a ping na tunelsku adresu poslužitelja može čak i odgovoriti. Sati se troše na klijentu zbog kvara koji živi na drugoj strani, zato je tablica pravila prvo mjesto za pogledati.

Pročitajte pravilo i njegove brojače prije izmjene

Izlistajte pravila prevođenja s brojačima i usporedite konfigurirani izvor s adresama koje host zaista drži. Pravilo prepisano na mrtvu adresu obično pokazuje promet na ulaznom putu, jer paketi do njega stižu i prevode se, a na povratnom putu ništa.

sudo iptables -t nat -L POSTROUTING -n -v --line-numbers
ip -4 addr show

Provjerite tri polja dok ste tamo: skup u podudaranju izvora, izlazno sučelje ako ga pravilo navodi, i izuzetak koji čuva promet između tunela od prepisivanja. Taj je izuzetak lako izgubiti tijekom izmjene, a njegov gubitak čini da promet između partnera izgleda ispravno dok njegovi odgovori idu čudnim putem.

Ako brojači stoje na nuli, paketi nikada ne stižu do ovog pravila i adresa nije trenutni problem. Potražite konkurentno pravilo ranije u lancu, što se događa kada netko doda zamjenu umjesto da uredi original. Usporedite brojeve pravila s izlazom koji ste zapisali prije minute. Redoslijed je dio konfiguracije, a ne kozmetički detalj.

Zamijenite izvor ili prestanite da ga navodite

Kada host ima stabilnu adresu, zamijenite pravilo na mjestu umjesto da dodajete još jedno. Zamjena po broju pravila čuva redoslijed od kojeg zavisi ostatak lanca.

sudo iptables -t nat -R POSTROUTING 1 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-source 10.151.0.40

Kada se adresa dodjeljuje dinamički, ne navodite nikakav izvor i pustite jezgru da izabere trenutni s izlaznog sučelja. Ta varijanta preživi sljedeću selidbu bez izmjene, po cijeni skrivanja koja je adresa korištena.

sudo iptables -t nat -R POSTROUTING 1 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -o eth0 -j MASQUERADE

Potvrdite da je prosljeđivanje IPv4 još omogućeno kroz upravljanu konfiguraciju, pa učinite pravilo trajnim mehanizmom same distribucije. Izmjena napravljena samo u pokrenutoj jezgri vraća se sa sljedećim ponovnim pokretanjem, obično tijekom prozora održavanja koji nitko ne povezuje s promjenom.

Dva načina da zamjenu napravite pogrešno

Prevođenje skupa na tunelsku adresu poslužitelja umjesto na njegovu LAN adresu šalje odgovore ravno natrag u tunel, gdje se usmjeravaju prema klijentu koji ih nikada nije tražio. Veza stane na način koji izgleda kao petlja usmjeravanja, jer to i jest.

Nagomilavanje drugog prevođenja iznad starog je druga pogreška. Prvo pravilo koje se podudari pobjeđuje, pa zastarjeli unos nastavlja obrađivati pakete dok se ne izbriše, a brojači novog pravila ostaju na nuli dok svi krive zamjenu. Izbrišite duplikat prije nego što dodate bilo što novo. Zatim pročitajte popis još jednom i potvrdite da se sa skupom podudara točno jedno prevođenje.

Ako tunel nosi i IPv6, ponovite cijeli pregled na drugom stogu. IPv6 zadana ruta bez prevođenja i bez usmjerenog prefiksa pada jednako tiho, a to je lako zaboraviti jer sve iznad izgleda identično.

Dolazne usluge trebaju suprotno prevođenje

Usluga na VPN klijentu koja mora biti dostupna izvana treba prevođenje odredišta, a ne izvora: javni port se prepisuje na tunelsku adresu klijenta prije nego uđe. Put prosljeđivanja zatim treba izričito pravilo koje dopušta taj promet.

sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.9.8.2:8080

Nikada ne prevodite port koji nosi sam tunel, jer to prepisivanje prekida vezu koja drži uslugu dostupnom. Držite tunelski port potpuno izvan pravila odredišta. Na kraju provjerite s oba kraja: brojači na novom pravilu, kratak snimak na tunelskom uređaju i jedan zahtjev na adresu unutar tunela prije nego što probate javnu.

Povezani članci