Zgjedhje e rastësishme e OpenVPN në systemd: pse dështon ExecStart
systemd nuk është shell, prandaj një kopje e përzier brenda ExecStart vdes. Zhvendosni zgjedhjen në ExecStartPre, ose lëreni OpenVPN të zgjedhë vetë një server.
Dyzet skedarë .ovpn për një vend vijnë nga një ofrues, dhe plani duket i qartë: kopjo një të rastësishëm në vendin e tij, pastaj nis tunelin. I shkruar si pipeline brenda ExecStart, ai plan vdes në nisje me një kod statusi që nuk shpjegon asgjë. Skedari i njësisë nuk është skript, dhe rregullimi është ose të sjellësh një shell në mënyrë të qartë ose të heqësh dorë plotësisht nga zgjedhja e skedarëve.
Simptoma: një njësi që niset dhe vdes menjëherë
Statusi tregon që shërbimi dështoi në një pjesë të sekondës, dhe rreshti i ditarit emërton një komandë që asnjë shell nuk do të kishte marrë kurrë. Asgjë për tunelin nuk shfaqet, sepse tuneli nuk filloi kurrë.
Leximi i rreshtit të saktë të komandës nga ditari është mënyra më e shpejtë për ta konfirmuar këtë. systemd përsërit atë që ekzekutoi, dhe vargu do të tregojë karakteret e pipeline-it si argumente fjalëpërfjalë dhe jo si operatorë.
Pse ExecStart nuk mund të ekzekutojë një pipeline
systemd ndan vetë rreshtin e komandës, zbaton thonjëzimet dhe zëvendësimin e vetë variablave, dhe pastaj ekzekuton rezultatin drejtpërdrejt. Pipeline-t, ridrejtimi, zgjerimi i modeleve nga një shell dhe zëvendësimi i komandave thjesht nuk janë pjesë e kësaj gramatike. Kjo është një zgjedhje projekti dhe jo një lëshim: njësia deklaron se çfarë duhet ekzekutuar, dhe logjika e shell-it i përket një skripti që njësia thërret. Të dy rregullimet rrjedhin nga kjo, dhe asnjëra nuk kërkon t'i jepen njësisë më shumë privilegje.
Kjo shpjegon edhe kodin e daljes mashtrues. Argumenti i parë trajtohet si binari, prandaj një rresht i keqformuar dështon përpara se të ekzekutohet ndonjë pjesë e logjikës tuaj.
Bëjeni zgjedhjen në ExecStartPre
Rregullimi i drejtpërdrejtë është një hap përgatitor që thërret një shell në mënyrë të qartë, duke mbajtur zgjedhjen dhe nisjen në të njëjtën njësi, kështu që një dështim në njërën nuk mund ta lërë tjetrën të punojë e vetme.
[Service]
Type=notify
ExecStartPre=/bin/bash -c "ls /etc/openvpn/profiles/au* | shuf -n 1 | xargs -r -I{} cp -f {} /etc/openvpn/%i.conf"
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/%i.conf
Tre detaje vendosin nëse kjo i mbijeton kontaktit me një makinë të vërtetë. Emërtimi është kurthi i parë: systemd zëvendëson %i gjatë analizimit të njësisë, shumë përpara se bash të ekzekutohet, prandaj specifikuesi duhet të qëndrojë jashtë thonjëzave të vetme. xargs -r parandalon që cp të ekzekutohet pa argument kur modeli nuk përputhet me asgjë. Dhe një hap përgatitor që dështon e ndalon njësinë, dhe ky është rezultati i saktë: nisja me konfigurimin e djeshëm është më keq sesa mosnisja. Një zgjedhje e rastësishme që merr gjithmonë të njëjtin skedar zakonisht nuk është fat i keq. Kontrolloni nëse skedari i kopjuar po mbishkruhet nga një përditësim pakete, ose nëse modeli përputhet vetëm me një zë të vjetruar.
Ose lëreni OpenVPN të zgjedhë pikën fundore
OpenVPN tashmë mund të mbajë disa pika fundore në një profil dhe të zgjedhë mes tyre rastësisht, gjë që heq plotësisht shell-in, kopjimin dhe të drejtën e shkrimit nga rruga e nisjes.
client
remote-random
<connection>
remote au1.example.net 1194 udp
</connection>
<connection>
remote au2.example.net 1194 udp
</connection>
Kjo formë e mban zgjedhjen e serverit brenda skedarit që shkroi ofruesi, kështu që një rotacion që riemërton skedarët nuk e prish njësinë. Ajo e bën gjithashtu listën e kandidatëve të auditueshme, gjë që një model mbi një drejtori nuk është kurrë. Përzierja ende e meriton vendin e saj kur profilet ndryshojnë në më shumë se një pikë fundore: certifikata të ndryshme, direktiva të ndryshme rrugëtimi, politikë e ndryshme kriptimi. Në atë rast zgjedhja është mes konfigurimesh të plota dhe një hap me shell është mënyra e ndershme për ta shprehur.
Lexoni përsëri instancën dhe skedarin që përdori
Konfirmoni cila njësi po punon vërtet përpara se të korrigjoni përmbajtjen e saj. Shërbimi meta i paketuar dhe shablloni janë infrastrukturë; njësitë që korrespondojnë me skedarët tuaj janë instancat e emërtuara sipas tyre.
systemctl list-units 'openvpn*'
systemctl cat [email protected]
journalctl -u openvpn@au -n 30 --no-pager
Një instancë që askush nuk mbahet mend ta ketë aktivizuar zakonisht të çon te një skedar konfigurimi i humbur në drejtorinë e paketës. Fikni atë instancë të emërtuar në vend të shabllonit, përndryshe përditësimi tjetër i paketës do ta kthejë. Pas ndryshimit, nisni njësinë dhe lexoni rreshtin e komandës që raporton ditari, pastaj konfirmoni rrugën e konfigurimit që hapi vërtet. Ai një kontroll i ndan një zgjedhje të rastësishme që funksionon nga një shërbim që ripërdor në heshtje një skedar të muajit të kaluar.