Nëse një skript grep arrin anën tjetër të tunelit varet nga tre kushte: me cilën ngjarje është i lidhur, nëse OpenVPN është ende brenda sekuencës së nisjes kur ekzekutohet skripti, dhe nëse puna është shkëputur nga ajo sekuencë. Shumica e skripteve dështojnë në të tretën. Shtimi i një gjumi e trajton një problem të ciklit të jetës si problem kohe, dhe funksionon pikërisht aq shpesh sa të mashtrojë.

Vendosni së pari ngjarjen, pastaj mekanizmin e shtyrjes së punës, pastaj vendin ku ekzekutohet puna e shtyrë. Këto tre vendime janë të pavarura, dhe përzierja e tyre është mënyra se si një grep prej dy rreshtash bëhet një pasdite e tërë.

Pse grepi pret një tunel që pret atë

OpenVPN i thërret grepat e vet në mënyrë sinkrone, brenda të njëjtit proces që lëviz paketat. up aktivizohet kur pajisja tun ose tap ekziston, por para se të shtohet ndonjë rrugë, dhe route-up aktivizohet pas rrugëve; asnjëri prej këtyre momenteve nuk premton se pala tjetër do të përgjigjet. Për sa kohë një skript i ndonjërit grep ekzekutohet ende, daemoni nuk përcjell, prandaj një komandë që pret që trafiku të kalojë nëpër tunel pret një tunel që pret komandën. Ky pritje rrethore është arsyeja pse një ekzekutim manual kalon dhe grepi skadon.

Armëtimi i dukshëm, gjumi për disa sekonda, ndonjëherë funksionon sepse skaji i largët u ngrit vetë, jo sepse gjumi rregulloi diçka. Një ndihmës që pyet për gatishmërinë është një përgjigje tjetër: grepi kthehet, përcjellja fillon, dhe ndihmësi merr atë që i nevojitet kur ajo është vërtet aty.

Zgjidhni grepin sipas ngjarjes, jo sipas komoditetit

Lidhni up me punën që ka nevojë vetëm për pajisjen, route-up me punën që ka nevojë për rrugë, dhe mbani client-connect dhe client-disconnect për detyrat për çdo klient në anën e serverit. Pastrimi në shkëputje duhet të durojë ekzekutimin dy herë, sepse rilidhjet përmes një ndërfaqeje të përhershme nuk ndjekin të njëjtën sekuencë si një rinisje e plotë. Në server, client-connect aktivizohet kur klienti vërteton veten, jo kur nis daemoni, gjë që ia vlen të konfirmohet para se logjika të zhvendoset atje. Nëse puna i përket ciklit të jetës së shërbimit dhe jo një lidhjeje të vetme, një njësi systemd është shtëpi më e mirë se çdo grep.

Komandat e grepit ekzekutohen drejtpërdrejt nga daemoni, pa shell në mes, prandaj ifconfig_remote në një rresht up vjen si tekst fjalë për fjalë. Mbështillni komandën në një shell të qartë, ose mbani logjikën në një skript që lexon mjedisin. ipchange është një direktivë që shton argumentet e veta: i dorëzon komandës adresën dhe portën, prandaj një skript i shkruar për asnjë sheh dy të papritura.

Tre mënyra për të shkëputur punën

Opsioni i parë është ta dërgoni ndihmësin në sfond nga brenda grepit: nisni atë me setsid ose systemd-run --scope, mbyllni përshkruesit e trashëguar, dhe dilni menjëherë me zero. I dyti është të lini grepin të shkruajë një skedar të vogël gjendjeje dhe një kohëmatës systemd ose një njësi shtegu të veprojë mbi të, gjë që e mban grepin të parëndësishëm dhe e vendos politikën e ripërpjekjes atje ku ka regjistra. I treti është ta braktisni plotësisht grepin dhe ta zhvendosni punën në një njësi të renditur pas shërbimit VPN, që është përgjigja e saktë kur puna nuk është fare për lidhje. Të tre ndajnë një rregull: grepi duhet të kthehet para se t'i duhet tuneli.

Çfarëdo që të zgjidhni, bëjeni ndihmësin idempotent dhe të vëzhgueshëm. Dy thirrje që mbivendosen nuk duhet ta ekzekutojnë të njëjtin veprim të pakthyeshëm dy herë, dhe një ndihmës që dështon duhet të lërë diçka që një njeri mund ta lexojë.

Ndani dështimet e sandbox-it nga dështimet e ciklit të jetës

Kur një skript ekzekutohet nga një prompt root dhe dështon si shërbim, shkaku zakonisht është një sandbox dhe jo rrjeti. Një ProtectHome kufizues, një ProtectSystem vetëm-lexim, ose një drejtori pune që nuk ekziston mund ta bëjnë skriptin ose të dhënat e tij të paarritshme, dhe në një host SELinux skedari ka nevojë edhe për një kontekst që lejon ekzekutimin. Lexoni njësinë me systemctl cat openvpn-server@server dhe regjistrin me journalctl -u openvpn-server@server -n 80, pastaj kërkoni një gabim leje ose konteksti në vend të një skadimi lidhjeje. Çaktivizimi i sandbox-it duhet të jetë lëvizja e fundit, jo e para.

Një dështim i ciklit të jetës duket ndryshe: grepi nis, ndihmësi ekzekutohet, dhe soketi thjesht nuk është aty ende. Shkruani një rresht me vulë kohe nga vetë grepi, shkëputuni dhe rilidhuni, dhe lexoni ngjarjet sipas radhës. Kur ndihmësi ka vërtet nevojë për tunelin, lëreni të pyesë për gatishmërinë në vend që të flejë një periudhë fikse.

Tre fusha e bëjnë raportin tjetër të dobishëm: cili grep ekzekutohej, cilin llogari përdori, dhe ku u ndal. Pa ato, çdo hetim i mëvonshëm fillon nga e para.

Artikuj të ngjashëm