Запуск захаванага Mac VPN з тэрмінала праз scutil --nc
Выкарыстоўвайце scutil --nc, каб запускаць, правяраць і спыняць захаваную службу macOS VPN, трымайце ўліковыя даныя па-за argv і дакажыце, што трафік сапраўды ідзе праз тунель.
У вас ёсць захаваная служба VPN у Сістэмных наладах, і вы хочаце, каб тэрмінал яе запусціў. На macOS падтрымліваемы шлях — scutil --nc, але толькі для службаў, якія належаць уласнаму кіраўніку сеткавых злучэнняў сістэмы. Панэль меню — не API: у старонніх кліентаў звычайна ёсць уласная аўтаматызацыя, а профіль, які праштурхнула служба кіравання, можа адмовіцца ад лакальнага запуску. Гэта мой кантрольны спіс: знайдзіце дакладную службу, прачытайце яе стан, запусціце яе, дачакайцеся змены стану, а затым дакажыце, што трафік сапраўды ідзе праз тунель. Спыніцеся на першым кроку, які не сыходзіцца, бо кожная наступная каманда мяркуе, што папярэдняя ўдалася.
Знайдзіце службу, перш чым спрабаваць яе запусціць
Пачніце з інвентара, а не з назвы профілю, якую вы памятаеце:
scutil --nc help
scutil --nc list
Кожны радок спалучае стан з ідэнтыфікатарам службы, тыпам і адлюстраванай назвай. Ідэнтыфікатар — гэта значэнне, супраць якога пішуць скрыпты, бо адлюстраваныя назвы паўтараюцца і могуць быць зменены. Дапаможнік scutil ад Apple дакументуе рэжым сеткавага злучэння, а ўсталяваны --nc help — гэта аўтарытэтны спіс падкаманд на гэтым Mac; не думайце, што сцяг з старога дапаможніка ўсё яшчэ існуе ў вашай версіі macOS.
Пусты спіс — гэта вынік, а не памылка. Служба, створаная кліентам пастаўшчыка або профілем кіравання, можа быць актыўнай, але нябачнай тут, або бачнай з тыпам, якім уласны кантролер не можа кіраваць. У такім разе выкарыстоўвайце інструмент пастаўшчыка або дакументацыю профілю. Стварэнне паралельнага ўласнага профілю толькі дзеля таго, каб было што запусціць, — дрэнны абмен.
Прачытайце бягучы стан і пацвердзіце селектар
Запытайце стан службы перад запускам, каб ведаць, што павінен змяніць паспяховы запуск:
scutil --nc status "Office VPN"
Калі дзве службы маюць аднолькавую адлюстраваную назву, назва неадназначная. Перадайце замест яе ідэнтыфікатар; каманда прымае любое з іх, але толькі ідэнтыфікатар гарантавана выбірае адну службу. Праверце, што слова стану вам знаёмае, звычайна Connected, Disconnected, Connecting або Disconnecting, перш чым разбіраць яго ў скрыпце. Таксама праверце, ці кіруецца профіль, бо заблакаваная канфігурацыя можа прыняць каманду і ўсё роўна праігнараваць яе або запытаць пацверджанне.
Гэты запыт стану танны, таму выкарыстоўвайце яго як ахоўнік у аўтаматызацыі: запускайце толькі калі стан Disconnected і не лічыце Connecting няўдачай. Калі служба ўжо Connected, прапусціце запуск, а не перарывайце працуючы тунель.
Запусціце злучэнне і дачакайцеся стабілізацыі стану
Запыт запуску асінхронны. Каманда вяртаецца, калі запыт прыняты, а не калі аўтэнтыфікацыя скончана або маршруты ўсталяваны. Запусціце яе, затым апытвайце стан з абмежаваным чаканнем і выйдзіце, калі служба вернецца да Disconnected:
scutil --nc start "Office VPN"
n=0
while [ "$n" -lt 30 ]; do
state=$(scutil --nc status "Office VPN" | head -n 1)
[ "$state" = "Connected" ] && break
[ "$state" = "Disconnected" ] && { echo "start failed"; exit 1; }
sleep 2
n=$((n + 1))
done
Стан Connecting, які ніколі не вырашаецца, звычайна ўказвае на ўліковыя даныя, MFA або сервер, а не на scutil. Каманда не можа забяспечыць інтэрактыўны ўваход, таму профіль, які чакае токен або апаратны ключ, будзе стаяць у Connecting і ўрэшце адкоціцца. Прачытайце слова стану, перш чым дадаваць паўторы; цыкл супраць запыту аўтэнтыфікацыі не можа ўдацца.
Не лічыце код выхаду абалонкі гатоўнасцю. Карысны сігнал — гэта радок стану, а за ім доказ, што тунель нясе трафік. Каманда запуску, якая ціха вяртаецца, усё яшчэ можа пакінуць вас са злучэннем, якое ніколі не аўтэнтыфікуецца.
Дакажыце, што тунель нясе трафік, а не проста кажа Connected
Connected апісвае злучэнне, а не рашэнне маршрутызацыі. Уласныя службы PPP і IKEv2 ствараюць інтэрфейс ppp або utun і ўсталёўваюць маршруты, а раздзелены тунель наўмысна пакідае маршрут па змаўчанні некранутым. Агледзьце інтэрфейсы і абедзве сям’і адрасоў:
ifconfig -l
netstat -rn -f inet
netstat -rn -f inet6
scutil --dns
Знайдзіце інтэрфейс, створаны службай, замест здагадкі нумара, затым спытайце табліцу маршрутызацыі, які інтэрфейс выкарыстоўвае пэўнае прызначэнне: route -n get 10.0.0.10, падставіўшы ўнутраны хост. Калі ён паведамляе фізічны інтэрфейс, тунель уключаны, але не нясе гэты паток. Праверце маршруты раздзеленага тунеля, парадак рэзалвера і любое лакальнае правіла фаеруола, якое дазваляе інтэрфейс тунеля, але не працэс.
Развязанне імёнаў — звычайны хлуслівы адмоўны вынік. Унутраныя імёны могуць развязвацца праз няправільны рэзалвер, пакуль тунель цалкам здаровы, што выглядае як збой VPN і не з’яўляецца ім. scutil --dns паказвае парадак, які выкарыстае macOS; пасля змены рэзалвера ачысціце кэш камандамі dscacheutil -flushcache і sudo killall -HUP mDNSResponder.
Трымайце ўліковыя даныя і прывілеі па-за каманднай радком
Ніколі не змяшчайце пароль, папярэдне агучаны ключ або токен у аргументы. Аргументы бачныя ў спісах працэсаў і трапляюць у гісторыю абалонкі, а скапіяваны здымак падтрымкі можа іх выдаць. Уласная апрацоўка ўліковых даных профілю — ці гэта элемент Keychain, сістэмны запыт або паток аўтэнтыфікацыі кліента — месца для сакрэтаў.
Запуск каманды з sudo не робіць інтэрактыўны ўваход без нагляду. Ён змяняе эфектыўнага карыстальніка, а не даступнасць запыту GUI, апаратнага токена або ключніцы ўваходу. LaunchAgent можа запусціць службу пасля таго, як карыстальнік увайшоў і ключніца разблакавана; LaunchDaemon звычайна не дасягае гэтых частак карыстальніцкай сесіі. Калі арганізацыя кіруе службай, яе правілы жыццёвага цыклу перамагаюць любы лакальны скрыпт.
Спыніце службу і праверце, што яна засталася спыненай
Спыніце тым жа селектарам, які выкарыстоўвалі для запуску, затым прачытайце стан назад, а не мяркуйце, што тунель знік:
scutil --nc stop "Office VPN"
scutil --nc status "Office VPN"
Спыненне, якое вяртаецца да Disconnected, усё яшчэ пакідае адну рэч для праверкі: ці наладжаны профіль на злучэнне па патрабаванні, што можа вярнуць яго без вашага скрыпта. Калі іншы кліент валодае маршрутамі на тым жа Mac, гэтыя маршруты могуць перажыць уласнае спыненне. Паўторна праверце маршрут, перш чым заключыць, што машына па-за VPN.
Для абгорткі, якую вы запускаеце ўручную, трымайце парадак нязменным: спіс, стан, запуск, апытанне, тэст маршруту, спыненне, праверка. Не разбірайце зручную назву са свабоднага вываду, калі ідэнтыфікатар даступны, і не лічыце выхад каманды запуску гатоўнасцю. Кіраўнік злучэнняў паведамляе стан; ваш доказ — гэта стан плюс маршрут, які паказвае на тунель.