OpenVPN pull-filter hvata više od rute koju ste namjeravali
pull-filter poredi vaš tekst kao prefiks sa gurnutim opcijama, pa route hvata i route-gateway i route-ipv6. Prvo provjerite glagole, zatim rute.
Dodate jednu liniju da zadržite svoju lokalnu zadanu rutu, i nakon toga tunel više ne stiže do internog DNS servera. Linija je bila pull-filter ignore "route", što ne znači "zanemari ovu rutu". Znači "odbaci svaku gurnutu opciju čiji tekst počinje tim pet slovima", a na normalnom serveru to uključuje route-gateway, route-metric i route-ipv6 zajedno sa samim rutama. Kontrolna lista ispod je ono što prolazim prije nego što dirnem profil koji neko drugi mora koristiti.
Filter djeluje samo na gurnute opcije
pull-filter djeluje na linije opcija koje server šalje nakon uspostavljanja tunela, i ni na šta drugo. Opcije napisane u vašoj lokalnoj datoteci njime nisu obuhvaćene, kao ni saobraćaj aplikacija. Ako ste se nadali da ćete zaustaviti proces da koristi tunel, ovo je potpuno pogrešan alat i nijedna kombinacija filtera to neće postići.
Taj obim je koristan, jer znači da možete ostaviti konfiguraciju servera na miru i ipak lokalno odbiti njen dio. To je i ograničenje koje vrijedi navesti u tiketu: filter mijenja šta ovaj klijent prihvata, a ne šta server nudi. Nema uticaja na druge korisnike istog profila. Ne preživljava ni prelazak na drugi klijent koji ne implementira opciju, što vrijedi znati prije nego na tome izgradite radni tok.
Potvrdite šta server zaista šalje prije nego što napišete obrazac. Pri visokoj verbosnosti klijent ispisuje primljeni niz gurnutih opcija, a to je jedini iskren izvor za tačan tekst s kojim upoređujete:
sudo openvpn --config /etc/openvpn/corp.ovpn --verb 4
sudo grep -n 'pull-filter' /etc/openvpn/corp.ovpn
Čitajte gurnutu liniju kao listu opcija razdvojenih zapetama i primijetite da su nazivi opcija i njihovi argumenti razdvojeni razmacima. Vaš tekst filtera upoređuje se s tim tokom, zato su razmaci toliko važni u sljedećem koraku.
Podudaranje je prefiks, pa su razmaci cijela igra
Poređenje je prefiks niza, a ne parsiran naziv opcije. Zato "route" odgovara route-gateway 10.8.0.1, route-ipv6 2001:db8::/32 i route-metric 100. Jedan razmak na kraju sužava ga na porodicu koju vjerovatno mislite, a puni prefiks sužava ga dodatno na konkretno odredište.
| Filter text | What it actually matches | Typical outcome |
|---|---|---|
"route" | Every option beginning with those letters | Routes, gateway, metric and IPv6 routes all dropped |
"route " | Route entries only, not the hyphenated siblings | The routes go, the rest survives |
"route 10.60." | A single destination range | The narrowest rule, and the easiest to audit |
"dhcp-option DNS" | Pushed DNS settings | Resolver stays local, internal names stop resolving |
Zadnji red je onaj koji hvata ljude tokom rada sa split-tunelom. Zadržati vlastiti resolver legitiman je izbor i znači da svako interno ime sada zavisi od resolvera koji ne vidi privatnu zonu. To je posljedica koju treba svjesno prihvatiti, a ne nuspojava koju treba otkriti u produkciji.
Podudaranje po prefiksu znači i da pravilo kasnije može tiho da se proširi. Kada server doda novu opciju koja počinje vašim tekstom, vaš filter počinje da se primjenjuje na nju bez toga da iko uređuje vaš profil. To je način kvara protiv kojeg treba projektovati, a ublažavanje je da se poklopi što veći dio opcije, a ne što manji.
Tri glagola s tri različita ishoda
accept, ignore i reject nisu tri pravopisa iste ideje. Razlikuju se po tome šta klijent radi s podudaranjem i po tome da li iko sazna.
ignore tiho odbacuje odgovarajuću opciju, što želite za postavku koju ste namjerno zamijenili. reject je odbacuje i natjera klijenta da se požali, što želite kada njeno odsustvo treba biti vidljivo u logu, a ne otkriveno kasnije. accept je pozitivni oblik, koristi se kada gradite listu dozvola umjesto uklanjanja pojedinačnih opcija.
Koji god glagol da koristite, filteri se primjenjuju redom kojim se pojavljuju, pa dva preklapajuća pravila daju rezultat zavisan od reda koji je vrlo teško pregledati. Držite jedno pravilo po namjeri i stavite najkonkretniji tekst u svako. Ako vam treba lista dozvola, radije nekoliko pravila accept nego gomila pravila ignore koja daju isto. Recenzenti tada mogu pročitati datoteku odozgo prema dolje i predvidjeti rezultat, a to je jedini test koji se skalira.
Provjerite primijenjenu rutu i resolver, ne profil
Filter koji izgleda ispravno u datoteci i dalje vas može ostaviti s tunelom koji ne usmjerava ništa korisno. Provjerite učinak na pokrenutom sistemu, gdje su gurnute opcije već primijenjene ili odbačene:
ip route show default
ip route show | grep -c 'proto static'
resolvectl status | grep -A4 'Link.*tun0'
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 5 https://intranet.example.internal/
Prve dvije linije vam kažu da li je gurnuta zadana ruta stigla i koliko je statičkih unosa preživjelo. Upit resolveru pokazuje koji server interfejs tunela zaista koristi, a to je obično mjesto gdje se pojavi DNS iznenađenje. Zadnja linija odgovara na jedino pitanje koje je korisniku važno.
Testirajte oba smjera dok ste tamo. Pravilo koje održava vaš lokalni internet funkcionalnim, ali tiho kvari interno razrješavanje imena, prolazi površnu provjeru i pada na prvom stvarnom zadatku, zato uključite jedan interni resurs i jedan javni sajt u isti test.
Zapišite izuzetak i ko ga posjeduje
Filter je izuzetak od operaterovog dizajna, pa ga zapišite s razlogom i tačkom pregleda. "Zanemaruje gurnute rute da zadrži lokalnu zadanu" može se pregledati; gola linija u profilu ne može, i sljedeća osoba će je izbrisati ili proširiti nagađanjem.
Verzija je i ovdje važna. Ponašanje podudaranja i tačna prihvaćena sintaksa usavršavani su kroz OpenVPN 2.4, 2.5 i 2.6, zato potvrdite obrazac prema priručniku za build koji isporučujete, a ne prema forumskom postu o starijoj verziji. Priručnik OpenVPN 2.6 dokumentuje opciju i njeno pravilo podudaranja.
Na kraju, dogovorite izuzetak s onim ko vodi server. Klijentski filter koji proturječi namjernoj serverskoj politici je incident podrške koji čeka sljedeću reviziju, i mnogo je jeftinije riješiti ga prije nego što profil ode, nego nakon što neko primijeti da rute nedostaju.