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 RootDirectory

Prazan 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/client1

Zatim testirajte čitanje kao račun servisa, a ne kao sebe:

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

Ako 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/ccd

Pokrenite 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-exclusive

Restartajte 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.

Povezani članci