Десь у скрипті розгортання є перевірка, чи піднято тунель, перш ніж почнеться копіювання. Доступні три відповіді, і вони означають не одне й те саме: стан служби, який повідомляє 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 відправить наступну людину шукати не в тому місці.

Схожі статті