Obhod VPN za ena vrata zahteva usmerjanje po pravilniku
Pravilo NAT prepiše naslove, ne izbere pa odhodne povezave. Tu so pravilo, tabela in oznaka, ki resnično držijo ena vrata TCP izven tunela.
Zahteva je vedno različica istega stavka: obdrži VPN za brskanje, a pusti SSH ali opravilu varnostnega kopiranja uporabo običajne povezave. Nasvet, ki kroži o tem, preusmeriti vrata s pravili NAT v iptables, tega ne naredi. Pravilo NAT prepiše naslove in vrata znotraj toka; nikoli ne izbere vmesnika, skozi katerega paket odide. Ta odločitev pripada iskanju poti, iskanje poti pa potrebuje pomoč, da vidi vrata.
Zakaj običajna pot ne more zadeti vrat
Linux izbere pot z iskanjem ciljnega naslova v tabeli, potem ko so kandidatne tabele filtrirane s pravili pravilnika. Ta pravila se lahko ujemajo z oznako požarnega zidu, izvornim naslovom, vhodnim vmesnikom ali UID. Sam vnos poti nima polja za vrata, ker je pot izbrana preden postane glava prevoza pomembna.
Sedanji iproute2 in jedra širijo izbirnik pravil: ipproto, sport in dport so sprejeti, zato ip rule add ipproto tcp dport 22 table 100 izrazi namero v eni vrstici. Zaženi ip rule add help na resničnem gostitelju, da vidiš, ali tvoja gradnja navaja dport. Če jo, si končal z enim ukazom; če ne, je pot z oznako spodaj enakovredna.
Kakor koli, pravilo je le kazalka. Tabela 100 še vedno potrebuje pot, in to je del, ki ga ljudje pozabijo.
Trije deli ali eden
Sodobna oblika je eno pravilo zgoraj plus pot v nadomestni tabeli. Klasična oblika v sredino doda netfilter: označi paket, nato v pravilu ujemi oznako. Obe se končata pri istem iskanju; razlikujeta se v tem, kje se berejo vrata.
Pristop z oznako obstaja zato, ker netfilter vidi glavo prevoza, koda za usmerjanje pa je v preteklosti ni. To je celoten mehanizem in pojasnjuje, zakaj je rezervna pot trije sodelujoči deli namesto enega prebrisanega ukaza.
Trije deli po vrsti
Najprej označi tokove, ki jih želiš preusmeriti, v verigi, ki se izvaja dovolj zgodaj, da oznaka obstaja pred odločitvijo o poti:
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 0x1Drugič, pošlji označene pakete v ločeno tabelo:
ip rule add fwmark 0x1/0x1 table 100Tretjič, tej tabeli daj privzeto pot skozi fizično povezavo. Naslovi so ponazoritveni; vstavi svoje:
ip route add default via 192.168.1.1 dev wlan0 table 100Preskoči tretji korak in označeni paket v tabeli 100 ne najde poti, zato spodleti. Simptom izgleda, kot da je pravilo pokvarilo omrežje, v resnici pa je odstranilo edino pot, ki je paketu še ostala.
Kaj ga ohranja v delovanju po prvem paketu
Oznake veljajo za odhodne pakete. Odgovor prispe na fizični vmesnik z naslovom, ki ga je dodelila povezava, in glavna tabela lahko za ta cilj še vedno raje izbere tunel. Dva mehanizma ohranjata povratno pot skladno: pravilo na podlagi vira za naslov povezave in connection tracking, ki ohrani odločitev ves čas življenja toka. Shranjevanje oznake v conntrack in obnovitev pri odgovoru je običajen način, da je stanjska izjema stabilna.
Filtriranje povratne poti je drugi tihi morilec. Če jedro strogo preverja povratno pot in odgovor prispe na vmesnik, ki ga glavna tabela ne bi izbrala, se paket zavrže brez sporočila. rp_filter privzete vrednosti se razlikujejo po distribuciji in po tem, ali se vmesnik posreduje, zato beri dejansko vrednost, namesto da predpostaviš, da je izklopljena.
Ne označi lastnega prevoza tunela. Tunel WireGuard ali UDP OpenVPN ni TCP 22, zato je zgornji recept varen, toda izjema, zapisana kot vse razen cilja tunela, lahko ujame šifrirane pakete in pokvari tunel tako, da izgleda kot zanka usmerjanja.
Preveri, namesto da predpostaviš
Vprašaj jedro, katero pot bi izbralo, za cilj in za vrata, nato izvedi resnični prenos:
ip route get 203.0.113.10
ip rule show
nft list rulesetČe oznaka obstaja, a se števci nikoli ne premaknejo, se pravilo ne ujema. Števci so razlika med konfiguracijo, ki si jo napisal, in pravilnikom, ki ga jedro uporablja.
Kdaj je to napačno orodje
Izjeme na podlagi vrat so po naravi krhke. Storitve premikajo vrata, HTTP/3 prispe kot UDP 443, ena aplikacija pa lahko odpre več tokov različnih vrst. Če je resnična zahteva, da ta program uporablja običajno povezavo, je plast usmerjanja napačen kraj; imenski prostor omrežja ali posrednik za aplikacijo se bolje prilega.
Če je zahteva, da ta podomrežje uporablja običajno povezavo, oznake povsem preskoči in dodaj bolj natančno pot. Preprosteje je, vidno je v eni tabeli in naslednja oseba jo lahko pregleda, ne da bi brala nabor pravil.
Preden se dotakneš požarnega zidu, zapiši, katero od treh zahtev res imaš. Zgornji mehanizem je natančen, natančnost na napačni plasti pa je le daljši izpad.