OpenVPN-Clientnamen an dnsmasq: Skript oder statesch Entréen?
Clientadressen änneren sech, Servicenimm net. Generéiert Clientnimm aus der VPN-Sessioun, pinnt Servicenimm an eng drop-in-Datei a maacht dann datt d'Cliente se benotzen.
Op bal all klengem OpenVPN-Gateway dauchen zwou Nummproblemer op. Dir kënnt en ugeschlossenen Laptop net iwwer den Numm op sengem Zertifikat erreechen, an d'Servicer hannert dem Tunnel hunn iwwerhaapt keng Nimm. Si gesinn aus wéi ee Problem a brauchen entgéintgesate Behandlung, well eng Adress mat all Sessioun beweegt an déi aner net. Entscheet Iech, wéi eng Zort Numm Dir bäisetzt, ier Dir eppes ännert.
Entscheet pro Numm, net pro Gateway
Den Test ass einfach: ännert sech dës Adress, wann e Client sech nei verbënnt? Wann jo, muss den Numm aus der VPN-Sessioun generéiert ginn. Wann nee, gehéiert en an eng statesch Entrée, déi Dir liesen an iwwerpréiwen kënnt.
| 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 |
Si vermëschen ass de gewéinleche Feeler. E Service, deen an d'generéiert Datei agepinnt ass, verschwënnt déi éischt Kéier, wou d'Skript se iwwerschreift, an e Client, deen an eng statesch Entrée geschriwwe gouf, weist op deen, deen déi Adress lescht hat. Béid Feeler bleiwen onsichtbar, bis en Numm op déi falsch Maschinn opgeléist gëtt. Bis dohinner unhëlt deen, deen et debuggéiert, datt DNS futti ass an net d'Datei.
Den dynamesche Wee: learn-address an de Pool
OpenVPN kennt d'Zouweisung, also loosst et Iech soen. Dës Serveroptioune maachen d'Zouweisung dauerhaft a skriptbar:
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 féiert Är Skript aus, all Kéier wann eng Adress bäigesat, aktualiséiert oder geläscht gëtt, an iwwergëtt d'Operatioun, d'Adress an den gemeinsamen Numm. Eng minimal Skript füügt eng Zeil pro Client bäi a läscht se beim Läschen:
#!/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)
Op engem tun-Apparat ass dat zweet Argument d'Tunneladress vum Client, also kann d'Zeil direkt benotzt ginn. Op engem tap-Apparat iwwergëtt OpenVPN amplaz d'MAC-Adress vum Client, well en tap-Segment och aner Protokoller wéi IPv4 droe kann, an dann musst Dir d'Adress an der Pool-Datei iwwer de gemeinsamen Numm sichen, ier Dir eppes schreift.
Sidd kloer doriwwer, wat d'generéiert Datei ass: eng Momentopnam dovun, wien elo verbonnen ass. Nimm verschwannen beim Trennen, wat genee dat ass, wat Dir fir Laptopen wëllt, déi tëschend Netzwierker wiesselen, a genee dat, wat Dir net fir e Server wëllt, deen déi ganz Nuecht laaft.
De statesche Wee: address= an Domain-Expansioun
Richt dnsmasq op d'generéiert Datei amplaz vun der System-hosts-Datei, a gitt hir eng Domain, soudatt kuerz Nimm sech a vollqualifizéiert Nimm expandéieren:
domain=corp.example
no-hosts
addn-hosts=/etc/openvpn/hosts.lan
listen-address=127.0.0.1,10.8.0.1
bind-interfaces
Mat domain gesat, äntwert eng Zeil wéi 10.8.0.6 alice souwuel fir alice wéi och fir alice.corp.example. Halt listen-address op dem Tunnel-Gateway an op loopback, well en Resolver, deen zoufälleg um LAN-Interface publizéiert gëtt, e Service ass, deen Dir net wollt ubidden.
Servicer, déi ni aus dem Pool kommen, kréien hir eege Entréen. Setzt se an eng separat drop-in-Datei am Konfiguratiounsverzeechnis vun der Distributioun, soudatt e Pakupdate se net iwwerschreiwe kann:
address=/files.corp.example/10.8.0.20
address=/db.corp.example/10.9.0.5
Gitt den Resolver weider, soss geschitt näischt
En Resolver, deen keen ufreet, ännert näischt. De Server muss en annoncéieren:
push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DOMAIN corp.example"
Windows-Cliente setzen déi zwou Optiounen selwer ëm. Déi meescht Linux-Cliente maachen dat net: si brauchen eng ënnerstëtzte Resolver-Integratioun wéi den update-resolv-conf-Hook vun der Distributioun oder d'DNS-Behandlung vum NetworkManager, oder eng manuell Sichdomain an en Nummenserver. Kontrolléiert den tatsächleche Resolver vum Client amplaz unzehuelen, datt de push respektéiert gouf, well en ignoréierte push genee sou ausgesäit wéi e Server, deen net äntwert.
Verifizéiert op dräi Schichten
Frot als éischt de Server direkt, dann e Client, dann d'Applikatioun:
dig +short @10.8.0.1 alice.corp.example
getent hosts files.corp.example
Wann direkt Ufroe äntwerten an d'Applikatioun net, läit de Feeler an der Iwwerreechung un de Client an net an der Zone. Wann den Numm sech opléist an d'Verbindung nach ëmmer feelt, ass den Numm gutt an dat Nächst, wat een ukuerze soll, ass d'Route oder d'Firewall.
Schreift déi zwou Kategorien nieft d'Konfiguratioun: wéi eng Nimm generéiert ginn, wéi eng agepinnt sinn a mat wéien Zertifikat jiddwereen iwwerenee muss. Déi nächst Persoun, déi e Server bäisetzt, wäert dat éischt Muster kopéieren, dat se fënnt.