Izbacivanje jednog porta iz VPN-a zahtijeva usmjeravanje po politici
NAT pravilo prepisuje adrese, ali ne bira izlazni interfejs. Evo pravila, tabele i oznake koje zaista drže jedan TCP port izvan tunela.
Zahtjev je uvijek varijanta iste rečenice: zadrži VPN za pregledanje, ali pusti SSH ili posao sigurnosne kopije da koristi normalnu vezu. Savjet koji kruži o ovome, prosljeđivanje porta pomoću iptables NAT pravila, to ne radi. NAT pravilo prepisuje adrese i portove unutar toka; ono nikada ne bira kroz koji interfejs 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 tabeli, pošto kandidat-tabele filtrira kroz pravila politike. Ta pravila mogu odgovarati oznaci firewall-a, izvornoj adresi, dolaznom interfejsu ili UID-u. Sam zapis rute nema polje porta, jer se ruta bira prije nego što zaglavlje transporta postane važno.
Savremeni iproute2 i jezgra proširuju birač pravila: ipproto, sport i dport se prihvataju, pa ip rule add ipproto tcp dport 22 table 100 izražava namjeru u jednom redu. Pokrenite ip rule add help na stvarnom hostu da vidite navodi li vaša gradnja dport. Ako navodi, gotovi ste jednom komandom; ako ne navodi, put preko oznake ispod je ekvivalent.
U svakom slučaju pravilo je samo pokazivač. Tabeli 100 ipak treba ruta, i to je dio koji ljudi zaboravljaju.
Tri dijela ili jedan
Savremeni oblik je jedno pravilo iznad plus ruta u alternativnoj tabeli. Klasični oblik u sredinu dodaje netfilter: označi paket, pa uporedi 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 transporta, a rutirajući kod ga historijski nije vidio. To je cijeli mehanizam i objašnjava zašto je rezervni put tri dijela koja sarađuju, a ne jedna domišljata komanda.
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 tabelu:
ip rule add fwmark 0x1/0x1 table 100Treće, dajte toj tabeli 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 tabeli 100, pa pada. Simptom izgleda kao da je pravilo pokvarilo mrežu, dok je u stvari uklonilo jedini put koji je paketu ostao.
Šta ga održava nakon prvog paketa
Oznake važe za odlazne pakete. Odgovor stiže na fizički interfejs s adresom koju je ta veza dodijelila, a glavna tabela 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 stanjni izuzetak ostane stabilan.
Filtriranje obrnutog puta je drugi tihi ubica. Ako jezgro strogo provjerava povratni put i odgovor stigne na interfejs koji glavna tabela ne bi odabrala, paket se odbacuje bez poruke. rp_filter zadane vrijednosti razlikuju se po distribuciji i po tome preusmjerava li se interfejs, zato pročitajte stvarnu vrijednost umjesto da pretpostavite da je isključena.
Ne označavajte vlastiti transport tunela. WireGuard ili UDP OpenVPN tunel nije TCP 22, pa je recept iznad siguran, ali izuzetak napisan kao sve osim odredišta tunela može uhvatiti šifrirane pakete i slomiti tunel na način koji izgleda kao petlja rutiranja.
Provjerite umjesto da pretpostavljate
Pitajte jezgro kojim bi putem išlo, 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 pomjeraju, pravilo ne odgovara. Brojači su razlika između konfiguracije koju ste napisali i politike koju jezgro primjenjuje.
Kada je ovo pogrešan alat
Izuzetci zasnovani na portu krhki 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 rutiranja je pogrešno 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 je u jednoj tabeli i sljedeća osoba može ga provjeriti bez čitanja skupa pravila.
Zapišite koji od tri zahtjeva zapravo imate prije nego što dirnete firewall. Mehanizam iznad je precizan, a preciznost primijenjena na pogrešan sloj samo je duži prekid.