systemd ustavi storitev VPN: uskladite Type= s odjemalcem
Enota VPN se ob zagonu ne aktivira, ko Type= ne ustreza življenjski dobi odjemalca. Uskladite vrsto, popravite lastništvo in razvrstite storitev za tunelom.
Enote so lahko videti pravilne, systemctl start lahko sporoči uspeh, in deset sekund kasneje storitev stoji neaktivna. Ali pa se znova zažene vsake pol minute, dokler je omejitev zagona ne ustavi. Nobeno od obnašanj ni omrežna napaka: enota opisuje življenjsko dobo procesa, ki se ne ujema s tem, kar odjemalec v resnici počne. Odjemalec lahko forka in izstopi, ali nastavi sejo in takoj izstopi.
Zakaj enota nekaj sekund po uspešnem zagonu postane neaktivna
systemd stanje izpelje iz procesa, ki ga je zagnal, zato je Type= trditev o tem procesu, ne dokumentacija. S Type=simple enota velja za aktivno, dokler ukaz teče, in postane neaktivna, ko se vrne. Odjemalec, ki povezavo preda pomožnemu programu in izstopi, zato izgleda kot sesutje, tudi ko je tunel pokonci. Dnevnik nato pokaže vzorec zagona in ustavitve, ki se bere kot pokvarjena binarna datoteka.
Preberite vrsto enote ob obnašanju odjemalca, preden se dotaknete omrežne nastavitve.
Izberite vrsto, ki ustreza odjemalcu
Dva vzorca pokrijeta večino CLI ponudnikov: ukaz, ki nastavi sejo in izstopi, ter ukaz, ki pred vrnitvijo forka pomožni program. Vsak zahteva drugačno obliko enote.
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/bin/protonvpn-cli connect -f
ExecStop=/usr/bin/protonvpn-cli disconnectoneshot z RemainAfterExit=true ohrani enoto aktivno po vrnitvi ukaza, kar ustreza vzorcu nastavi in izstopi, ustavljalni ukaz pa storitvi omogoči čisto zaustavitev. Odjemalec, ki forka, ohrani enako obliko, vendar potrebuje Type=forking, da systemd sledi otroku. Nastavite Restart=on-failure, RestartSec=30 in končni StartLimitBurst, da se izpad ponudnika ne spremeni v zanko ponovnih zagonov, ki pokoplje napako.
Nikoli ne dovolite, da bi nadzorovani odjemalec postal demon
Nadzorniki zunaj systemd udarijo ob isto steno. Skript runit, ki zažene demoniziranega odjemalca, se takoj vrne nadzorniku, ta pa vrnitev prebere kot sesutje in zažene še eno kopijo. Vsak nadzornik pričakuje, da ima proces v ospredju, kot sshd -D ostane spredaj. Pri nadzorovanih ukazih odstranite zastavico za demon in prepustite delo v ozadju nadzorniku. Ovojni skripti, ki se vrnejo, preden tunel obstaja, povzročajo enako zmedo.
Proces, ki se odcepi od sebe, je neviden vsemu, kar bi ga moralo opazovati.
Seja se konča in s seboj odnese tunel
Namizna seja ima v lasti odjemalca, ki ga zažene. Končajte prijavo in sejno vodilo izgine ter s seboj odnese tunel, kar pojasnjuje, zakaj povezava grafičnega odjemalca pogosto pade, ko se zapre zadnje okno. Strežniki bi morali uporabljati sistemsko enoto ali profil NetworkManager, ki se dvigne sam. Uporabniška enota je smiselna le, kadar naj bi se tunel končal s prijavo, zato jo privežite na cilj grafične seje in to navedite v opisu.
Uporabnik storitve je druga polovica iste težave. Ključ v lasti root z načinom 0600 je za enoto, ki teče pod drugim računom, neberljiv, ne glede na to, kaj je sudo dosegel v vaši lupini.
systemctl cat openvpn-server@work
sudo chown -R openvpn:network /etc/openvpn/server
sudo find /etc/openvpn -type f -perm /077 -lsRazvrstite odvisne enote, ko naslov obstaja
Ko se demon priveže na naslov tunela, ki še ni ustvarjen, izstopi s Cannot assign requested address. Popravek je izrecno razvrščanje, ne zanka ponovnih poskusov.
[Unit]
After=network.target [email protected]
Requires=sys-devices-virtual-net-wg0.deviceAfter= razvrsti opravila, medtem ko Requires= na enoti naprave priveže odvisno enoto na obstoj vmesnika, kar je močneje kot čakanje samo na omrežni cilj. Po urejanju znova naložite upravitelja in znova zaženite odvisno storitev, nato preberite njen dnevnik, namesto da bi domnevali, da je vrstni red deloval. Pošiljajte izhod odjemalca v dnevnik z StandardOutput=journal ali možnostjo beleženja, ker je nadzorovani odjemalec, ki piše v datoteko, ki je nihče ne odpre, videti enako kot tisti, ki se nikoli ni zagnal.
Nato enkrat znova zaženite in potrdite, da je enota aktivna, ko se pojavi naprava tunela. Popravek, preverjen samo s systemctl start, ni preizkusil zagonskega vrstnega reda, ki bi ga moral popraviti.