Pridáte jeden riadok, aby ste si zachovali miestnu predvolenú trasu, a potom už tunel nedosiahne interný DNS server. Tento riadok bol pull-filter ignore "route", čo neznamená "ignoruj túto trasu". Znamená to "zahoď každú tlačenú voľbu, ktorej text začína tými piatimi písmenami", a na bežnom serveri to zahŕňa route-gateway, route-metric a route-ipv6 spolu so samotnými trasami. Kontrolný zoznam nižšie je to, čo prechádzam predtým, než sa dotknem profilu, ktorý musí používať niekto iný.

Filter pôsobí len na tlačené voľby

pull-filter pôsobí len na riadky volieb, ktoré server posiela po nadviazaní tunela, a na nič iné. Voľby zapísané vo vašom miestnom súbore ním nie sú dotknuté, rovnako ako prevádzka aplikácií. Ak ste dúfali, že zabránite procesu používať tunel, je to úplne nesprávny nástroj a žiadna kombinácia filtrov to neurobí.

Tento rozsah je užitočný, pretože znamená, že konfiguráciu servera môžete nechať na pokoji a napriek tomu časť z nej odmietnuť lokálne. Je to aj obmedzenie, ktoré stojí za to uviesť v tikete: filter mení, čo tento klient prijíma, nie čo server ponúka. Nemá vplyv na ostatných používateľov rovnakého profilu. Neprežije ani prechod k inému klientovi, ktorý túto voľbu neimplementuje, čo sa oplatí vedieť predtým, než na ňom postavíte pracovný postup.

Pred napísaním vzoru overte, čo server skutočne posiela. Pri vysokej úrovni podrobností klient vypíše prijatý reťazec tlačených volieb, a to je jediný poctivý zdroj presného textu, s ktorým porovnávate:

sudo openvpn --config /etc/openvpn/corp.ovpn --verb 4
sudo grep -n 'pull-filter' /etc/openvpn/corp.ovpn

Čítajte tlačený riadok ako zoznam volieb oddelených čiarkami a všimnite si, že názvy volieb a ich argumenty sú oddelené medzerami. Text filtra sa porovnáva s týmto tokom, preto sú medzery v ďalšom kroku také dôležité.

Zhoda je prefix, takže medzery rozhodujú o všetkom

Porovnanie je prefix reťazca, nie parsovaný názov voľby. Preto "route" zodpovedá route-gateway 10.8.0.1, route-ipv6 2001:db8::/32 a route-metric 100. Jedna medzera na konci to zúži na rodinu, ktorú ste pravdepodobne mysleli, a úplný prefix to zúži ešte viac na konkrétny cieľ.

Filter textWhat it actually matchesTypical outcome
"route"Every option beginning with those lettersRoutes, gateway, metric and IPv6 routes all dropped
"route "Route entries only, not the hyphenated siblingsThe routes go, the rest survives
"route 10.60."A single destination rangeThe narrowest rule, and the easiest to audit
"dhcp-option DNS"Pushed DNS settingsResolver stays local, internal names stop resolving

Posledný riadok je ten, ktorý chytá ľudí pri práci s rozdeleným tunelom. Ponechať si vlastný resolver je legitímna voľba a znamená, že každé interné meno teraz závisí od resolvera, ktorý nevidí privátnu zónu. Je to dôsledok, ktorý sa prijíma vedome, nie vedľajší efekt, ktorý sa objaví v produkcii.

Zhoda podľa prefixu tiež znamená, že pravidlo sa môže neskôr ticho rozšíriť. Keď server pridá novú voľbu začínajúcu vaším textom, váš filter na ňu začne pôsobiť bez toho, aby ktokoľvek upravil váš profil. To je režim zlyhania, proti ktorému treba navrhovať, a zmiernením je zhodovať čo najväčšiu časť voľby, nie čo najmenšiu.

Tri slovesá s tromi rôznymi výsledkami

accept, ignore a reject nie sú tri pravopisy tej istej myšlienky. Líšia sa v tom, čo klient so zhodou urobí, a v tom, či sa to niekto dozvie.

ignore ticho zahodí zodpovedajúcu voľbu, čo chcete pre nastavenie, ktoré ste zámerne nahradili. reject ju zahodí a prinúti klienta sťažovať sa, čo chcete vtedy, keď má byť jej neprítomnosť viditeľná v logu a nie objavená neskôr. accept je kladná forma, používa sa, keď zostavujete zoznam povolených a nie odstraňujete jednotlivé voľby.

Akékoľvek sloveso použijete, filtre sa aplikujú v poradí, v akom sa objavujú, takže dve prekrývajúce sa pravidlá dajú na poradí závislý výsledok, ktorý sa veľmi ťažko kontroluje. Držte jedno pravidlo na jeden zámer a do každého dajte čo najkonkrétnejší text. Ak potrebujete zoznam povolených, dajte prednosť niekoľkým pravidlám accept pred kopou pravidiel ignore, ktoré dajú to isté. Potom recenzenti môžu súbor prečítať zhora nadol a predpovedať výsledok, a to je jediný test, ktorý sa škáluje.

Overte uplatnenú trasu a resolver, nie profil

Filter, ktorý v súbore vyzerá správne, vás stále môže nechať s tunelom, ktorý nesmeruje nič užitočné. Overte účinok na bežiacom systéme, kde už boli tlačené voľby použité alebo zahodené:

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/

Prvé dva riadky vám povedia či dorazila tlačená predvolená trasa a koľko statických záznamov prežilo. Dotaz na resolver ukáže, ktorý server rozhranie tunela skutočne používa, a tam sa zvyčajne objaví prekvapenie s DNS. Posledný riadok odpovedá na jedinú otázku, ktorá je pre používateľa dôležitá.

Otestujte oba smery, kým ste tam. Pravidlo, ktoré udrží váš miestny internet funkčný, ale ticho rozbije interný preklad mien, prejde povrchnou kontrolou a zlyhá pri prvej skutočnej úlohe, preto do rovnakého testu zaraďte jeden interný zdroj a jednu verejnú stránku.

Zapíšte výnimku a kto ju vlastní

Filter je výnimka z návrhu operátora, preto ho zapíšte s dôvodom a kontrolným bodom. "Ignoruje tlačené trasy, aby zachoval miestnu predvolenú" je kontrolovateľné; holý riadok v profile nie je, a ďalší človek ho zmaže alebo rozšíri odhadom.

Aj verzia tu hrá rolu. Správanie zhody a presná prijímaná syntax sa ladili naprieč OpenVPN 2.4, 2.5 a 2.6, preto vzor potvrďte podľa manuálu pre zostavenie, ktoré dodávate, a nie podľa príspevku na fóre o staršej verzii. Manuál OpenVPN 2.6 túto voľbu a jej pravidlo zhody dokumentuje.

Nakoniec výnimku odsúhlaste s tým, kto server prevádzkuje. Klientsky filter, ktorý odporuje zámernej politike servera, je support incident čakajúci na ďalší audit, a je oveľa lacnejšie vyriešiť ho pred odoslaním profilu než potom, čo si niekto všimne, že trasy chýbajú.

Súvisiace články