Где-то в скрипте развёртывания есть проверка, поднят ли туннель, прежде чем начнётся копирование. Доступны три ответа, и они означают не одно и то же: состояние службы, которое сообщает scutil, маршрут, выбранный ядром, и то, отвечает ли дальняя сторона на самом деле. Их сравнение — это разница между проверкой, которая предсказывает копирование, и проверкой, которая лишь украшает журнал.

Три ответа на вопрос, поднят ли VPN

Состояние службы — факт плоскости управления. macOS знает, что конфигурация подключена, потому что так сообщил её клиентский процесс. Маршрут — факт плоскости данных: ядро отправит этот адрес назначения через тот интерфейс. Доступность — сквозной факт, и она может не сработать по причинам, которых не видит ни одна из двух других проверок.

SignalAnswersBlind spot
scutil --nc statusIs the service connected?Third-party clients, wrong routes
route -n getWhere would this go?The peer may be down
A request to the far sideDoes 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 отправит следующего человека искать не в том месте.

Похожие статьи