client-config-dir se ignorira nakon što je OpenVPN postao servis
Relativni client-config-dir razrješava se prema radnom direktoriju demona. Pročitajte unit, provjerite dozvole na putanji, pa potvrdite pretragu u dnevniku.
Tunel se podiže i klijent se povezuje, ali fiksna adresa i rute koje ste definirali i poslali za tog jednog korisnika nedostaju. U dnevniku ne piše “file not found”, i upravo to šalje ljude da ponovo generiraju certifikate. U većini ovih slučajeva demon radi iz drugog direktorija od školjke u kojoj ste testirali, a client-config-dir nikada nije razriješen onako kako ste pretpostavili. Popravka je ispravljanje putanje, a ne resetiranje akreditiva.
Pročitajte unit prije nego što dirnete konfiguraciju
Počnite od procesa koji stvarno radi, a ne od datoteke koju ste uredili. Pitajte systemd za izvršni redak, radni direktorij i račun na koji prelazi. Ta tri odgovora objašnjavaju većinu ovakvih kvarova:
systemctl show openvpn-server@server -p ExecStart -p WorkingDirectory -p User -p RootDirectoryPrazan WorkingDirectory znači da unit počinje u /, pa se relativni client-config-dir ccd traži u /ccd. Taj direktorij gotovo nikada ne postoji, a demon njegovo odsustvo ne smatra kobnim.
Uporedite to s interaktivnim pokretanjem koje ste koristili tokom testiranja, gdje je trenutni direktorij vaše školjke vjerojatno bio konfiguracijski. Ista datoteka, iste ključne riječi, dva različita rezultata.
Prema čemu se razrješava relativna putanja
Ključna riječ se razrješava prema radnom direktoriju procesa u trenutku kada se opcija koristi. To ne znači “pored konfiguracijske datoteke koju sam predao s --config". OpenVPN će rado pročitati konfiguraciju s apsolutne putanje i ipak razriješiti relativne vrijednosti negdje drugdje, a to je upravo zamka ovdje. Priručnik OpenVPN 2.6 navodi pravilo pod --client-config-dir i ponovo pod --cd.
cd mijenja taj kontekst prije nego što se čitaju druge datoteke, pa se unit koji postavlja cd /etc/openvpn/server i zatim client-config-dir ccd razrješava u /etc/openvpn/server/ccd. Ako dodate cd, provjerite redoslijed direktiva i zapamtite da on utječe na svaku drugu relativnu referencu u istoj datoteci.
Prođite putanju kao račun demona
Putanja može biti ispravna i ipak nečitljiva. Nakon spuštanja privilegija demon više nije root, pa svakom nadređenom direktoriju treba dozvola pretrage za taj račun, a sama klijentska datoteka treba dozvolu čitanja. Jedan nedostajući bit izvršavanja na nadređenom direktoriju dovoljan je da sakrije datoteku, a greška se pojavljuje samo kao klijent koji tiho dobija zadani bazen.
namei ispisuje dozvole svake komponente po redu, što je brže od provjere direktorija jedan po jedan:
namei -l /etc/openvpn/server/ccd/client1Zatim testirajte čitanje kao račun servisa, a ne kao sebe:
runuser -u openvpn -- test -r /etc/openvpn/server/ccd/client1 && echo readableAko unit koristi chroot, direktorij mora postojati unutar zatvora, a putanja u konfiguraciji tumači se nakon primjene chroot. Datoteka koja postoji na hostu izvan zatvora nevidljiva je iznutra.
Potvrdite pretragu umjesto nagađanja
Podignite razinu dnevnika za jedno ponovno pokretanje i pročitajte što server kaže o opcijama specifičnim za klijenta. Na verb 4 demon izvještava koju je konfiguraciju po klijentu uvezao, pa je odsutan redak izravan dokaz da nijedna datoteka nije pročitana za tu vezu.
openvpn --config /etc/openvpn/server.conf --verb 4 --client-config-dir /etc/openvpn/server/ccdPokrenite to u prvom planu na drugom portu i povežite jednog klijenta. Time systemd potpuno izlazi iz slike: ako se nadjačavanja pojave ovdje, a ne pod servisom, razlika je u kontekstu unita, ne u datoteci.
Odlučite što treba da se dogodi kada nijedna datoteka ne odgovara. Bez ccd-exclusive klijent se prima samo s globalnim postavkama bazena, i to je tihi kvar opisan gore. S njom nedostajuća datoteka postaje odbijena veza, a takvo odbijanje lakše je primijetiti, ali teže otkloniti pod opterećenjem.
Popravite, restartajte, provjerite
Učinite direktorij apsolutnim u konfiguraciji i ostavite ga takvim. Relativne putanje su sigurne samo kada unit fiksira radni direktorij, a fiksiranje je dodatni pokretni dio koji će neko kasnije ukloniti.
client-config-dir /etc/openvpn/server/ccd
ccd-exclusiveRestartajte instancu, ponovo povežite jednog poznatog klijenta i pročitajte adresu koju je dobio zajedno s rutama poslanim prema njemu. Ako se adresa poklapa s retkom ifconfig-push u datoteci tog klijenta, pretraga je uspjela. Ako klijent i dalje završi u općem bazenu, vratite se na broj redaka u dnevniku: nula uvoza znači da su putanja ili identitet pogrešni, jedan uvoz s pogrešnim sadržajem znači da uređujete drugu datoteku od one koju demon čita.
Vratite se vraćanjem prethodnog unita i konfiguracije zajedno, pa restartajte. Certifikate nije potrebno ponovo izdavati zbog ovoga, a tretiranje problema s direktorijem kao problema s akreditivima je način na koji petominutna popravka postaje prozor za održavanje.