Tunel se zvedne a klient se připojí, ale pevná adresa a protlačené trasy, které jste pro tohoto jednoho uživatele definovali, chybí. V logu není “file not found”, a právě to posílá lidi regenerovat certifikáty. Ve většině těchto případů démon běží z jiného adresáře než shell, ve kterém jste testovali, a client-config-dir se nikdy nevyhodnotil tak, jak jste předpokládali. Oprava je úprava cesty, ne reset pověření.

Přečtěte unit, než sáhnete na konfiguraci

Začněte procesem, který skutečně běží, ne souborem, který jste upravovali. Zeptejte se systemd na příkazový řádek, pracovní adresář a účet, na který přechází. Tyto tři odpovědi vysvětlují většinu selhání této třídy:

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

Prázdný WorkingDirectory znamená, že unit startuje v /, takže relativní client-config-dir ccd se hledá v /ccd. Tento adresář téměř nikdy neexistuje a démon nepovažuje jeho nepřítomnost za fatální.

Porovnejte to s interaktivním spuštěním, které jste používali při testování, kde byl aktuální adresář vašeho shellu pravděpodobně konfiguračním adresářem. Stejný soubor, stejná klíčová slova, dva různé výsledky.

Vůči čemu se relativní cesta vyhodnocuje

Klíčové slovo se vyhodnocuje vůči pracovnímu adresáři procesu v okamžiku použití volby. Neznamená to “vedle konfiguračního souboru, který jsem předal pomocí --config”. OpenVPN klidně přečte konfiguraci z absolutní cesty a relativní hodnoty přesto vyhodnotí jinde, a to je přesně ta past. Manuál OpenVPN 2.6 uvádí pravidlo pod --client-config-dir a znovu pod --cd.

cd mění tento kontext dříve, než se čtou další soubory, takže unit, který nastaví cd /etc/openvpn/server a potom client-config-dir ccd, se vyhodnotí na /etc/openvpn/server/ccd. Pokud přidáte cd, zkontrolujte pořadí direktiv a pamatujte, že ovlivňuje každý další relativní odkaz ve stejném souboru.

Projděte cestu jako účet démona

Cesta může být správná a přesto nečitelná. Po snížení oprávnění démon už není root, takže každý nadřazený adresář potřebuje pro tento účet právo procházení a klientský soubor sám právo čtení. Jeden chybějící bit spuštění na nadřazeném adresáři stačí k tomu, aby soubor zmizel, a chyba se projeví jen jako klient, který tiše dostane výchozí fond.

namei vypisuje oprávnění každé komponenty v pořadí, což je rychlejší než kontrolovat adresáře jeden po druhém:

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

Potom otestujte čtení jako účet služby, ne jako vy:

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

Pokud unit používá chroot, adresář musí existovat uvnitř vězení a cesta v konfiguraci se interpretuje až po aplikaci chroot. Soubor, který je na hostiteli mimo vězení, je zevnitř neviditelný.

Potvrďte hledání místo hádání

Zvyšte úroveň logu na jedno restartování a přečtěte si, co server říká o volbách specifických pro klienta. Při verb 4 démon hlásí importovanou konfiguraci pro každého klienta, takže chybějící řádek je přímým důkazem, že pro toto spojení nebyl přečten žádný soubor.

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

Spusťte to v popředí na jiném portu a připojte jednoho klienta. Tím systemd úplně zmizí ze hry: pokud se přepisy objeví tady a ne pod službou, rozdíl je v kontextu unitu, ne v souboru.

Rozhodněte, co se má stát, když žádný soubor neodpovídá. Bez ccd-exclusive je klient přijat jen s globálním nastavením fondu, a to je tiché selhání popsané výše. S ním se chybějící soubor stane odmítnutým spojením, a takové odmítnutí je snazší si všimnout, ale těžší ladit pod zátěží.

Opravte, restartujte, ověřte

Udělejte adresář v konfiguraci absolutním a nechte ho tak. Relativní cesty jsou bezpečné jen tehdy, když unit připne pracovní adresář, a připnutí je další pohyblivý díl, který někdo později odstraní.

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

Restartujte instanci, znovu připojte jednoho známého klienta a přečtěte adresu, kterou dostal, spolu s trasami, které se k němu protlačily. Pokud adresa odpovídá řádku ifconfig-push v souboru toho klienta, hledání fungovalo. Pokud klient stále končí v obecném fondu, vraťte se k počtu řádků v logu: nula importů znamená, že cesta nebo identita je špatná, jeden import se špatným obsahem znamená, že upravujete jiný soubor, než který démon čte.

Vraťte se zpět obnovením předchozího unitu a konfigurace společně a potom restartujte. Certifikáty kvůli tomu není třeba znovu vydávat, a přístup k problému s adresářem jako k problému s pověřeními je způsob, jak se z pětiminutové opravy stane servisní okno.

Související články