Izbacivanje jednog porta iz VPN-a zahtijeva usmjeravanje po politici
NAT pravilo prepisuje adrese, ali ne bira izlazno sučelje. Evo pravila, tablice i oznake koje doista drže jedan TCP port izvan tunela.
Zahtjev je uvijek varijanta iste rečenice: zadrži VPN za pregledavanje, ali pusti SSH ili posao sigurnosne kopije da koristi normalnu vezu. Savjet koji o tome kruži, prosljeđivanje porta pomoću iptables NAT pravila, to ne radi. NAT pravilo prepisuje adrese i portove unutar toka; nikada ne bira kroz koje sučelje paket izlazi. Ta odluka pripada pretrazi ruta, a pretraga ruta treba pomoć da vidi port.
Zašto obična ruta ne može odgovarati portu
Linux bira rutu tražeći odredišnu adresu u tablici, nakon što kandidat-tablice filtrira kroz pravila politike. Ta pravila mogu odgovarati oznaci vatrozida, izvornoj adresi, dolaznom sučelju ili UID-u. Sam zapis rute nema polje porta jer se ruta bira prije nego što zaglavlje prijevoza postane važno.
Suvremeni iproute2 i jezgre proširuju birač pravila: ipproto, sport i dport prihvaćaju se, pa ip rule add ipproto tcp dport 22 table 100 izražava namjeru u jednom retku. Pokrenite ip rule add help na stvarnom hostu da vidite navodi li vaša gradnja dport. Ako navodi, gotovi ste jednom naredbom; ako ne navodi, put preko oznake ispod je ekvivalent.
U svakom slučaju pravilo je samo pokazivač. Tablici 100 ipak treba ruta, i to je dio koji ljudi zaboravljaju.
Tri dijela ili jedan
Suvremeni oblik je jedno pravilo gore plus ruta u alternativnoj tablici. Klasični oblik u sredinu dodaje netfilter: označi paket, pa usporedi oznaku u pravilu. Oba završavaju na istoj pretrazi; razlikuju se po tome gdje se port čita.
Pristup s oznakom postoji zato što netfilter vidi zaglavlje prijevoza, a rutirajući kod ga povijesno nije vidio. To je cijeli mehanizam i objašnjava zašto je rezervni put tri dijela koja surađuju, a ne jedna domišljata naredba.
Tri dijela po redu
Prvo, označite tokove koje želite preusmjeriti, u lancu koji se izvršava dovoljno rano da oznaka postoji prije odluke o ruti:
nft add table inet vpnexempt
nft 'add chain inet vpnexempt out { type route hook output priority mangle; }'
nft add rule inet vpnexempt out tcp dport 22 meta mark set 0x1Drugo, pošaljite označene pakete u zasebnu tablicu:
ip rule add fwmark 0x1/0x1 table 100Treće, dajte toj tablici zadanu rutu kroz fizičku vezu. Adrese su ilustrativne; zamijenite ih svojima:
ip route add default via 192.168.1.1 dev wlan0 table 100Preskočite treći korak i označeni paket ne nalazi rutu u tablici 100, pa pada. Simptom izgleda kao da je pravilo pokvarilo mrežu, dok je zapravo uklonilo jedini put koji je paketu ostao.
Što ga održava nakon prvog paketa
Oznake vrijede za odlazne pakete. Odgovor stiže na fizičko sučelje s adresom koju je ta veza dodijelila, a glavna tablica možda još preferira tunel za to odredište. Dva mehanizma drže put odgovora dosljednim: pravilo zasnovano na izvoru za adresu veze i praćenje veza koje čuva odluku za cijeli životni vijek toka. Spremanje oznake u conntrack i njeno vraćanje pri odgovoru uobičajen je način da stanjna iznimka ostane stabilna.
Filtriranje obrnutog puta drugi je tihi ubojica. Ako jezgra strogo provjerava povratni put i odgovor stigne na sučelje koje glavna tablica ne bi odabrala, paket se odbacuje bez poruke. rp_filter zadane vrijednosti razlikuju se po distribuciji i po tome preusmjerava li se sučelje, zato pročitajte stvarnu vrijednost umjesto da pretpostavite da je isključena.
Ne označavajte vlastiti prijevoz tunela. WireGuard ili UDP OpenVPN tunel nije TCP 22, pa je recept gore siguran, ali iznimka napisana kao sve osim odredišta tunela može uhvatiti šifrirane pakete i slomiti tunel na način koji izgleda kao petlja usmjeravanja.
Provjerite umjesto da pretpostavljate
Pitajte jezgru kojim bi putem išla, za odredište i za port, pa pokrenite stvarni prijenos:
ip route get 203.0.113.10
ip rule show
nft list rulesetAko oznaka postoji ali se brojači nikad ne pomiču, pravilo ne odgovara. Brojači su razlika između konfiguracije koju ste napisali i politike koju jezgra primjenjuje.
Kada je ovo pogrešan alat
Iznimke zasnovane na portu krte su po prirodi. Servisi mijenjaju portove, HTTP/3 dolazi kao UDP 443, a jedna aplikacija može otvoriti nekoliko tokova različitih vrsta. Ako je stvarni zahtjev da ovaj program koristi normalnu vezu, sloj usmjeravanja pogrešno je mjesto; mrežni prostor imena ili proxy za pojedinu aplikaciju bolje pristaju.
Ako je zahtjev da ova podmreža koristi normalnu vezu, potpuno preskočite oznake i dodajte konkretniju rutu. Jednostavnije je, vidljivo u jednoj tablici i sljedeća osoba može ga provjeriti bez čitanja skupa pravila.
Zapišite koji od tri zahtjeva zapravo imate prije nego što dirnete vatrozid. Mehanizam gore je precizan, a preciznost primijenjena na pogrešan sloj samo je dulji prekid.