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 kindSource of truthWhere it lives
Connected clientThe address OpenVPN just assignedGenerated hosts file, rewritten per session
Service behind the tunnelA fixed address you choseStatic address= drop-in
Anything with a certificate nameThe certificate, not the poolEither, 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.

Související články