Beveik kiekviename mažame OpenVPN šliuze iškyla dvi vardų problemos. Prie prisijungusio nešiojamojo kompiuterio nepasieksite vardu iš jo sertifikato, o paslaugos už tunelio apskritai neturi vardų. Jos atrodo kaip viena problema ir reikalauja priešingo sprendimo, nes vienas adresas juda su kiekviena sesija, o kitas – ne. Prieš ką nors redaguodami nuspręskite, kokio tipo vardą pridedate.

Spręskite pagal vardą, o ne pagal šliuzą

Testas paprastas: ar šis adresas pasikeičia, kai klientas prisijungia iš naujo? Jei taip, vardas turi būti generuojamas iš VPN sesijos. Jei ne, jis priklauso statiniam įrašui, kurį galite perskaityti ir peržiūrėti.

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

Jų maišymas – įprasta klaida. Į sugeneruotą failą įtvirtinta paslauga dingsta pirmą kartą, kai scenarijus jį perrašo, o į statinį įrašą įrašytas klientas rodo į tą, kuris tą adresą turėjo paskutinis. Abi klaidos lieka nematomos, kol vardas neišsprendžiamas į netinkamą mašiną. Iki tol derintojas mano, kad sugedo DNS, o ne failas.

Dinaminis kelias: learn-address ir baseinas

OpenVPN žino priskyrimą, tad leiskite jam pasakyti. Šios serverio parinktys daro priskyrimą ilgaamžį ir skriptuojamą:

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 paleidžia jūsų scenarijų kiekvieną kartą, kai adresas pridedamas, atnaujinamas ar ištrinamas, ir perduoda operaciją, adresą bei bendrą vardą. Minimalus scenarijus prideda po vieną eilutę klientui ir pašalina ją trinant:

#!/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 įrenginyje antrasis argumentas yra kliento tunelio adresas, todėl eilutę galima naudoti tiesiogiai. tap įrenginyje OpenVPN perduoda kliento MAC adresą, nes tap segmentas gali perduoti ir kitus protokolus nei IPv4, ir tada prieš ką nors rašydami adreso turite ieškoti baseino faile pagal bendrą vardą.

Būkite tikri, kas yra sugeneruotas failas: momentinė nuotrauka, kas prisijungęs dabar. Vardai dingsta atsijungus, ir būtent to norite nešiojamiesiems kompiuteriams, kurie juda tarp tinklų, ir būtent to nenorite serveriui, kuris veikia visą naktį.

Statinis kelias: address= ir domeno išplėtimas

Nukreipkite dnsmasq į sugeneruotą failą vietoj sistemos hosts failo ir suteikite jam domeną, kad trumpi vardai išsiplėstų į pilnai kvalifikuotus:

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

Kai domain nustatytas, eilutė kaip 10.8.0.6 alice atsako ir alice, ir alice.corp.example. Laikykite listen-address tik tunelio šliuze ir loopback, nes LAN sąsajoje netyčia paskelbtas rezolveris yra paslauga, kurios nenumatėte siūlyti.

Paslaugos, kurios niekada neateina iš baseino, gauna savo įrašus. Įdėkite juos į atskirą drop-in failą distribucijos konfigūracijos kataloge, kad paketo naujinimas negalėtų jų perrašyti:

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

Perduokite rezolverį, kitaip nieko neatsitiks

Rezolveris, kurio niekas neklausia, nieko nekeičia. Serveris turi jį paskelbti:

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

Windows klientai abi parinktis pritaiko patys. Dauguma Linux klientų – ne: jiems reikia palaikomos rezolverio integracijos, pavyzdžiui, distribucijos update-resolv-conf kabliuko ar NetworkManager DNS tvarkymo, arba rankiniu būdu nustatyto paieškos domeno ir vardų serverio. Tikrinkite tikrąjį kliento rezolverį, o ne manykite, kad push buvo įvykdytas, nes ignoruotas push atrodo lygiai kaip serveris, kuris neatsako.

Patikrinkite trimis sluoksniais

Pirmiausia paklauskite serverio tiesiogiai, tada kliento, tada programos:

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

Jei tiesioginės užklausos atsako, o programa – ne, kaltė yra perdavime klientui, o ne zonoje. Jei vardas išsprendžiamas, o ryšys vis tiek nepavyksta, vardas geras, o toliau reikia žiūrėti maršrutą arba užkardą.

Užrašykite abi kategorijas šalia konfigūracijos: kurie vardai generuojami, kurie įtvirtinti ir su kokiu sertifikatu kiekvienas turi sutapti. Kitas žmogus, pridėsiantis serverį, nukopijuos pirmą rastą šabloną.

Susiję straipsniai