Imena OpenVPN klijenata u dnsmasqu: skripta ili statični unosi?
Adrese klijenata se mijenjaju, imena servisa ne. Generirajte imena klijenata iz VPN sesije, prikvačite imena servisa u drop-in datoteku i zatim natjerajte klijente da je koriste.
Dva problema s imenima pojavljuju se na gotovo svakom malom OpenVPN pristupniku. Do povezanog prijenosnika ne možete doći po imenu iz njegovog certifikata, a servisi iza tunela uopće nemaju imena. Izgledaju kao jedan problem, a traže suprotne pristupe, jer se jedna adresa mijenja sa svakom sesijom, a druga ne. Odlučite koju vrstu imena dodajete prije nego što bilo što uredite.
Odlučujte po imenu, ne po pristupniku
Test je jednostavan: mijenja li se ta adresa kada se klijent ponovno poveže? Ako da, ime se mora generirati iz VPN sesije. Ako ne, pripada statičnom unosu koji možete pročitati i pregledati.
| 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 |
Njihovo miješanje uobičajen je promašaj. Servis prikvačen u generiranu datoteku nestaje prvi put kada ga skripta prepiše, a klijent upisan u statični unos pokazuje na onoga ko je tu adresu zadnji držao. Obje greške ostaju nevidljive dok se ime ne razriješi na pogrešno računalo. Do tada osoba koja to otklanja pretpostavlja da je DNS pokvaren, a ne datoteka.
Dinamički put: learn-address i pool
OpenVPN zna dodjelu, pa neka vam kaže. Ove serverske opcije čine dodjelu trajnom i podobnom za skripte:
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 pokreće vašu skriptu kad god se adresa doda, ažurira ili izbriše i prosljeđuje operaciju, adresu i zajedničko ime. Minimalna skripta dodaje jedan redak po klijentu i uklanja ga pri brisanju:
#!/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 tun uređaju drugi argument je tunelska adresa klijenta, pa je redak izravno upotrebljiv. Na tap uređaju OpenVPN umjesto toga prosljeđuje MAC adresu klijenta, jer tap segment može nositi i protokole osim IPv4, a tada adresu morate potražiti u datoteci poola prema zajedničkom imenu prije nego što bilo što napišete.
Budite jasni o tome što je generirana datoteka: snimka onoga ko je trenutačno povezan. Imena nestaju pri prekidu veze, što je upravo ono što želite za prijenosnike koji se sele između mreža i upravo ono što ne želite za poslužitelj koji radi cijelu noć.
Statički put: address= i proširenje domene
Usmjerite dnsmasq na generiranu datoteku umjesto na sistemsku hosts datoteku i dajte mu domenu kako bi se kratka imena proširila u potpuno kvalificirana:
domain=corp.example
no-hosts
addn-hosts=/etc/openvpn/hosts.lan
listen-address=127.0.0.1,10.8.0.1
bind-interfaces
Kada je domain postavljen, redak poput 10.8.0.6 alice odgovara i za alice i za alice.corp.example. Držite listen-address samo na tunelskom pristupniku i loopbacku, jer je razrješivač slučajno objavljen na LAN sučelju usluga koju niste namjeravali nuditi.
Servisi koji nikada ne dolaze iz poola dobivaju vlastite unose. Stavite ih u zasebnu drop-in datoteku u konfiguracijskom direktoriju distribucije kako ih nadogradnja paketa ne bi mogla prepisati:
address=/files.corp.example/10.8.0.20
address=/db.corp.example/10.9.0.5
Predajte razrješivač ili se ništa neće dogoditi
Razrješivač koji nitko ne pita ništa ne mijenja. Poslužitelj ga mora objaviti:
push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DOMAIN corp.example"
Windows klijenti sami primjenjuju obje opcije. Većina Linux klijenata ne: potrebna im je podržana integracija razrješivača, poput update-resolv-conf kuke distribucije ili NetworkManagerove obrade DNS-a, ili ručno postavljene domene pretraživanja i poslužitelja imena. Provjerite stvarni razrješivač klijenta umjesto da pretpostavite da je push poštovan, jer ignorirani push izgleda jednako kao poslužitelj koji ne odgovara.
Provjerite na tri sloja
Prvo pitajte poslužitelj izravno, zatim klijent, a zatim aplikaciju:
dig +short @10.8.0.1 alice.corp.example
getent hosts files.corp.example
Ako izravni upiti odgovaraju, a aplikacija ne, greška je u predaji klijentu, a ne u zoni. Ako se ime razriješi, a veza i dalje ne uspijeva, ime je u redu i sljedeće što treba pogledati je ruta ili vatrozid.
Zapišite dvije kategorije uz konfiguraciju: koja se imena generiraju, koja su prikvačena i s kojim certifikatom se svako mora podudarati. Sljedeća osoba koja doda poslužitelj kopirat će prvi uzorak koji nađe.