Состояние 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 отправит следующего человека искать не в том месте.