Стан 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 відправить наступну людину шукати не в тому місці.