Прапуск хатняга VPN з дапамогай systemd ExecCondition
Наўмысны прапуск і зламаная каманда падрыхтоўкі — розныя вынікі. Вызначце коды выхаду дапаможніка, затым праверце пераход паміж сеткамі.
Хатні VPN не мае чаго рабіць, калі ноўтбук ужо знаходзіцца ў гэтай сетцы. Спакуслівы кароткі шлях — каманда падрыхтоўкі, якая выходзіць з ненулявым кодам; яна пераносіць збой на юніт і робіць кожную панэль кіравання зламанай. У systemd ёсць дырэктыва менавіта для такога рашэння, і яна аддзяляе наўмысны пропуск ад сапраўднай памылкі. Каб зрабіць гэта правільна, трэба галоўным чынам запісаць, што азначае кожны код выхаду.
Чаму збойная перадумова — няправільная форма
ExecStartPre разглядае ненулявы выхад як збой запуску, і гэта слушна для каманды, якая рыхтуе сэрвіс. Калі ж выкарыстоўваць яе як умову, палітычнае рашэнне становіцца неадрозным ад зламанай залежнасці. ExecCondition існуе, каб юніт мог адмовіцца ад запуску, не атрымліваючы адзнаку збою.
Гэтае адрозненне важнае а трэцяй гадзіне ночы, калі ніхто не хоча разбіраць чырвоны юніт, які працаваў так, як задумана. Збойны юніт таксама хавае сапраўдныя збоі сярод наўмысных.
Спачатку напішыце кантракт кодаў выхаду
Напішыце кантракт да скрыпта. Выхад з нулём азначае працяг, выхад з адзінкай — прапуск астатніх камандаў запуску, а выхад з кодам 255 — што ўмова сама не змагла выканацца. Коды ад двух да 254 звычайна таксама азначаюць прапуск, і пра гэта лёгка забыць, калі дапаможнік вяртае выпадковы код памылкі. Drop-in ніжэй далучае дапаможнік да сапраўднага імені юніта.
[Service]
ExecCondition=/usr/local/libexec/should-start-home-vpnПраверце эфектыўны юніт на ўспадкаваныя налады SuccessExitStatus або stop-post, перш чым меркаваць пра семантыку па змаўчанні. Затым наўмысна праверце кожны з трох вынікаў.
Сеткавая падказка не даказвае месцазнаходжанне
Дасяжны адрас маршрутызатара або вядомы MAC можа падказаць патрэбную сетку, і ніводзін з іх гэтага не даказвае. Іншая сетка можа выкарыстоўваць той жа адрас, даныя ARP могуць быць састарэлымі, а ідэнтыфікатары можна падрабіць. Разглядайце зонд як аптымізацыю, узгодненую з палітыкай, а не як вынік аўтэнтыфікацыі.
Заранее вырашыце, што значыць няпэўнасць. Запуск VPN пры няпэўнасці бяспечны для кліента, які проста не змог бы падключыцца; пропуск пры няпэўнасці — не. Зрабіце зонд абмежаваным і чытайце актыўны інтэрфейс, а не мяркуйце пра першы ў спісе. Зонд, які завісае, горш за той, што адказвае не, бо юніт яго чакае.
Запішыце гэтыя меркаванні побач з файлам юніта, каб наступны чалавек ведаў, што думае дапаможнік. Каментар у пачатку скрыпта — самае таннае месца, каб іх захаваць.
Апрацоўка пераходу паміж сеткамі
Умова выконваецца пры запуску сэрвіса і пазней не пераацэньваецца. Прапушчаны юніт застаецца прапушчаным пасля пераходу ноўтбука ў кавярню, а працуючы тунэль застаецца ўзнятым пасля вяртання ноўтбука дадому. Звяжыце жыццёвы цыкл змены сеткі з рашэннем пра запуск і прыпынак праз асобны механізм.
systemctl cat home-vpn.serviceПраверце чатыры выпадкі: запуск дома, запуск па-за домам, зонд, які не можа выканацца, і пераход паміж сеткамі, пакуль юніт актыўны. Трымайце прычыну пропуску бачнай у журнале, каб наўмыснае рашэнне ніколі не выглядала як збой аўтэнтыфікацыі. Дакументацыя сэрвісу апісвае семантыку выхаду і мінімальную версію.