Gandrīz katrā mazā OpenVPN vārtejā parādās divas nosaukumu problēmas. Pievienotam portatīvajam datoram nevar piekļūt ar nosaukumu no tā sertifikāta, un pakalpojumiem aiz tuneļa vispār nav nosaukumu. Tās izskatās kā viena problēma un prasa pretēju pieeju, jo viena adrese mainās ar katru sesiju, bet otra ne. Pirms kaut ko rediģējat, izlemiet, kāda veida nosaukumu pievienojat.

Izlemiet pēc nosaukuma, nevis pēc vārtejas

Tests ir vienkāršs: vai šī adrese mainās, kad klients atkārtoti pieslēdzas? Ja jā, nosaukums jāģenerē no VPN sesijas. Ja nē, tas pieder statiskam ierakstam, ko varat izlasīt un pārskatīt.

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

To sajaukšana ir ierastā kļūda. Ģenerētajā failā nofiksēts pakalpojums pazūd pirmajā reizē, kad skripts to pārraksta, un statiskā ierakstā ierakstīts klients norāda uz to, kam šī adrese bija pēdējam. Abas kļūdas paliek neredzamas, līdz nosaukums tiek atrisināts uz nepareizo mašīnu. Līdz tam atkļūdotājs pieņem, ka DNS ir salauzts, nevis fails.

Dinamiskais ceļš: learn-address un baseins

OpenVPN zina piešķīrumu, tāpēc ļaujiet tam pateikt. Šīs servera opcijas padara piešķīrumu noturīgu un skriptējamu:

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 palaiž jūsu skriptu katru reizi, kad adrese tiek pievienota, atjaunināta vai dzēsta, un nodod darbību, adresi un kopējo nosaukumu. Minimālais skripts pievieno vienu rindu katram klientam un dzēšanas laikā to noņem:

#!/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)

tun ierīcē otrais arguments ir klienta tuneļa adrese, tāpēc rindu var izmantot tieši. tap ierīcē OpenVPN tā vietā nodod klienta MAC adresi, jo tap segments var pārvadāt arī citus protokolus, nevis IPv4, un tad pirms kaut kā rakstīšanas adrese jāmeklē baseina failā pēc kopējā nosaukuma.

Esiet skaidri par to, kas ir ģenerētais fails: momentuzņēmums par to, kas pašlaik ir pieslēgts. Nosaukumi pazūd atslēgšanās laikā, un tas ir tieši tas, ko vēlaties portatīvajiem datoriem, kas pārvietojas starp tīkliem, un tieši tas, ko nevēlaties serverim, kas darbojas visu nakti.

Statiskais ceļš: address= un domēna paplašināšana

Novirziet dnsmasq uz ģenerēto failu, nevis sistēmas hosts failu, un piešķiriet tam domēnu, lai īsie nosaukumi paplašinātos pilnīgi kvalificētos:

domain=corp.example
no-hosts
addn-hosts=/etc/openvpn/hosts.lan
listen-address=127.0.0.1,10.8.0.1
bind-interfaces

Kad domain ir iestatīts, rinda kā 10.8.0.6 alice atbild gan par alice, gan alice.corp.example. Turiet listen-address tikai uz tuneļa vārtejas un loopback, jo LAN saskarnē nejauši publicēts risinātājs ir pakalpojums, ko neplānojāt piedāvāt.

Pakalpojumi, kas nekad nenāk no baseina, iegūst savus ierakstus. Ievietojiet tos atsevišķā drop-in failā izplatīšanas konfigurācijas direktorijā, lai pakotnes atjauninājums nevarētu tos pārrakstīt:

address=/files.corp.example/10.8.0.20
address=/db.corp.example/10.9.0.5

Nododiet risinātāju, citādi nekas nenotiks

Risinātājs, kuru neviens neuzjautā, neko nemaina. Serverim tas jāreklamē:

push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DOMAIN corp.example"

Windows klienti abas opcijas piemēro paši. Lielākā daļa Linux klientu to nedara: tiem vajag atbalstītu risinātāja integrāciju, piemēram, izplatīšanas update-resolv-conf āķi vai NetworkManager DNS apstrādi, vai manuāli iestatītu meklēšanas domēnu un nosaukumu serveri. Pārbaudiet klienta faktisko risinātāju, nevis pieņemiet, ka push tika ievērots, jo ignorēts push izskatās tieši kā serveris, kas neatbild.

Pārbaudiet trīs slāņos

Vispirms jautājiet serverim tieši, pēc tam klientam, pēc tam lietojumprogrammai:

dig +short @10.8.0.1 alice.corp.example
getent hosts files.corp.example

Ja tiešie vaicājumi atbild un lietojumprogramma ne, vaina ir nodošanā klientam, nevis zonā. Ja nosaukums tiek atrisināts un savienojums joprojām neizdodas, nosaukums ir kārtībā, un nākamais, kas jāskatās, ir maršruts vai ugunsmūris.

Pierakstiet abas kategorijas blakus konfigurācijai: kuri nosaukumi tiek ģenerēti, kuri ir nofiksēti un ar kuru sertifikātu katram jāsakrīt. Nākamais cilvēks, kas pievienos serveri, nokopēs pirmo atrasto modeli.

Saistītie raksti