Имена OpenVPN клијената у dnsmasq-у: скрипта или статички уноси?
Адресе клијената се мењају, имена услуга не. Генеришите имена клијената из VPN сесије, причврстите имена услуга у drop-in датотеку и затим натерајте клијенте да је користе.
Два проблема са именима јављају се на готово сваком малом OpenVPN пролазу. До повезаног лаптопа не можете доћи по имену из његовог сертификата, а услуге иза тунела уопште немају имена. Изгледају као један проблем и траже супротан приступ, јер се једна адреса мења са сваком сесијом, а друга не. Одлучите коју врсту имена додајете пре него што било шта уредите.
Одлучујте по имену, не по пролазу
Тест је једноставан: да ли се ова адреса мења када се клијент поново повеже? Ако да, име мора да се генерише из VPN сесије. Ако не, припада статичком уносу који можете да прочитате и прегледате.
| Name kind | Source of truth | Where it lives |
|---|---|---|
| Connected client | The address OpenVPN just assigned | Generated hosts file, rewritten per session |
| Service behind the tunnel | A fixed address you chose | Static address= drop-in |
| Anything with a certificate name | The certificate, not the pool | Either, but the name must match the certificate |
Њихово мешање је уобичајен пропуст. Услуга причвршћена у генерисану датотеку нестаје први пут када је скрипта препише, а клијент уписан у статички унос показује на онога ко је ту адресу имао последњи. Обе грешке остају невидљиве док се име не разреши на погрешну машину. До тада онај ко то исправља претпоставља да је DNS покварен, а не датотека.
Динамички пут: learn-address и базен
OpenVPN зна доделу, па нека вам је каже. Ове опције сервера чине доделу трајном и подобном за скрипте:
client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist /etc/openvpn/ip-pool 60
script-security 2
learn-address /etc/openvpn/learn-address.sh
learn-address покреће вашу скрипту сваки пут када се адреса дода, ажурира или избрише, и прослеђује операцију, адресу и заједничко име. Минимална скрипта додаје један ред по клијенту и уклања га при брисању:
#!/bin/sh
HOSTS=/etc/openvpn/hosts.lan
case "$1" in
add|update) echo "$2 $3" >> "$HOSTS" ;;
delete) sed -i "/^$2 /d" "$HOSTS" ;;
esac
kill -HUP $(cat /var/run/dnsmasq.pid)
На tun уређају други аргумент је тунелска адреса клијента, па је ред директно употребљив. На tap уређају OpenVPN уместо тога прослеђује MAC адресу клијента, јер tap сегмент може да носи и друге протоколе осим IPv4, и тада адресу морате да потражите у датотеци базена по заједничком имену пре него што било шта напишете.
Будите јасни о томе шта је генерисана датотека: снимак онога ко је тренутно повезан. Имена нестају при прекиду везе, што је управо оно што желите за лаптопове који се селе између мрежа и управо оно што не желите за сервер који ради целу ноћ.
Статички пут: address= и проширење домена
Усмерите dnsmasq на генерисану датотеку уместо на системску hosts датотеку и дајте му домен да се кратка имена прошире у потпуно квалификована:
domain=corp.example
no-hosts
addn-hosts=/etc/openvpn/hosts.lan
listen-address=127.0.0.1,10.8.0.1
bind-interfaces
Када је domain подешен, ред као 10.8.0.6 alice одговара и за alice и за alice.corp.example. Држите listen-address само на тунелском пролазу и loopback-у, јер је резолвер случајно објављен на LAN интерфејсу услуга коју нисте намеравали да нудите.
Услуге које никада не долазе из базена добијају сопствене уносе. Ставите их у засебну drop-in датотеку у конфигурационом директоријуму дистрибуције да их надоградња пакета не би могла преписати:
address=/files.corp.example/10.8.0.20
address=/db.corp.example/10.9.0.5
Предајте резолвер или се ништа неће догодити
Резолвер који нико не пита ништа не мења. Сервер мора да га објави:
push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DOMAIN corp.example"
Windows клијенти сами примењују обе опције. Већина Linux клијената не: потребна им је подржана интеграција резолвера, као што је update-resolv-conf кука дистрибуције или DNS обрада у NetworkManager-у, или ручно подешен домен претраге и сервер имена. Проверите стварни резолвер клијента уместо да претпоставите да је push испоштован, јер игнорисан push изгледа исто као сервер који не одговара.
Проверите на три слоја
Прво питајте сервер директно, затим клијента, затим апликацију:
dig +short @10.8.0.1 alice.corp.example
getent hosts files.corp.example
Ако директни упити одговарају, а апликација не, кривица је у предаји клијенту, а не у зони. Ако се име разреши, а веза и даље не успева, име је у реду и следеће што треба погледати је маршрута или заштитни зид.
Запишите обе категорије поред конфигурације: која се имена генеришу, која су причвршћена и са којим сертификатом свако мора да се подудара. Следећа особа која дода сервер копираће први шаблон који нађе.