Vai OpenVPN āķa skripts var izmantot tuneli, ko tas tikko izveidoja?
OpenVPN izpilda āķus savas palaišanas laikā, tāpēc skripts, kuram vajag tuneli, gaida tuneli, kas gaida to. Atdaliet darbu un izvēlieties āķi pēc notikuma.
Vai āķa skripts sasniegs tuneli otrā pusē, ir atkarīgs no trim nosacījumiem: kuram notikumam tas ir piesaistīts, vai OpenVPN vēl ir savā palaišanas secībā, kad skripts darbojas, un vai darbs ir atdalīts no šīs secības. Lielākā daļa skriptu cieš neveiksmi trešajā. Miega pievienošana uzskata dzīves cikla problēmu par laika problēmu, un tā darbojas tieši tik bieži, lai maldinātu.
Vispirms izlemiet notikumu, pēc tam darba atlikšanas mehānismu, pēc tam vietu, kur darbojas atliktais darbs. Šie trīs lēmumi ir neatkarīgi, un to sajaukšana ir tas, kā divu rindu āķis kļūst par veselu pēcpusdienu.
Kāpēc āķis gaida tuneli, kas gaida to
OpenVPN izsauc savus āķus sinhroni, tajā pašā procesā, kas pārvieto paketes. up iedarbojas, kad tun vai tap ierīce jau pastāv, bet pirms jebkura maršruta pievienošanas, un route-up iedarbojas pēc maršrutiem; neviens no šiem brīžiem nesola, ka pretējā puse atbildēs. Kamēr vēl darbojas jebkura āķa skripts, dēmons nepārsūta, tāpēc komanda, kas sagaida, ka trafiks šķērsos tuneli, gaida tuneli, kas gaida komandu. Šī riņķveida gaidīšana ir iemesls, kāpēc manuāla palaišana izdodas, bet āķis nokļūst taimautā.
Acīmredzamais labojums, dažu sekunžu miegs, dažreiz darbojas tāpēc, ka tālā puse pati pacēlās, nevis tāpēc, ka miegs kaut ko salaboja. Palīgs, kas jautā par gatavību, ir cita atbilde: āķis atgriežas, pārsūtīšana sākas, un palīgs iegūst vajadzīgo, kad tas patiešām ir.
Izvēlieties āķi pēc notikuma, nevis pēc ērtības
Piesaistiet up darbam, kam vajag tikai ierīci, route-up darbam, kam vajag maršrutus, un atstājiet client-connect un client-disconnect uzdevumiem katram klientam servera pusē. Tīrīšanai atvienošanās laikā jāiztur divkārša izpilde, jo atkārtota pievienošanās caur pastāvīgu saskarni neievēro to pašu secību kā pilnīga restartēšana. Serverī client-connect iedarbojas, kad klients autentificējas, nevis kad dēmons startē, ko ir vērts apstiprināt pirms loģikas pārvietošanas turp. Ja darbs pieder pakalpojuma dzīves ciklam, nevis vienam savienojumam, systemd vienība ir labākas mājas nekā jebkurš āķis.
Āķa komandas dēmons izpilda tieši, bez čaulas starpā, tāpēc ifconfig_remote rindā up pienāk kā burtisks teksts. Ietiniet komandu skaidrā čaulā vai turiet loģiku skriptā, kas lasa vidi. ipchange ir viena direktīva, kas pievieno savus argumentus: tā nodod komandai adresi un portu, tāpēc skripts, kas rakstīts nevienam, redz divus negaidītus.
Trīs veidi, kā atdalīt darbu
Pirmais variants ir nosūtīt palīgu fonā no āķa iekšpuses: palaidiet to ar setsid vai systemd-run --scope, aizveriet mantotos deskriptorus un nekavējoties izejiet ar nulli. Otrais ir ļaut āķim ierakstīt nelielu stāvokļa failu un ļaut systemd taimerim vai ceļa vienībai uz to reaģēt, kas āķi notur triviālu un liek atkārtošanas politiku tur, kur ir žurnāli. Trešais ir pilnībā atteikties no āķa un pārvietot darbu uz vienību, kas sakārtota pēc VPN pakalpojuma, kas ir pareizā atbilde, ja darbs nemaz nav uz savienojumu. Visi trīs dala vienu noteikumu: āķim jāatgriežas, pirms tam vajag tuneli.
Lai ko arī izvēlētos, padariet palīgu idempotentu un novērojamu. Diviem pārklājošiem izsaukumiem nevajadzētu divreiz izpildīt vienu un to pašu neatgriezenisko darbību, un palīgam, kas cieš neveiksmi, jāatstāj kaut kas, ko cilvēks var izlasīt.
Atdaliet smilškastes atteices no dzīves cikla atteicēm
Kad skripts darbojas no root uzvednes un cieš neveiksmi kā pakalpojums, iemesls parasti ir smilškaste, nevis tīkls. Ierobežojoša ProtectHome, tikai lasāma ProtectSystem vai darba direktorija, kas neeksistē var padarīt skriptu vai tā datus nesasniedzamus, un SELinux saimniekā failam vajag arī kontekstu, kas atļauj izpildi. Lasiet vienību ar systemctl cat openvpn-server@server un žurnālu ar journalctl -u openvpn-server@server -n 80, pēc tam meklējiet atļaujas vai konteksta kļūdu, nevis savienojuma taimautu. Smilškastes izslēgšanai jābūt pēdējam solim, nevis pirmajam.
Dzīves cikla atteice izskatās citādi: āķis sākas, palīgs darbojas, un ligzda vienkārši vēl nav. Ierakstiet rindu ar laika zīmogu no paša āķa, atvienojieties un pievienojieties vēlreiz, un lasiet notikumus secībā. Kad palīgam patiešām vajag tuneli, ļaujiet tam jautāt par gatavību, nevis gulēt noteiktu laiku.
Trīs lauki padara nākamo ziņojumu noderīgu: kurš āķis darbojās, kuru kontu izmantoja un kur apstājās. Bez tiem katra vēlākā izmeklēšana sākas no jauna.