Tunel sa zdvihne a klient sa pripojí, ale pevná adresa a protlačené trasy, ktoré ste definovali pre tohto jedného používateľa, chýbajú. V logu nie je “file not found”, a práve to posiela ľudí regenerovať certifikáty. Vo väčšine týchto prípadov démon beží z iného adresára ako shell, v ktorom ste testovali, a client-config-dir sa nikdy nevyhodnotil tak, ako ste predpokladali. Oprava je úprava cesty, nie reset poverení.

Prečítajte unit, skôr než sa dotknete konfigurácie

Začnite procesom, ktorý skutočne beží, nie súborom, ktorý ste upravovali. Spýtajte sa systemd na príkazový riadok, pracovný adresár a účet, na ktorý prechádza. Tieto tri odpovede vysvetľujú väčšinu zlyhaní tejto triedy:

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

Prázdny WorkingDirectory znamená, že unit štartuje v /, takže relatívny client-config-dir ccd sa hľadá v /ccd. Tento adresár takmer nikdy neexistuje a démon nepovažuje jeho neprítomnosť za fatálnu.

Porovnajte to s interaktívnym spustením, ktoré ste používali pri testovaní, kde bol aktuálny adresár vášho shellu pravdepodobne konfiguračným adresárom. Ten istý súbor, tie isté kľúčové slová, dva rôzne výsledky.

Voči čomu sa relatívna cesta vyhodnocuje

Kľúčové slovo sa vyhodnocuje voči pracovnému adresáru procesu v okamihu použitia voľby. Neznamená to “vedľa konfiguračného súboru, ktorý som odovzdal cez --config”. OpenVPN ochotne prečíta konfiguráciu z absolútnej cesty a relatívne hodnoty aj tak vyhodnotí inde, a presne v tom je pasca. Manuál OpenVPN 2.6 uvádza pravidlo pod --client-config-dir a znova pod --cd.

Kľúčové slovo cd mení tento kontext pred čítaním ďalších súborov, takže unit, ktorý nastaví cd /etc/openvpn/server a potom client-config-dir ccd, sa vyhodnotí na /etc/openvpn/server/ccd. Ak pridáte cd, skontrolujte poradie direktív a pamätajte, že ovplyvňuje každý ďalší relatívny odkaz v tom istom súbore.

Prejdite cestu ako účet démona

Cesta môže byť správna a napriek tomu nečitateľná. Po znížení oprávnení démon už nie je root, takže každý nadradený adresár potrebuje pre tento účet právo prechodu a samotný klientský súbor právo čítania. Jeden chýbajúci bit spustenia na nadradenom adresári stačí na skrytie súboru a chyba sa prejaví len ako klient, ktorý ticho dostane predvolený fond.

namei vypisuje oprávnenia každého komponentu v poradí, čo je rýchlejšie než kontrolovať adresáre jeden po druhom:

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

Potom otestujte čítanie ako účet služby, nie ako vy:

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

Ak unit používa chroot, adresár musí existovať vo vnútri väzenia a cesta v konfigurácii sa interpretuje až po aplikácii chroot. Súbor, ktorý je na hostiteľovi mimo väzenia, je zvnútra neviditeľný.

Potvrďte hľadanie namiesto hádania

Zvýšte úroveň logu na jedno reštartovanie a prečítajte si, čo server hovorí o voľbách špecifických pre klienta. Pri verb 4 démon hlási importovanú konfiguráciu pre každého klienta, takže chýbajúci riadok je priamym dôkazom, že pre toto spojenie nebol prečítaný žiadny súbor.

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

Spustite to v popredí na inom porte a pripojte jedného klienta. Tým systemd úplne zmizne z obrazu: ak sa prepisy objavia tu a nie pod službou, rozdiel je v kontexte unitu, nie v súbore.

Rozhodnite, čo sa má stať, keď žiadny súbor nezodpovedá. Bez ccd-exclusive je klient prijatý len s globálnym nastavením fondu, a to je tiché zlyhanie opísané vyššie. S ním sa chýbajúci súbor stane odmietnutým spojením, a také odmietnutie je ľahšie postrehnuteľné, ale ťažšie ladené pod záťažou.

Opravte, reštartujte, overte

Urobte adresár v konfigurácii absolútnym a nechajte ho tak. Relatívne cesty sú bezpečné len vtedy, keď unit pripne pracovný adresár, a pripnutie je ďalší pohyblivý diel, ktorý niekto neskôr odstráni.

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

Reštartujte inštanciu, znova pripojte jedného známeho klienta a prečítajte adresu, ktorú dostal, spolu s trasami protlačenými k nemu. Ak adresa zodpovedá riadku ifconfig-push v súbore toho klienta, hľadanie fungovalo. Ak klient stále končí vo všeobecnom fonde, vráťte sa k počtu riadkov v logu: nula importov znamená, že cesta alebo identita sú nesprávne, jeden import s nesprávnym obsahom znamená, že upravujete iný súbor než ten, ktorý démon číta.

Vráťte sa späť obnovením predchádzajúceho unitu a konfigurácie spolu a potom reštartujte. Certifikáty netreba pre nič z toho znova vydávať, a prístup k problému s adresárom ako k problému s povereniami je spôsob, akým sa z päťminútovej opravy stane servisné okno.

Súvisiace články