Някъде в скрипт за внедряване има проверка дали тунелът е активен, преди да започне копиране. Налични са три отговора и те не означават едно и също: състоянието на услугата, което съобщава 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 ще изпрати следващия човек да търси на грешното място.

Подобни статии