OpenVPN pull-filter hvata više od rute koju ste namjeravali
pull-filter uspoređuje vaš tekst kao prefiks s 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 poslužitelja. 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 poslužitelju to uključuje route-gateway, route-metric i route-ipv6 zajedno sa samim rutama. Kontrolni popis ispod je ono što prolazim prije nego što dirnem profil koji netko drugi mora koristiti.
Filter djeluje samo na gurnute opcije
pull-filter djeluje na linije opcija koje poslužitelj šalje nakon uspostavljanja tunela, i ni na što drugo. Opcije napisane u vašoj lokalnoj datoteci njime nisu obuhvaćene, kao ni promet 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 je opseg koristan, jer znači da možete ostaviti konfiguraciju poslužitelja na miru i ipak lokalno odbiti njen dio. To je i ograničenje koje vrijedi navesti u ticketu: filter mijenja što ovaj klijent prihvaća, a ne što poslužitelj nudi. Nema utjecaja 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 što poslužitelj zaista šalje prije nego što napišete obrazac. Pri visokoj razini detalja klijent ispisuje primljeni niz gurnutih opcija, a to je jedini iskren izvor za točan tekst s kojim uspoređujete:
sudo openvpn --config /etc/openvpn/corp.ovpn --verb 4
sudo grep -n 'pull-filter' /etc/openvpn/corp.ovpn
Čitajte gurnutu liniju kao popis opcija razdvojenih zarezima i primijetite da su nazivi opcija i njihovi argumenti razdvojeni razmacima. Vaš tekst filtera uspoređuje se s tim tokom, zato su razmaci toliko važni u sljedećem koraku.
Podudaranje je prefiks, pa su razmaci cijela igra
Usporedba je prefiks niza, a ne parsirani 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 obitelj koju vjerojatno 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 tijekom rada sa split tunelom. Zadržati vlastiti resolver legitiman je izbor i znači da svako interno ime sada ovisi o resolveru 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 se pravilo kasnije može tiho proširiti. Kada poslužitelj doda novu opciju koja počinje vašim tekstom, vaš se filter počinje primjenjivati na nju bez toga da itko uređuje vaš profil. To je način kvara protiv kojeg treba projektirati, a ublažavanje je poklopiti š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 što klijent radi s podudaranjem i po tome sazna li itko.
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 njezina odsutnost treba biti vidljiva u zapisu, a ne otkrivena kasnije. accept je pozitivni oblik, koristi se kada gradite popis dopuštenih umjesto uklanjanja pojedinačnih opcija.
Koji god glagol koristili, filteri se primjenjuju redom kojim se pojavljuju, pa dva preklapajuća pravila daju rezultat ovisan o redu koji je vrlo teško pregledati. Držite jedno pravilo po namjeri i stavite najkonkretniji tekst u svako. Ako vam treba popis dopuštenih, 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 sustavu, 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 govore vam je li gurnuta zadana ruta stigla i koliko je statičkih unosa preživjelo. Upit resolveru pokazuje koji poslužitelj sučelje 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 jedno javno web-mjesto u isti test.
Zapišite izuzetak i tko ga posjeduje
Filter je izuzetak od operaterova dizajna, pa ga zapišite s razlogom i točkom pregleda. "Zanemaruje gurnute rute da zadrži lokalnu zadanu" može se pregledati; gola linija u profilu ne može, i sljedeća će je osoba izbrisati ili proširiti nagađanjem.
Verzija je i ovdje važna. Ponašanje podudaranja i toč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 dokumentira opciju i njezino pravilo podudaranja.
Na kraju, dogovorite izuzetak s onim tko vodi poslužitelj. Klijentski filter koji proturječi namjernoj poslužiteljskoj 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 netko primijeti da rute nedostaju.