Публичная конфигурация VPN перестала работать? Прочитайте этап отказа
Загруженный профиль описывает один хост на один день. Прочитайте, какое утверждение нарушилось, проверьте сертификат, который предъявляет вторая сторона, и никогда не отключайте проверку.
Профиль работал во вторник, а в пятницу клиент крутится тридцать секунд и сдаётся. На вашей машине ничего не изменилось. В том и дело: загруженная конфигурация описывает один хост в один момент, и оператор на другом конце не обязан держать это описание верным. Соблазн — начать править настройки безопасности, пока туннель не поднимется снова. Именно этот инстинкт приводит к тому, что люди запускают профиль с отключённой проверкой сертификата, а это хуже, чем вообще без туннеля.
Файл описывает мгновение, а не договор
Файл конфигурации — это набор утверждений: это имя хоста слушает на этом порту с этим протоколом, предъявляет сертификат, соответствующий этому имени, и принимает эти учётные данные. Когда любое из них перестаёт быть верным, файл устарел, и исправление относится к стороне оператора за границей, а не к вашим настройкам.
Публичные списки узлов делают это очевидным по своей природе. Узлы держат добровольцы, они появляются и исчезают, адреса переиспользуются, а порты блокируются той сетью, за которой они находятся. Список — это снимок, который пересоздаётся, а копия на вашем диске — фотография более старого снимка.
Коммерческие сервисы меняются медленнее, но не никогда. Удостоверяющие центры сменяются, слушатель переезжает с общего адреса на отдельный, старый протокол выводится из эксплуатации, и появляется новый список шифров. Каждое из этого невидимо, пока ваш клиент не попробует подключиться и не получит другой ответ, чем ожидает файл.
Прочитайте этап отказа, прежде чем трогать настройку
Сообщение об ошибке говорит, какое утверждение нарушилось, и у каждого утверждения совершенно разное исправление. Править шифры, когда имя хоста больше не разрешается, — потерять полдня и никого ничему не научить.
| What happens | The assertion that broke | Supported response |
|---|---|---|
| Name never resolves | The host still exists under that name | Get a current endpoint from the operator |
| TCP connect times out | The listener is on that port and reachable | Check the current published port, then the local network |
| TLS or key exchange fails | The peer presents the expected identity | Compare the certificate, not the cipher list |
| Authentication rejected | The account is still valid | Get credentials reissued or stop using the service |
dig +short vpn.example.net
curl -sS -o /dev/null -w 'connect=%{time_connect} tls=%{time_appconnect}\n' --max-time 8 https://vpn.example.net:443/
openssl s_client -connect vpn.example.net:443 -servername vpn.example.net -brief </dev/nullСредняя строка отделяет заблокированный путь от сломанного рукопожатия, а третья показывает издателя и даты действия сертификата, который действительно предъявляется. Если этот издатель не тот, который закрепил профиль, сертификат изменился, и никакая клиентская опция не сделает старый пин снова верным.
Изменения сертификата и идентичности — самые тихие
Большинство отказов объявляют о себе сами. Изменения идентичности — нет, потому что клиент, закрепивший имя сертификата, отклонит вполне хороший новый сертификат с сообщением, которое многие читают как ошибку в программе. Туннель в порядке. Пин устарел.
Поищите опции идентичности, прежде чем что-то заключать:
grep -nE '^(remote|proto|auth|verify-x509-name|tls-crypt|key-direction|ca) ' profile.ovpn
openssl x509 -in profile-ca.crt -noout -subject -datesЕсли профиль несёт встроенный CA, а оператор перешёл на новый центр, старый файл не может проверить новый сервер. Заменить блок CA на опубликованный оператором — законное исправление. Удалить директиву проверки — нет, и это те же нажатия клавиш с совершенно другим результатом.
Обновление клиента может дать тот же симптом без каких-либо изменений у оператора. Опции, которые молча допускались, теперь отклоняются, или устаревший протокол удаляется. Это предел совместимости в вашем программном обеспечении, и стоит проверить второй профиль на том же клиенте, прежде чем винить сервер.
Только оператор может опубликовать действительную замену
Когда узел исчезает, замена должна прийти из того же источника, который опубликовал оригинал. Профиль, пришедший в личном сообщении потому, что «использует то же имя сервера», — это непроверенная конфигурация от неизвестной стороны, и его импорт отдаёт этой стороне контроль над вашей маршрутизацией.
Проверка дешева. Возьмите текущий файл из опубликованного места, сравните конечную точку и протокол со списком и подтвердите отпечаток материала CA, вместо того чтобы доверять имени файла:
curl -sS -o current.ovpn https://example.org/nodes/current.ovpn
sha256sum current.ovpn profile.ovpn
grep -nE '^(remote|proto) ' current.ovpnЕсли два хеша различаются только пробелами, у вас изменение форматирования. Если они различаются конечными точками, оператор что-то перенёс, и опубликованный файл — авторитет. Если опубликованный файл старее вашего, вы, вероятно, смотрите в кэш, и устаревший ответ отправит вас не туда.
Выведите старую запись из обращения и запишите, что произошло
После проверки работающей замены удалите старый профиль, а не храните его как резерв. Устаревшая запись, которая подключается наполовину, — это ловушка: её выберут во время сбоя, она будет отказывать медленно, и тот, кто разбирается, потратит первые десять минут на неправильный файл.
Держите короткую запись вне конфигурации: дату, старую конечную точку, этап отказа и то, что его заменило. Публичные узлы меняются, и через шесть недель тот же вопрос приходит с другим человеком. Одна строка в файле заметок отвечает на него за секунды.
Если из одной сети каждый узел отказывает одинаково а из другой — ни один, перестаньте править профили и посмотрите на локальный путь. Захваченный портал, отфильтрованный диапазон портов или перехватывающий прокси дадут одинаковые ошибки у несвязанных провайдеров, и именно этот шаблон — единственный признак того, что проблема никогда не была в файле.