Kas konksuskript jõuab tunneli teisele poole, sõltub kolmest tingimusest: millise sündmusega see on seotud, kas OpenVPN on skripti käivitamise ajal veel oma käivitusjärjestuses ja kas töö on sellest järjestusest eraldatud. Enamik skripte ebaõnnestub kolmandal. Une lisamine kohtleb elutsükli probleemi ajastusprobleemina ja töötab täpselt nii sageli, et eksitada.

Otsustage esmalt sündmus, seejärel töö edasilükkamise mehhanism, seejärel koht, kus edasilükatud töö jookseb. Need kolm otsust on sõltumatud ja nende segamine ongi see, kuidas kahereal kooks saab terveks pärastlõunaks.

Miks konks ootab tunnelit, mis ootab teda

OpenVPN kutsub oma konksud välja sünkroonselt, samas protsessis, mis pakette liigutab. up vallandub, kui tun- või tap-seade on olemas, aga enne mis tahes marsruudi lisamist, ja route-up pärast marsruute; kumbki hetk ei tõota, et vastaspool vastab. Kuni ükskõik millise konksu skript veel jookseb, ei edasta deemon, nii et käsk, mis loodab, et liiklus läbib tunneli, ootab tunnelit, mis ootab käsku. See ringootamine on põhjus, miks käsitsi käivitamine õnnestub ja konks aegub.

Ilmselge lapp, mõne sekundi magamine, mõnikord toimib, sest kaugem ots tuli ise üles, mitte sellepärast, et uni midagi parandas. Valmisolekut küsiv abiline on teine vastus: konks naaseb, edastamine algab ja abiline saab vajaliku siis, kui see tõesti olemas on.

Valige konks sündmuse, mitte mugavuse järgi

Seo up tööga, mis vajab ainult seadet, route-up tööga, mis vajab marsruute, ja jäta client-connect ning client-disconnect serveripoolsete kliendipõhiste ülesannete jaoks. Ühenduse katkestamisel peab puhastus taluma kahekordset käivitamist, sest püsiliidese kaudu taasühendumine ei järgi täieliku taaskäivituse järjestust. Serveris vallandub client-connect siis, kui klient autendib, mitte siis, kui deemon käivitub, mida tasub enne loogika sinna viimist kinnitada. Kui töö kuulub teenuse elutsükli, mitte ühe ühenduse juurde, on systemd-üksus parem kodu kui ükskõik milline konks.

Konksukäske käivitab otse deemon, ilma vahepealse kestata, nii et up real olev ifconfig_remote saabub sõnasõnalise tekstina. Mähkige käsk selgesõnalisse kesta või hoidke loogika skriptis, mis loeb keskkonda. ipchange on üks direktiiv, mis lisab omad argumendid: see annab käsule aadressi ja pordi, nii et mitte ühegi jaoks kirjutatud skript näeb kahte ootamatut.

Kolm viisi töö eraldamiseks

Esimene võimalus on saata abiline konksu seest taustale: käivitage see setsid või systemd-run --scope abil, sulgege pärandatud kirjeldajad ja väljuge kohe nulliga. Teine on lasta konksul kirjutada väike olekufail ning lasta systemd-taimeril või teeüksusel selle põhjal tegutseda, mis hoiab konksu triviaalsena ja paneb korduskatse poliitika sinna, kus on logid. Kolmas on konks täielikult maha jätta ja viia töö üksusesse, mis on järjestatud pärast VPN-teenust, mis on õige vastus, kui töö pole üldse ühendusepõhine. Kõik kolm jagavad üht reeglit: konks peab naasma enne, kui tal tunnelit vaja läheb.

Ükskõik mida valite, tehke abiline idempotentseks ja jälgitavaks. Kaks kattuvat kutset ei tohi sama pöördumatut toimingut kaks korda teha, ja ebaõnnestuv abiline peab jätma midagi, mida inimene saab lugeda.

Eraldage liivakasti tõrked elutsükli tõrgetest

Kui skript jookseb root-käsurealt ja ebaõnnestub teenusena, on põhjus tavaliselt liivakast, mitte võrk. Piirav ProtectHome, kirjutuskaitstud ProtectSystem või töökataloog, mida pole olemas võivad jätta skripti või selle andmed kättesaamatuks ja SELinuxi hostis vajab fail ka konteksti, mis lubab käivitamist. Lugege üksust käsuga systemctl cat openvpn-server@server ja logi käsuga journalctl -u openvpn-server@server -n 80, seejärel otsige loa- või kontekstitõrget, mitte ühenduse aegumist. Liivakasti keelamine peaks olema viimane käik, mitte esimene.

Elutsükli tõrge näeb teistsugune välja: konks käivitub, abiline jookseb ja pesa lihtsalt veel pole. Kirjutage ajatempliga rida konksu enda seest, katkestage ja ühenduge uuesti ning lugege sündmusi järjekorras. Kui abilisel on tunnelit tõesti vaja, laske tal valmisolekut küsida, mitte kindla aja magada.

Kolm välja teevad järgmise aruande kasulikuks: milline konks jooksis, millist kontot kasutas ja kuhu see jäi. Ilma nendeta algab iga hilisem uurimine otsast peale.

Seotud artiklid