Apatnapung .ovpn na file para sa isang bansa ay dumarating mula sa isang provider, at ang plano ay mukhang halata: kopyahin ang isang random sa lugar nito, pagkatapos ay simulan ang tunnel. Kapag isinulat bilang pipeline sa loob ng ExecStart, namamatay ang planong iyon sa boot na may status code na walang ipinaliwanag. Ang unit file ay hindi script, at ang pag-aayos ay alinman sa tahasang magdala ng shell o tuluyang ihinto ang pagpili ng mga file.

Ang sintomas: isang unit na nagsisimula at agad na namamatay

Ipinapakita ng status na nabigo ang serbisyo sa isang bahagi ng segundo, at pinangalanan ng linya sa journal ang isang utos na hindi kailanman matatanggap ng anumang shell. Walang lumilitaw tungkol sa tunnel, dahil hindi kailanman nagsimula ang tunnel.

Ang pagbasa ng eksaktong command line mula sa journal ang pinakamabilis na paraan upang kumpirmahin ito. Inuulit ng systemd ang isinagawa nito, at ipapakita ng string ang mga karakter ng pipeline bilang literal na argumento sa halip na bilang mga operator.

Bakit hindi kayang magpatakbo ng pipeline ang ExecStart

Hinahati ng systemd mismo ang command line, inilalapat ang sarili nitong pag-quote at pagpapalit ng variable, at pagkatapos ay direktang isinasagawa ang resulta. Ang mga pipe, redirection, glob expansion ng shell at command substitution ay talagang hindi bahagi ng gramatikang iyon. Ito ay desisyong disenyo at hindi kapabayaan: ang unit ay nagsasaad nang deklaratibo kung ano ang tatakbo, at ang lohika ng shell ay kabilang sa script na tinatawag ng unit. Pareho ang pag-aayos na sumusunod dito, at wala sa kanila ang nangangailangan ng mas maraming pribilehiyo sa unit.

Ipinapaliwanag din nito ang nakalilinlang na exit code. Ang unang argumento ay itinuturing na binary, kaya nabigo ang isang maling linya bago pa tumakbo ang anumang bahagi ng iyong lohika.

Gawin ang pagpili sa ExecStartPre

Ang direktang pag-aayos ay isang hakbang sa paghahanda na tahasang tumatawag ng shell, at pinapanatili ang pagpili at ang pagsisimula sa iisang unit upang ang kabiguan sa isa ay hindi maiiwan ang isa na tumatakbo nang mag-isa.

[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

Tatlong detalye ang nagpapasya kung makakaligtas ito sa pakikipag-ugnayan sa isang tunay na makina. Ang pagpapangalan ang unang bitag: pinapalitan ng systemd ang %i habang pinaparse ang unit, matagal bago tumakbo ang bash, kaya dapat na nasa labas ng iisang quote ang specifier. Pinipigilan ng xargs -r ang cp na tumakbo nang walang argumento kapag walang tugma ang glob. At ang nabigong hakbang sa paghahanda ay humihinto sa unit, at iyon ang tamang kinalabasan: ang magsimula sa configuration ng kahapon ay mas masahol kaysa hindi magsimula. Ang random na pagpili na laging kumukuha ng parehong file ay karaniwang hindi malas. Tingnan kung ang kinopyang file ay nasasapawan ng update ng package, o kung ang glob ay tumutugma lamang sa isang lumang entry.

O hayaang pumili ang OpenVPN ng endpoint

OpenVPN ay maaari nang humawak ng ilang endpoint sa isang profile at pumili ng random sa kanila, na nag-aalis nang tuluyan ng shell, kopya at write access mula sa landas ng boot.

client
remote-random
<connection>
remote au1.example.net 1194 udp
</connection>
<connection>
remote au2.example.net 1194 udp
</connection>

Pinapanatili ng pormang ito ang pagpili ng server sa loob ng file na isinulat ng provider, kaya ang rotasyong nagpapalit ng pangalan ng mga file ay hindi sumisira sa unit. Ginagawa rin nitong naa-audit ang listahan ng kandidato, na hindi kailanman kaya ng glob sa isang direktoryo. Ang paghahalo ay may lugar pa rin kapag ang mga profile ay naiiba sa higit pa sa endpoint: iba't ibang sertipiko, iba't ibang direktiba sa routing, iba't ibang patakaran sa cipher. Sa ganoong kaso ang pagpili ay sa pagitan ng buong configuration, at ang hakbang ng shell ang tapat na paraan upang ipahayag iyon.

Basahin muli ang instance at ang file na ginamit nito

Kumpirmahin kung aling unit ang talagang tumatakbo bago i-debug ang nilalaman nito. Ang naka-package na meta service at template ay imprastruktura; ang mga unit na tumutugma sa iyong mga file ang mga instance na pinangalanan pagkatapos nila.

systemctl list-units 'openvpn*'
systemctl cat [email protected]
journalctl -u openvpn@au -n 30 --no-pager

Ang instance na walang makaaalala na na-enable ay kadalasang nagmumula sa isang ligaw na configuration file sa direktoryo ng package. Patayin ang pinangalanang instance na iyon sa halip na ang template, kung hindi ay ibabalik ito ng susunod na upgrade ng package. Pagkatapos ng pagbabago, simulan ang unit at basahin ang command line na iniuulat ng journal, pagkatapos ay kumpirmahin ang configuration path na aktwal na binuksan nito. Ang nag-iisang pagsusuring iyon ay naghihiwalay sa gumaganang random na pagpili mula sa serbisyong tahimik na muling gumagamit ng file mula noong nakaraang buwan.

Kaugnay na mga artikulo