pull-filter у OpenVPN поклапа се са више од замишљене руте
pull-filter пореди ваш текст као префикс са гурнутим опцијама, па route хвата и route-gateway и route-ipv6. Прво проверите глаголе, затим руте.
Додате једну линију да задржите своју локалну подразумевану руту, и након тога тунел више не стиже до интерног DNS сервера. Линија је била pull-filter ignore "route", што не значи "занемари ову руту". Значи "одбаци сваку гурнуту опцију чији текст почиње тим пет слова", а на нормалном серверу то укључује route-gateway, route-metric и route-ipv6 заједно са самим рутама. Контролна листа испод је оно што пролазим пре него што дирнем профил који неко други мора да користи.
Филтер делује само на гурнуте опције
pull-filter делује само на линије опција које сервер шаље након успостављања тунела, и ни на шта друго. Опције написане у вашој локалној датотеци нису њиме обухваћене, као ни саобраћај апликација. Ако сте се надали да ћете спречити процес да користи тунел, ово је потпуно погрешан алат и ниједна комбинација филтера то неће постићи.
Тај обим је користан, јер значи да можете оставити конфигурацију сервера на миру и ипак локално одбити њен део. То је и ограничење које вреди навести у тикету: филтер мења шта овај клијент прихвата, а не шта сервер нуди. Нема утицаја на друге кориснике истог профила. Не преживљава ни прелазак на други клијент који не имплементира опцију, што вреди знати пре него што на томе изградите радни ток.
Потврдите шта сервер заиста шаље пре него што напишете образац. При високом нивоу детаља клијент штампа примљени низ гурнутих опција, а то је једини искрен извор за тачан текст са којим поредите:
sudo openvpn --config /etc/openvpn/corp.ovpn --verb 4
sudo grep -n 'pull-filter' /etc/openvpn/corp.ovpn
Читајте гурнуту линију као списак опција раздвојених зарезима и приметите да су називи опција и њихови аргументи раздвојени размацима. Ваш текст филтера пореди се са тим током, зато су размаци толико важни у следећем кораку.
Поклапање је префикс, па размаци одлучују о свему
Поређење је префикс низа, а не парсирани назив опције. Зато "route" одговара route-gateway 10.8.0.1, route-ipv6 2001:db8::/32 и route-metric 100. Један размак на крају сужава га на породицу коју вероватно мислите, а пуни префикс сужава га додатно на конкретно одредиште.
| 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 |
Последњи ред је онај који хвата људе током рада са подељеним тунелом. Задржати сопствени resolver је легитиман избор и значи да свако интерно име сада зависи од resolver-а који не види приватну зону. То је последица која се свесно прихвата, а не нуспојава која се открива у продукцији.
Поклапање по префиксу значи и да правило касније може тихо да се прошири. Када сервер дода нову опцију која почиње вашим текстом, ваш филтер почиње да се примењује на њу без тога да ико уређује ваш профил. То је режим отказа против којег треба пројектовати, а ублажавање је поклопити што већи део опције, а не што мањи.
Три глагола са три различита исхода
accept, ignore и reject нису три правописа исте идеје. Разликују се по томе шта клијент ради са поклапањем и по томе да ли ико сазна.
ignore тихо одбацује одговарајућу опцију, што желите за поставку коју сте намерно заменили. reject је одбацује и натера клијента да се пожали, што желите када њено одсуство треба да буде видљиво у запису, а не откривено касније. accept је позитивни облик, користи се када градите списак дозвољених уместо уклањања појединачних опција.
Који год глагол користили, филтери се примењују редом којим се појављују, па два правила која се преклапају дају резултат зависан од реда који је врло тешко прегледати. Држите једно правило по намери и ставите најконкретнији текст у свако. Ако вам треба списак дозвољених, радије неколико правила accept него гомила правила ignore која дају исто. Рецензенти тада могу прочитати датотеку одозго надоле и предвидети резултат, а то је једини тест који се скалира.
Проверите примењену руту и resolver, не профил
Филтер који изгледа исправно у датотеци и даље вас може оставити са тунелом који не усмерава ништа корисно. Проверите ефекат на систему који ради, где су гурнуте опције већ примењене или одбачене:
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/
Прве две линије вам кажу да ли је гурнута подразумевана рута стигла и колико је статичких уноса преживело. Упит resolver-у показује који сервер интерфејс тунела заиста користи, а то је обично место где се појави DNS изненађење. Последња линија одговара на једино питање које је кориснику важно.
Тестирајте оба смера док сте тамо. Правило које одржава ваш локални интернет функционалним али тихо квари интерно разрешавање имена пролази површну проверу и пада на првом стварном задатку, зато укључите један интерни ресурс и један јавни сајт у исти тест.
Запишите изузетак и ко га поседује
Филтер је изузетак од дизајна оператера, зато га запишите са разлогом и тачком прегледа. "Занемарује гурнуте руте да задржи локалну подразумевану" може се прегледати; гола линија у профилу не може, и следећа особа ће је избрисати или проширити нагађањем.
Верзија је и овде важна. Понашање поклапања и тачна прихваћена синтакса усавршавани су кроз OpenVPN 2.4, 2.5 и 2.6, зато потврдите образац према приручнику за издање које достављате, а не према форумском посту о старијој верзији. Приручник OpenVPN 2.6 документује ову опцију и њено правило поклапања.
На крају, договорите изузетак са оним ко води сервер. Клијентски филтер који противречи намерној серверској политици је инцидент подршке који чека следећу ревизију, и много је јефтиније решити га пре него што профил оде, него пошто неко примети да руте недостају.