Názvy klientov OpenVPN v dnsmasq: skript alebo statické záznamy?
Adresy klientov sa menia, názvy služieb nie. Generujte názvy klientov z relácie VPN, pripnite názvy služieb do drop-in súboru a potom prinúťte klientov, aby ho používali.
Na takmer každej malej bráne OpenVPN sa objavia dva problémy s názvami. K pripojenému notebooku sa nedostanete podľa názvu z jeho certifikátu a služby za tunelom nemajú vôbec žiadne názvy. Vyzeralú ako jeden problém a vyžadujú opačný prístup, pretože jedna adresa sa mení s každou reláciou a druhá nie. Rozhodnite, aký druh názvu pridávate, skôr než čokoľvek upravíte.
Rozhodujte podľa názvu, nie podľa brány
Test je jednoduchý: mení sa táto adresa, keď sa klient znova pripojí? Ak áno, názov sa musí generovať z relácie VPN. Ak nie, patrí do statického záznamu, ktorý si môžete prečítať a skontrolovať.
| 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 |
Ich miešanie je obvyklá chyba. Služba pripnutá do generovaného súboru zmizne pri prvom prepísaní skriptom a klient zapísaný v statickom zázname ukazuje na toho, kto tú adresu mal naposledy. Obe chyby zostávajú neviditeľné, kým sa názov nevyrieši na nesprávny stroj. Dovtedy človek, ktorý to ladí, predpokladá, že je pokazený DNS, a nie súbor.
Dynamická cesta: learn-address a pool
OpenVPN priradenie pozná, tak nech vám ho povie. Tieto možnosti servera robia priradenie trvalým a skriptovateľným:
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 spustí váš skript vždy, keď sa adresa pridá, aktualizuje alebo odstráni, a odovzdá operáciu, adresu a spoločný názov. Minimálny skript pridá jeden riadok na klienta a pri odstránení ho zmaže:
#!/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)
Na zariadení tun je druhý argument tunelová adresa klienta, takže riadok sa dá použiť priamo. Na zariadení tap OpenVPN odovzdáva namiesto toho MAC adresu klienta, pretože segment tap môže prenášať aj iné protokoly ako IPv4, a vtedy musíte adresu vyhľadať v súbore poolu podľa spoločného názvu, skôr než čokoľvek napíšete.
Majte jasno v tom, čo generovaný súbor je: snímka toho, kto je práve pripojený. Názvy pri odpojení miznú, čo je presne to, čo chcete pre notebooky prechádzajúce medzi sieťami, a presne to, čo nechcete pre server, ktorý beží celú noc.
Statická cesta: address= a rozšírenie domény
Nasmerujte dnsmasq na generovaný súbor namiesto systémového súboru hosts a dajte mu doménu, aby sa krátke názvy rozšírili na plne kvalifikované:
domain=corp.example
no-hosts
addn-hosts=/etc/openvpn/hosts.lan
listen-address=127.0.0.1,10.8.0.1
bind-interfaces
Keď je domain nastavené, riadok ako 10.8.0.6 alice odpovedá za alice aj alice.corp.example. Držte listen-address len na tunelovej bráne a loopbacku, pretože resolver omylom publikovaný na rozhraní LAN je služba, ktorú ste nechceli ponúkať.
Služby, ktoré nikdy nepochádzajú z poolu, dostávajú vlastné záznamy. Dajte ich do samostatného drop-in súboru v konfiguračnom adresári distribúcie, aby ich aktualizácia balíka nemohla prepísať:
address=/files.corp.example/10.8.0.20
address=/db.corp.example/10.9.0.5
Odovzdajte resolver, inak sa nič nestane
Resolver, na ktorý sa nikto neopýta, nič nemení. Server ho musí inzerovať:
push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DOMAIN corp.example"
Klienti Windows aplikujú obe možnosti sami. Väčšina klientov Linuxu nie: potrebujú podporovanú integráciu resolvera, napríklad háčik update-resolv-conf distribúcie alebo spracovanie DNS v NetworkManageri, alebo ručne nastavenú vyhľadávaciu doménu a nameserver. Skontrolujte skutočný resolver klienta, namiesto toho, aby ste predpokladali, že push bol dodržaný, pretože ignorovaný push vyzerá presne ako server, ktorý neodpovedá.
Overte na troch vrstvách
Najprv sa opýtajte priamo servera, potom klienta a potom aplikácie:
dig +short @10.8.0.1 alice.corp.example
getent hosts files.corp.example
Ak priame dopyty odpovedajú a aplikácia nie, chyba je v odovzdaní klientovi, nie v zóne. Ak sa názov preloží a spojenie stále zlyháva, názov je v poriadku a ďalšie na rade je trasa alebo firewall.
Zapíšte obe kategórie vedľa konfigurácie: ktoré názvy sa generujú, ktoré sú pripnuté a s ktorým certifikátom sa každý musí zhodovať. Ďalší človek, ktorý pridá server, skopíruje prvý vzor, ktorý nájde.