VPN статус в macOS от терминала: scutil, маршрути или ping
Състоянието на услугата, маршрутът в ядрото и една реална заявка отговарят на три различни въпроса. Пишете скрипта си спрямо идентификатора на услугата и проверявайте и маршрута.
Някъде в скрипт за внедряване има проверка дали тунелът е активен, преди да започне копиране. Налични са три отговора и те не означават едно и също: състоянието на услугата, което съобщава scutil, маршрутът, който ядрото е избрало, и дали отсрещната страна наистина отговаря. Сравняването им е разликата между проверка, която предсказва копирането, и такава, която само украсява журнала.
Три отговора на въпроса дали VPN работи
Състоянието на услугата е факт от управляващата равнина. macOS знае, че дадена конфигурация е свързана, защото неговият клиентски процес го е казал. Маршрутът е факт от равнината на данните: ядрото ще изпрати тази дестинация през онзи интерфейс. Достижимостта е факт от край до край и може да се провали по причини, които нито едно от другите две не вижда.
| Signal | Answers | Blind spot |
|---|---|---|
scutil --nc status | Is the service connected? | Third-party clients, wrong routes |
route -n get | Where would this go? | The peer may be down |
| A request to the far side | Does it work now? | Slow, and it changes state |
Полезната проверка съчетава първите две и използва третата като потвърждение, че другите две не са лъгали. Всяко едно само по себе си е догадка с времеви печат.
Четете идентификатора, а не показваното име
scutil --nc list
scutil --nc status "Office"
Списъкът отпечатва по един ред за услуга и всеки ред носи състояние в скоби, последвано от идентификатора на услугата, типа и показваното име. Пишете скрипта спрямо идентификатора, защото показваното име е онова, което някой е въвел в Системни настройки, и може да се промени без предупреждение. Командата за състояние отпечатва една дума, последвана от статистики за някои типове услуги; съпоставяйте тази първа дума, вместо да търсите името в целия изход, което се появява и другаде.
Стартирането на услуга може да предизвика подкана за оторизация или да бъде напълно отказано, когато профилът се управлява. Този отказ не е дефект в тунела; той е изявление за политика кой може да го вдигне.
Клиент от трета страна се крие от списъка
Празният списък не означава, че няма VPN. Тук се появяват конфигурациите, създадени в собствените мрежови настройки на системата; клиент на доставчик, профил за управление или приложение от трета страна може да поддържа активен тунел, който тази команда никога не вижда. Собственият му инструмент е авторитетът за собствената му услуга. Запитването до scutil за клиент, който никога не се е регистрирал при него, не връща нищо, а нищото не е същият отговор като „изключено“.
Когато списъкът е празен, но трафикът очевидно е криптиран, търсете вместо това интерфейса: устройство utun или ppp с адрес в очаквания диапазон е доказателство, че нещо е установило тунел. Това е по-слаб сигнал от състоянието на услуга, затова го съчетавайте с проверка на маршрута, вместо да приемате интерфейса за доказателство за идентичност. Няколко клиента могат да създадат няколко такива интерфейса и само един от тях принадлежи на тунела, който имате предвид.
Състоянието не е маршрутизиране
Свързана услуга казва, че тунелът съществува. Тя не казва, че вашата дестинация го използва. Прочетете адресите, после попитайте ядрото директно:
ifconfig | grep -A4 utun
netstat -rn -f inet
route -n get 10.40.0.20
Клиент на пълен тунел инсталира маршрут по подразбиране през тунела; клиент на разделен тунел инсталира конкретни частни префикси. И двата съобщават Connected и скрипт, който проверява само състоянието, ще мине доволно по грешния път. Спирането на тунел не премахва непременно маршрути, инсталирани от друг клиент, и това е един от начините машината да остане едновременно със свързана услуга и остарял маршрут. Гледайте дестинацията, която ви интересува, а не цялата таблица с маршрути.
Имената са отделен проблем
Други машини не могат да достигнат Mac по име, докато адресът му работи, и това се докладва като повреда на VPN. Локалното име на хоста, името на хоста и DNS записът са три различни неща. scutil --get LocalHostName показва името за Bonjour; sudo scutil --set HostName mac-office задава името, което системата съобщава.
Нито една от настройките не създава запис в офис зоната. Ако други хостове трябва да разрешават името чрез DNS, собственикът на зоната трябва да го добави, или скриптът да използва адреса. Задаването на стабилно име прави обявленията последователни; то не кара резолвера да отговаря.
Запишете идентификатора на услугата и очакваната форма на маршрута заедно в скрипта и проверете и двете преди копирането. Тунел, който е активен и маршрутизиран по грешния начин, се проваля точно както липсата на тунел, а редът в журнала с Connected ще изпрати следващия човек да търси на грешното място.