Oft in hookskript de oare kant fan ’e tunnel berikke kin, hinget ôf fan trije betingsten: oan hokker barren it ferbûn is, oft OpenVPN noch binnen syn opstartsekwinsje is as it skript rint, en oft it wurk fan dy sekwinsje losmakke is. De measte skripts mislearje op ’e tredde. In sliep tafoegje behannelet in libsenssyklusprobleem as in timingprobleem, en it wurket krekt faak genôch om te mislieden.

Kies earst it barren, dan it meganisme om wurk út te stellen, dan it plak dêr’t it útstelde wurk rint. Dy trije besluten binne ûnôfhinklik, en se trochinoar helje is hoe’t in hook fan twa rigels in middei wurdt.

Wêrom de hook wachtet op in tunnel dy’t op him wachtet

OpenVPN ropt syn hooks synchroan oan, binnen itselde proses dat pakketten ferpleatst. up giet ôf as it tun- of tap-apparaat bestiet, mar foardat der in rûte tafoege wurdt, en route-up giet ôf nei de rûtes; gjin fan beide mominten ûnthjit dat in peer antwurdzje sil. Wylst in skript fan ien fan ’e hooks noch rint, stjoert de daemon net troch, dus in opdracht dy’t ferwachtet dat ferkear troch de tunnel giet, wachtet op in tunnel dy’t op ’e opdracht wachtet. Dy sirkelwacht is wêrom in hânmjittige útfiering slagget en de hook yn in time-out rint.

It foar de hân lizzende lapmiddel, in pear sekonden sliepe, wurket soms om’t de fiere ein himsels omheech kaam, net om’t de sliep eat reparearre. In helper dy’t nei gereedheid freget, is in oar antwurd: de hook komt werom, it trochstjoeren begjint, en de helper krijt wat er nedich hat as it der echt is.

Kies de hook op barren, net op gemak

Ferbyn up oan wurk dat allinnich it apparaat nedich hat, route-up oan wurk dat rûtes nedich hat, en hâld client-connect en client-disconnect foar taken per klant oan ’e serverkant. Opromme by it ferbrekken moat it úthâlde om twa kear te rinnen, om’t werferbiningen oer in permaninte interface net deselde sekwinsje folgje as in folsleine werstart. Op ’e server giet client-connect ôf as in klant him autentisearret, net as de daemon start, wat it wurdich is te befêstigjen foardat logika dêrhinne ferhuze wurdt. As it wurk ta de libsenssyklus fan ’e tsjinst heart en net ta ien ferbining, is in systemd-ienheid in better hûs as hokker hook ek.

Hookopdrachten wurde direkt troch de daemon útfierd, sûnder shell der tusken, dus ifconfig_remote yn in up-rigel komt as letterlike tekst oan. Wikkelje de opdracht yn in eksplisite shell, of hâld de logika yn in skript dat it omjouwing lêst. ipchange is ien rjochtline dy’t syn eigen arguminten tafoeget: it jout it adres en de poarte oan ’e opdracht, dus in skript skreaun foar gjinien sjocht twa ûnferwachte.

Trije manieren om it wurk los te meitsjen

De earste opsje is de helper fan binnen de hook yn ’e eftergrûn te setten: start it mei setsid of systemd-run --scope, slút de erfde deskriptors, en ferlit daliks mei nul. De twadde is de hook in lyts steatsbestân skriuwe te litten en in systemd-timer of in paad-ienheid derop te litten hanneljen, wat de hook triviaal hâldt en it werprebeksbelied set dêr’t logboeken binne. De tredde is de hook folslein weilitte en it wurk te ferpleatsen nei in ienheid dy’t nei de VPN-tsjinst oardere is, wat it juste antwurd is as it wurk hielendal net per ferbining is. Alle trije diele ien regel: de hook moat weromkomme foardat er de tunnel nedich hat.

Hokker ek kies, meitsje de helper idempotint en waarnimmber. Twa oerlaapjende oanroppen meie deselde ûnomkearbere aksje net twa kear útfiere, en in helper dy’t misrint moat eat efterlitte dat in minske lêze kin.

Skied sandbox-fouten fan libsenssyklusfouten

As in skript fan in root-prompt rint en as tsjinst misrint, is de oarsaak meastal in sandbox ynstee fan it netwurk. In beheinende ProtectHome, in allinnich-lêzen ProtectSystem, of in wurkmappe dy’t net bestiet kinne it skript of syn gegevens ûnberikber litte, en op in SELinux-host hat it bestân ek in kontekst nedich dy’t útfiering tastean. Lês de ienheid mei systemctl cat openvpn-server@server en it sjoernaal mei journalctl -u openvpn-server@server -n 80, sykje dan nei in tastimming- of kontekstflater ynstee fan in ferbiningstime-out. It útskeakeljen fan ’e sandbox moat de lêste set wêze, net de earste.

In libsenssyklusflater sjocht der oars út: de hook start, de helper rint, en de socket is gewoan noch net der. Skriuw in rigel mei tiidstimpel fan ’e hook sels, ferbrek en ferbyn wer, en lês de barrens op folchoarder. As de helper de tunnel echt nedich hat, lit him dan nei gereedheid freegje ynstee fan in fêste perioade te sliepen.

Trije fjilden meitsje it folgjende rapport brûkber: hokker hook rûn, hokker akkount it brûkte en wêr’t it stoppe. Sûnder dy begjint elk letter ûndersyk fan foarren ôf.

Relatearre artikelen