Состояние VPN на Mac: проверьте профиль, ресурс или поток
Одно логическое значение не может ответить на три разных вопроса. Сначала выберите субъект, затем используйте интерфейс, который действительно его сообщает, и сохраняйте причины сбоя.
Кто-то спрашивает, поднят ли VPN, и три разных человека имеют в виду три разные вещи. Оператор имеет в виду, что профиль Office завершил аутентификацию. Планировщик имеет в виду, что частный API ответит. Проверка безопасности имеет в виду, что именно этот запрос вышел защищённым путём. Скрипт, который ищет через grep в таблице маршрутов имя интерфейса, ни на один из этих вопросов не отвечает надёжно.
Поэтому контрольный список начинается до запуска любой команды: назовите субъект проверки. Всё дальнейшее — это выбор интерфейса, который действительно может его сообщить.
Назовите субъект до команды
Запишите вопрос как предикат с субъектом. «Профиль Office подключён» проверяемо и имеет владельца, который может ответить. «Может ли эта задача добраться до внутреннего API» — это второй предикат с другим режимом отказа. «Использует ли этот запрос защищённый путь» — третий, и только он говорит об одном потоке, а не о всей машине.
Их смешение порождает автоматизацию, которая уверенно лжёт. Задача, которая проверяет состояние профиля и затем предполагает, что API готов, поднимет кого-то на неверном уровне, а задача, которая пингует API и называет это доказательством туннеля, не отличает работающий VPN от ноутбука, случайно оказавшегося в офисной сети.
Один профиль: спросите то, что им владеет
Для встроенной службы Mac элементы управления сетевого подключения в scutil сообщают именно это. Они читают состояние именованной конфигурации, а не делают выводы из интерфейса.
scutil --nc list
scutil --nc status "Office VPN"
Имя профиля в этой команде должно быть настоящим из вывода списка, а не догадкой. Это путь только для чтения для встроенных служб, и он не гарантирует, что сторонний клиент там вообще появится; поставщику, который управляет своим туннелем, нужен собственный поддерживаемый интерфейс состояния. Проверьте список, прежде чем писать вызов состояния, чтобы отсутствующее имя падало заметно, а не молча ни с чем не совпадало.
Внутри приложения Network Extension читайте состояние из объектов менеджера и соединения, а не из системы. Обратите внимание на область действия: загрузка сохранённых конфигураций возвращает только созданные вызывающим приложением, поэтому пустой результат означает «ни одной моей», а не «на этом Mac нет VPN». Отличайте неудачный запрос от подтверждённого отключённого состояния и рассматривайте переходные состояния как отдельные результаты, вместо того чтобы повторять попытку соединения, которое уже устанавливается.
Одна задача: готовность — отдельный предикат
Если вопрос в том, может ли задача продолжиться, проверьте её фактическую зависимость после того, как владелец соединения сообщит желаемое состояние. Ограниченная проверка готовности к частному ресурсу — правильная форма: она доказывает, что нужно задаче, и ничего больше.
Она по-прежнему не может доказать, что каждый запрос на машине использует туннель, и не должна подаваться так, будто может. Точно так же ресурс, который отвечает по обычной сети, не является доказательством VPN, поэтому обе проверки остаются раздельными, даже когда обе успешны.
Когда задаче действительно нужен защищённый путь, это требование нуждается в собственном проекте принудительного применения развёртывания: маршрутизация, исключения раздельного туннеля, правило брандмауэра или требование на уровне приложения. Доступность конечной точки — это факт о сервере. Принуждение — это факт о конфигурации клиента, и одно не доказывает другое.
Один поток: проверьте выбранный маршрут
Для одного потока посмотрите на назначение, семейство адресов и контекст источника с помощью диагностики маршрутизации, которая сообщает выбранный путь именно для этого назначения. Этот вывод называет фактически использованные интерфейс и адрес источника, что намного сильнее записи маршрута по умолчанию.
Широкие проверки в браузере отвечают на совсем другой вопрос. Результат публичного IP описывает, как выглядел один запрос с точки зрения одного сервера, и ничего не говорит о частном DNS, исключённых приложениях или втором сетевом контексте, который использует другой процесс.
Верните результат, который вызывающий сможет использовать
Выберите форму возврата, подходящую предикату: именованное состояние профиля, вердикт о готовности ресурса или явное «неизвестно» с доказательствами, которые его дали. Рядом с вердиктом сохраняйте идентичность конфигурации и причину сбоя.
Именно последняя привычка создаёт разницу между автоматизацией, которая помогает, и автоматизацией, которая скрывает проблемы. «Office VPN: отключено, последняя попытка не прошла аутентификацию» говорит оператору, куда смотреть. «VPN упал» приглашает к переустановке, а «интерфейс найден» приглашает к ложному всё в порядке.
Справочник Network Extension о загрузке сохранённых конфигураций туннеля — это место, где подтверждают область действия вызывающего приложения, прежде чем что-то на этом строить.