Перазапуск службы на OpenVPN up: хукі лепш за tun0.device
Прылада-юніт адсочвае інтэрфейс, а не злучэнне. Выберыце up або route-up для ўмовы, патрэбнай службе, затым адпраўце неблакуючы перазапуск.
Падключэнне залежнай службы да tun0.device выглядае як падпіска на тунэль, але гэта не так. Прылада-юніт адлюстроўвае існаванне інтэрфейса, і гэта можа заставацца праўдай праз няўдалае злучэнне і наступнае перападключэнне. Тады служба дзейнічае ў няправільны момант або не дзейнічае зусім, у залежнасці ад таго, ці знік інтэрфейс паміж гэтым. Хук, які апісвае падзею, што вас сапраўды цікавіць, — гэта той, які выклікае OpenVPN, а не той, які выводзіць systemd.
Вызначце, якая ўмова патрэбна службе, перш чым выбіраць трыгер, бо тры кандыдаты не ўзаемазаменныя.
Што насамрэч адсочвае прылада-юніт
systemd стварае прылада-юніт з пункту гледжання ядра на сеткавы інтэрфейс, таму tun0.device робіцца актыўным, калі інтэрфейс з'яўляецца, і неактыўным, калі яго выдаляюць. З persist-tun мяккі перазапуск захоўвае інтэрфейс на месцы, таму юніт ніколі не флапае і нічога, прывязанае да яго, не запускаецца. Нават без захавання юніт нічога не кажа пра маршруты, DNS або пра тое, ці адказвае далёкі бок.
Гэта робіць яго дрэнным пасярэднікам для 'VPN гатовы'. Слухач, якому патрэбен толькі лакальны адрас, можа задаволіцца існаваннем інтэрфейса, а службе, якая выклікае праграму ў далёкай сетцы, патрэбны маршруты і дасяжнасць, чаго прылада-юніт не можа выразіць.
up, route-up і up-restart азначаюць рознае
up выконваецца пасля адкрыцця прылады TUN/TAP і наладжвання інтэрфейса, што з'яўляецца правільным момантам для слухача, які прывязвае прызначаны адрас. route-up выконваецца пасля ўсталявання маршрутаў, з улікам любой наладжанай затрымкі маршруту, і падыходзіць для працы, якой патрэбна завершаная стадыя маршрутаў. Ні адзін не даказвае, што далёкая праграма адказвае. Выбар паміж імі — пытанне пра тое, што патрэбна службе, а не пра тое, які хук гучыць больш завершаным.
З persist-tun перазапускі паўторна выкарыстоўваюць прыладу, таму up не выконваецца зноў, калі не ўсталяваны up-restart. Гэтая опцыя ўключае скрыпт up для дакументаванага жыццёвага цыклу перазапуску, а яго асяроддзе паменшана ў параўнанні з першым запускам. Скрыпт, які мяркуе поўнае асяроддзе, працуе пры першым злучэнні і збойвае пры наступным.
Адпраўце дзеянне, не чакаючы яго
Хук, які выклікае systemctl restart сінхронна, можа заблакавацца аб юніт, чый парадак чакае тунэль. systemctl --no-block try-restart vpn-dependent.service ставіць заданне ў чаргу і вяртаецца, што не дазваляе хуку блакаваць злучэнне, на якое ён рэагаваў. try-restart дзейнічае толькі на запушчаны юніт, а restart таксама запускае неактыўны; выбірайце ўсвядомлена, а не па звычцы.
Пастаноўка ў чаргу — не праверка. Хук вяртае поспех, як толькі заданне прынята, таму праверка павінна адбывацца ў журнале мэтавага юніта або ў яго фактычным стане слухача.
Палітыка перазапуску жыве ў юніце, а не ў хуку
Юніт oneshot з RemainAfterExit=yes застаецца актыўным пасля выхаду каманды, і другі запыт запуску нічога не робіць, бо systemd лічыць яго ўжо запушчаным. Гэта ўласцівасць, вакол якой трэба праектаваць, а не дэфект, які трэба абыходзіць паўторнымі выклікамі запуску. Калі дзеянне павінна выконвацца на кожнае злучэнне, юніту патрэбна форма, якая гэта дазваляе.
After= упарадкоўвае юніты, а BindsTo= звязвае тэрміны жыцця, але нішто з гэтага не азначае 'перазапусці гэта, калі VPN перападключыцца'. Юніт, прывязаны да тунэлю, спыняецца, калі тунэль спыняецца; ён не перазапускае сябе, калі тунэль вяртаецца, калі толькі нешта не запусціць яго зноў.
Праверце тры перападключэнні, а не адно
Халодная загрузка, поўны перазапуск кліента і мяккае перападключэнне кожнае практыкуюць розны шлях. Мяккае перападключэнне — гэта тое, што выяўляе адсутны up-restart, паменшанае асяроддзе або прылада-юніт, які ніколі не станавіўся неактыўным. Запусціце ўсе тры і пацвердзіце ў абодвух кірунках: служба дзейнічае, калі тунэль паднімаецца, і не перазапускаецца пры незвязаных зменах спасылкі, такіх як роўмінг Wi-Fi.
Захоўвайце незалежны шлях аднаўлення, калі залежная служба нясе ваш уласны адміністрацыйны доступ. Хук, які перазапускае тое, праз што вы падключаны, — гэта змена, якая можа замкнуць вас звонку.