Jūsų tunelis pakyla ir klientas prisijungia, bet fiksuotas adresas ir stumiami maršrutai, kuriuos apibrėžėte tam vienam vartotojui, dingę. Žurnale nerašoma “file not found”, ir būtent tai siunčia žmones iš naujo generuoti sertifikatus. Daugeliu šių atvejų demonas veikia iš kito katalogo nei apvalkalas, kuriame testavote, o client-config-dir niekada nebuvo išspręstas taip, kaip darėte prielaidą. Pataisa yra kelio korekcija, o ne prisijungimo duomenų atstatymas.

Perskaitykite unit, prieš liesdami konfigūraciją

Pradėkite nuo proceso, kuris tikrai veikia, o ne nuo failo, kurį redagavote. Paklauskite systemd vykdymo eilutės, darbinio katalogo ir paskyros, į kurią jis nusileidžia. Tie trys atsakymai paaiškina daugumą šios klasės gedimų:

systemctl show openvpn-server@server -p ExecStart -p WorkingDirectory -p User -p RootDirectory

Tuščias WorkingDirectory reiškia, kad unit paleidžiamas /, todėl santykinis client-config-dir ccd ieškomas /ccd. To katalogo beveik niekada nėra, o demonas jo nebuvimo nelaiko mirtinu.

Palyginkite tai su interaktyviu paleidimu, kurį naudojote testuodami, kai jūsų apvalkalo dabartinis katalogas greičiausiai buvo konfigūracijos katalogas. Tas pats failas, tie patys raktiniai žodžiai, du skirtingi rezultatai.

Pagal ką sprendžiamas santykinis kelias

Raktinis žodis sprendžiamas pagal proceso darbinį katalogą tuo metu, kai parinktis naudojama. Tai nereiškia “šalia konfigūracijos failo, kurį perdaviau su --config”. OpenVPN mielai perskaitys konfigūraciją iš absoliutaus kelio ir vis tiek santykines reikšmes išspręs kitur, ir būtent čia yra spąstai. OpenVPN 2.6 vadove taisyklė nurodyta prie --client-config-dir ir dar kartą prie --cd.

Raktinis žodis cd pakeičia tą kontekstą prieš skaitant kitus failus, todėl unit, kuris nustato cd /etc/openvpn/server ir tada client-config-dir ccd, išsprendžiamas į /etc/openvpn/server/ccd. Jei pridedate cd, patikrinkite direktyvų tvarką ir atminkite, kad tai veikia kiekvieną kitą santykinę nuorodą tame pačiame faile.

Pereikite kelią demono paskyros teisėmis

Kelias gali būti teisingas ir vis tiek neperskaitomas. Sumažinus privilegijas demonas nebėra root, todėl kiekvienam pirminiam katalogui reikia paieškos teisės tai paskyrai, o pačiam kliento failui – skaitymo teisės. Vieno trūkstamo vykdymo bito pirminiame kataloge pakanka failui paslėpti, o klaida pasireiškia tik kaip klientas, kuris tyliai gauna numatytąjį telkinį.

namei išspausdina kiekvieno komponento teises iš eilės, tai greičiau nei tikrinti katalogus po vieną:

namei -l /etc/openvpn/server/ccd/client1

Tada patikrinkite skaitymą kaip tarnybos paskyra, o ne kaip jūs pats:

runuser -u openvpn -- test -r /etc/openvpn/server/ccd/client1 && echo readable

Jei unit naudoja chroot, katalogas turi egzistuoti kalėjimo viduje, o konfigūracijos kelias interpretuojamas po chroot pritaikymo. Failas, esantis pagrindiniame kompiuteryje už kalėjimo, iš vidaus nematomas.

Patvirtinkite paiešką, o ne spėliokite

Vienam perkrovimui padidinkite žurnalo lygį ir perskaitykite, ką serveris sako apie klientui būdingas parinktis. Esant verb 4 demonas praneša importuotą kiekvieno kliento konfigūraciją, todėl trūkstama eilutė yra tiesioginis įrodymas, kad šiam ryšiui nebuvo perskaitytas joks failas.

openvpn --config /etc/openvpn/server.conf --verb 4 --client-config-dir /etc/openvpn/server/ccd

Paleiskite tai priekiniame plane laisvame porte ir prijunkite vieną klientą. Tai visiškai pašalina systemd iš vaizdo: jei perrašymai atsiranda čia, o ne po tarnyba, skirtumas yra unit kontekste, o ne faile.

Nuspręskite, kas turi įvykti, kai joks failas neatitinka. Be ccd-exclusive klientas priimamas tik su visuotinėmis telkinio nuostatomis, ir tai yra aukščiau aprašytas tylus gedimas. Su juo trūkstamas failas tampa atmestu ryšiu, o toks atmetimas lengviau pastebimas, bet sunkiau derinamas esant apkrovai.

Pataisykite, perkraukite, patikrinkite

Padarykite katalogą absoliutų konfigūracijoje ir palikite taip. Santykiniai keliai saugūs tik tada, kai unit užfiksuoja darbinį katalogą, o užfiksavimas yra papildoma judanti dalis, kurią kas nors vėliau pašalins.

client-config-dir /etc/openvpn/server/ccd
ccd-exclusive

Perkraukite egzempliorių, vėl prijunkite vieną žinomą klientą ir perskaitykite adresą, kurį jis gavo, kartu su jam stumiamais maršrutais. Jei adresas atitinka eilutę ifconfig-push to kliento faile, paieška veikė. Jei klientas vis tiek patenka į bendrą telkinį, grįžkite prie žurnalo eilučių skaičiaus: nulis importų reiškia, kad kelias arba tapatybė neteisingi, vienas importas su neteisingu turiniu reiškia, kad redaguojate kitą failą nei tas, kurį skaito demonas.

Grįžkite atgal atkurdami ankstesnį unit ir konfigūraciją kartu, tada perkraukite. Sertifikatų dėl nieko iš to nereikia išduoti iš naujo, o katalogo problemos traktavimas kaip prisijungimo duomenų problemos yra būdas, kuriuo penkių minučių pataisa virsta techninės priežiūros langu.

Susiję straipsniai