Jména klientů OpenVPN v dnsmasq: skript, nebo statické záznamy?
Adresy klientů se mění, jména služeb ne. Generujte jména klientů z VPN relace, jména služeb připněte do drop-in souboru a pak klienty přimějte ho používat.
Dva problémy s názvy se objevují téměř na každé malé bráně OpenVPN. K připojenému notebooku se nedostanete podle jména z jeho certifikátu a služby za tunelem nemají vůbec žádná jména. Vypadají jako jeden problém a vyžadují opačný přístup, protože jedna adresa se mění s každou relací a druhá ne. Rozhodněte, jaký druh jména přidáváte, dřív než cokoli upravíte.
Rozhodujte podle jména, ne podle brány
Test je jednoduchý: mění se tato adresa, když se klient znovu připojí? Pokud ano, jméno se musí generovat z VPN relace. Pokud ne, patří do statického záznamu, který si můžete přečíst a zkontrolovat.
| 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 |
Jejich míchání je obvyklá chyba. Služba připnutá do generovaného souboru zmizí při prvním přepsání skriptem a klient zapsaný ve statickém záznamu ukazuje na toho, kdo tu adresu držel naposledy. Obě chyby zůstávají neviditelné, dokud se jméno nepřeloží na špatný stroj. Do té doby člověk, který to ladí, předpokládá, že je rozbité DNS, a ne soubor.
Dynamická cesta: learn-address a pool
OpenVPN přiřazení zná, tak ať vám ho řekne. Tyto volby serveru dělají přiřazení trvalým a skriptovatelný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, když je adresa přidána, aktualizována nebo smazána, a předá operaci, adresu a common name. Minimální skript přidá jeden řádek na klienta a při smazání ho odstraní:
#!/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 zařízení tun je druhý argument tunelová adresa klienta, takže řádek lze použít přímo. Na zařízení tap OpenVPN předává místo toho MAC adresu klienta, protože segment tap může nést i jiné protokoly než IPv4, a pak musíte adresu najít v souboru poolu podle common name, než cokoli zapíšete.
Mějte jasno v tom, co generovaný soubor je: snímek toho, kdo je právě připojen. Jména při odpojení mizí, což je přesně to, co chcete pro notebooky přecházející mezi sítěmi, a přesně to, co nechcete pro server, který běží celou noc.
Statická cesta: address= a rozšíření domény
Nasměrujte dnsmasq na generovaný soubor místo systémového souboru hosts a dejte mu doménu, aby se krátká jména rozšířila na plně kvalifikovaná:
domain=corp.example
no-hosts
addn-hosts=/etc/openvpn/hosts.lan
listen-address=127.0.0.1,10.8.0.1
bind-interfaces
Když je domain nastaveno, řádek jako 10.8.0.6 alice odpovídá za alice i alice.corp.example. Držte listen-address jen na tunelové bráně a loopbacku, protože resolver omylem publikovaný na rozhraní LAN je služba, kterou jste nabízet nechtěli.
Služby, které nikdy nepocházejí z poolu, dostávají vlastní záznamy. Dejte je do samostatného drop-in souboru v konfiguračním adresáři distribuce, aby je upgrade balíčku nemohl přepsat:
address=/files.corp.example/10.8.0.20
address=/db.corp.example/10.9.0.5
Předejte resolver, nebo se nic nestane
Resolver, na který se nikdo neptá, nic nemění. Server ho musí inzerovat:
push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DOMAIN corp.example"
Klienti Windows aplikují obě volby sami. Většina klientů Linuxu ne: potřebují podporovanou integraci resolveru, například háček update-resolv-conf distribuce nebo zpracování DNS v NetworkManageru, nebo ručně nastavenou vyhledávací doménu a nameserver. Zkontrolujte skutečný resolver klienta, místo abyste předpokládali, že push byl dodržen, protože ignorovaný push vypadá stejně jako server, který neodpovídá.
Ověřte na třech vrstvách
Nejprve se zeptejte přímo serveru, pak klienta a pak aplikace:
dig +short @10.8.0.1 alice.corp.example
getent hosts files.corp.example
Pokud přímé dotazy odpovídají a aplikace ne, chyba je v předání klientovi, ne v zóně. Pokud se jméno přeloží a spojení stále selhává, jméno je v pořádku a další na řadě je trasa nebo firewall.
Zapište obě kategorie vedle konfigurace: která jména se generují, která jsou připnutá a se kterým certifikátem se každé musí shodovat. Další člověk, který přidá server, zkopíruje první vzor, který najde.