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, prođite dozvole staze pa potvrdite pretragu u dnevniku.
Tunel se diže i klijent se spaja, ali fiksna adresa i gurnute rute koje ste definirali za tog jednog korisnika nedostaju. U dnevniku ne piše “file not found”, i upravo to šalje ljude da ponovno generiraju certifikate. U većini takvih slučajeva demon radi iz drugog direktorija od ljuske u kojoj ste testirali, a client-config-dir nikad nije razriješen onako kako ste pretpostavili. Popravak je ispravak staze, ne resetiranje vjerodajnica.
Pročitajte unit prije nego dirnete konfiguraciju
Krenite 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 kvarova ove vrste:
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 nikad ne postoji, a demon njegovu odsutnost ne smatra kobnom.
Usporedite to s interaktivnim pokretanjem koje ste rabili tijekom testiranja, gdje je trenutačni direktorij vaše ljuske vjerojatno bio konfiguracijski. Ista datoteka, iste ključne riječi, dva različita rezultata.
Prema čemu se razrješava relativna staza
Ključna riječ razrješava se prema radnom direktoriju procesa u trenutku kad se opcija rabi. To ne znači “pokraj konfiguracijske datoteke koju sam predao s --config”. OpenVPN će rado pročitati konfiguraciju s apsolutne staze 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 ponovno pod --cd.
Ključna riječ cd mijenja taj kontekst prije nego 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 utječe na svaku drugu relativnu referencu u istoj datoteci.
Prođite stazu kao račun demona
Staza može biti ispravna i ipak nečitljiva. Nakon spuštanja privilegija demon više nije root, pa svakom nadređenom direktoriju treba dozvola pretraživanja 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 pogreška se očituje samo kao klijent koji tiho dobiva zadani bazen.
namei ispisuje dozvole svake komponente redom, š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 rabi chroot, direktorij mora postojati unutar zatvora, a staza 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 poslužitelj kaže o opcijama specifičnima za klijenta. Na verb 4 demon izvješćuje o uvezenoj konfiguraciji po klijentu, 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 spojite 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 se treba dogoditi kad 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 staze sigurne su samo kad unit fiksira radni direktorij, a fiksiranje je dodatni pokretni dio koji će netko kasnije ukloniti.
client-config-dir /etc/openvpn/server/ccd
ccd-exclusiveRestartajte instancu, ponovno spojite jednog poznatog klijenta i pročitajte adresu koju je dobio zajedno s rutama gurnutima prema njemu. Ako se adresa podudara 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 staza 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 ponovno izdavati zbog ičega od ovoga, a tretiranje problema s direktorijem kao problema s vjerodajnicama način je na koji petominutni popravak postaje prozor za održavanje.