Зашто приватна DNS имена не раде на VPN клијентима и где проверити
Приватна имена се разрешавају само када клијент верује вашем резолверу, суфикс је ограничен и одговор може да се врати кроз тунел.
Отварате лаптоп у хотелској соби, покрећете клијента, уносите име интерног сервера датотека и не добијате ништа. Тунел пријављује да је повезан, а пинг ка адреси у истој подмрежи још одговара, дакле транспорт сам по себи је у реду. Само име не успева, и тај јаз своди проблем на два места: који резолвер је клијент питао и да ли добијени одговор може да се врати кроз тунел. Поправите једно, а друго прескочите, и квар се једноставно пресели.
Пре него што уредите било који профил, проверите шта клијент ради с именом. У Linux-у resolvectl query files.corp.example показује преко које везе и којег резолвера је одговор настао. У Windows-у Resolve-DnsName files.corp.example показује сервер који је одговорио и адресу коју је вратио.
Прочитајте одговор пре него што било шта промените
Ако се име врати као NXDOMAIN за неколико милисекунди, упит никада није стигао до ваше зоне и одговорио је неки јавни или хотелски резолвер. Ако се врати после дуге паузе, нешто на путу одбацује UDP порт 53 и клијент је на крају прешао на резерву. Ако одговори тачном адресом, али веза и даље запиње, разрешавање је у реду и ваш проблем је у рутирању или у самој услузи.
Та подела на три штеди сат нагађања. Такође вам каже да ли уопште да дирате VPN: име које се разреши на тачну приватну адресу већ је доказало пут резолвера, па је преостали посао на путу података.
Поделите резолвер из унутрашњости тунела
Клијенти се деле у две групе. Једној сервер може да зада резолвер приликом успостављања везе; друга држи подешавање у локалној датотеци коју ниједан гејтвеј не може да промени на даљину.
OpenVPN је у првој групи. На серверу push "dhcp-option DNS 10.8.0.53" и push "dhcp-option DOMAIN corp.example" путују контролним каналом, али само ако је у конфигурацији клијента pull још укључено. Клијент уређен ручно који носи pull-filter ignore "dhcp-option" никада их неће видети, и тај један ред објашњава изненађујуће много случајева типа „сервер то гура, али мој лаптоп се не слаже“.
WireGuard је у другој групи, јер протокол уопште нема преговарање о опцијама. Резолвер и домен претраге улазе у сопствени блок [Interface] клијента као DNS = 10.8.0.53, corp.example. wg-quick то примењује преко resolvconf-а или systemd-resolved-а, а у Windows-у званични клијент инсталира NRPT правила која постоје само док је тунел подигнут: Get-DnsClientNrptPolicy их набраја, што то чини брзим начином да видите да ли је клијент икада применио вашу датотеку.
IPsec/IKEv2 је у средини. Додатак attr за strongSwan може да врати DNS сервер извучен из пула, а Windows клијент то обично прихвата, али профил који закуца сопствени сервер имена побеђује све што гејтвеј понуди. На Linux клијенту еквивалентан ручни корак је resolvectl dns wg0 10.8.0.53, затим resolvectl domain wg0 '~corp.example'; обоје нестаје заједно са интерфејсом, што је управо оно што желите за подешавање ограничено на тунел.
Ограничите суфикс уместо да прогутате сваки упит
Усмерити целу листу резолвера клијента на ваш интерни сервер је лако и обично погрешно. Тада се свако јавно име разрешава преко излаза вашег центра података, CDN-ови враћају удаљене адресе, и један квар резолвера са собом однесе и прегледање корисника.
Шаљите унутра само приватни суфикс. У systemd-resolved-у домен који почиње са ~ служи само за рутирање, па ~corp.example значи да упити под тим суфиксом иду на сервере те везе, док све остало наставља да користи физичку мрежу. Windows чини исто са NRPT правилима ограниченим на простор имена, а macOS са допунском датотеком резолвера у /etc/resolver/.
Мултикаст имена заслужују сопствени одговор. Имена .local су по дизајну link-local (RFC 6762) и интерфејс tun тачка-до-тачке не носи ту мултикаст групу, па је додавање јавног резолвера неће објавити, а питање интерног unicast резолвера о њима враћа NXDOMAIN. Рефлектор као avahi у режиму рефлексије може да повеже два сегмента, али то је одлука на страни сервера коју ниједан клијент не може да затражи. Ако штампач или NAS мора да буде доступан по имену, дајте му запис A у својој зони.
Докажите да одговор може да се врати
Тачан одговор који показује на недоступну адресу изгледа тачно као проблем резолвера док не проверите руту. Питајте језгро куда би одговор отишао: ip route get 10.20.5.20 именује интерфејс и, корисније, изворну адресу коју би користио.
Пратите саму адресу резолвера. Клијент са DNS = 10.8.0.53 поред AllowedIPs = 10.20.0.0/16 шаље своје упите кроз физичку NIC, где тихо умиру, јер резолвер није унутар ниједног префикса који тунел тражи. Тај несклад је најчешћи квар са једним узроком у целој овој области и остаје невидљив ако не упоредите DNS подешавање са дозвољеним префиксима ред по ред.
Преклапајући опсези изазивају супротан квар. Одговор је тачан, рута постоји и показује на погрешног хоста, јер је 192.168.0.0/24 код куће конкретнији од руте тунела ка истом опсегу. Пренумеришите једну страну или прогурајте ужу руту, па потврдите заштитни зид и повратни пут хоста услуге; белешке strongSwan-а о прослеђивању покривају страну sysctl тог пута.
Сертификати су одвојена провера идентитета коју људи приписују DNS-у. Ако прегледач пријави неслагање имена уместо грешке разрешавања, претрага је већ радила и SAN у сертификату је оно што треба поправити. Тестирајте HTTPS на име, никада на голи IP.
Поново тестирајте са клијента, не са гејтвеја
Тестирајте унутар апликације на коју се корисник жали, јер претрага из командне линије не доказује да прегледач иде истим путем. Безбедни DNS Chrome-а и network.trr.mode у Firefox-у могу потпуно да заобиђу системски резолвер, и када то ураде, приватно име или не успева или исцури јавном резолверу. Поређење resolvectl query са ручно покренутим dig @10.8.0.53 files.corp.example каже вам који се од та два догодио.
Затим се одспојите и поново повежите пре него што то назовете решеним. Подешавања ручно задата на интерфејсу нестају са интерфејсом, а профил који је изгледао тачно само због заборављене локалне измене пашће при следећем подизању.
Кратка контролна листа за следећу машину: име се разрешава преко резолвера тунела, суфикс је ограничен, а не глобалан, адреса резолвера је унутар дозвољених префикса, хост из одговора одговара на порту услуге и сертификат покрива име које је корисник унео.