Ошибка 789 на L2TP-подключении в Windows означает, что туннель умер внутри обмена безопасностью IPsec, а это происходит задолго до того, как Windows вообще отправит пароль пользователя куда-либо. Повторная попытка с паролем или его сброс в каталоге не могут продвинуть этот этап. Продвигает его перестройка подключения из PowerShell с предложением, которое шлюз действительно предлагает, потому что мастер в Параметрах выбирает трансформации IPsec молча и никогда не показывает, что именно выбрал. Это и есть инструкция для этого: создайте профиль, зафиксируйте предложение, а затем используйте таблицу этапов, чтобы следующий код сказал вам что-то полезное.

Создайте профиль без мастера

Add-VpnConnection записывает собственную запись телефонной книги, поэтому результат — тот же объект, который приложение Параметры будет редактировать позже. Запускайте его из сеанса с повышенными правами, когда подключение должно существовать для каждой учётной записи на машине, или из контекста пользователя, когда оно должно оставаться частным:

Add-VpnConnection -Name "Contoso L2TP" `
  -ServerAddress 203.0.113.10 `
  -TunnelType L2tp `
  -EncryptionLevel Required `
  -AuthenticationMethod MSChapv2 `
  -RememberCredential -Force

Согласуйте -AuthenticationMethod с тем, что предлагает шлюз. MSChapv2, EAP и PAP не взаимозаменяемы, и профиль, требующий метода, который сервер не примет, не проходит ещё до того, как будет просмотрена хоть какая-то запись пользователя. Оставляйте -EncryptionLevel Required для всего настоящего; Optional разрешает Windows принять незашифрованный туннель, если встречная сторона предложит такой, а это лабораторное сокращение, а не настройка для выпуска.

Если вы передаёте -L2tpPsk, этот предварительно общий ключ записывается в профиль на диске, откуда любой, кто может прочитать профиль на этой машине, сможет его восстановить. Используйте сертификат для аутентификации встречной стороны, когда шлюз это поддерживает, а когда PSK неизбежен, держите его вне репозитория и вне истории оболочки, вместо того чтобы вставлять его в каждый запуск развёртывания.

Зафиксируйте предложение вместо принятия значений по умолчанию

Windows сам заполняет трансформации IPsec, и поэтому две машины с внешне одинаковым подключением могут по-разному отказать против одного и того же шлюза. Set-VpnConnectionIPsecConfiguration — поддерживаемый способ зафиксировать их:

Set-VpnConnectionIPsecConfiguration -ConnectionName "Contoso L2TP" `
  -AuthenticationTransformConstants SHA256128 `
  -CipherTransformConstants AES128 `
  -EncryptionMethod AES128 `
  -IntegrityCheckMethod SHA256 `
  -DHGroup Group14 `
  -PfsGroup None `
  -PassThru -Force

Этот набор — одна распространённая раскладка L2TP/IPsec, а не универсальный ответ. Каждый параметр принимает фиксированный список значений, а комбинация, которую платформа не может сопоставить, возвращается как ошибка командлета вместо тихо ослабленного профиля. Относитесь к такой ошибке как к утверждению о значениях, а не о ваших правах.

Скопируйте предложение из документации шлюза или из его живых настроек фазы 1 и фазы 2 и меняйте по одному полю за раз только тогда, когда шлюз журналирует отклоняемые трансформации. Перебор пяти полей даёт подключение, которое работает случайно, и запись, которая ничего не объясняет следующему человеку.

Читайте отказ по этапу, а не по тексту ошибки

789 относится к семейству кодов, которые в окне клиента выглядят все одинаково. Поставьте код напротив этапа, к которому он относится, прежде чем снова трогать профиль:

What you seeStage that failedCheck first
Nothing happens, then a timeoutNo IKE response at allServer address, UDP 500 and 4500 reachability, NAT traversal on the gateway
Error 789IKE security exchangeProposal, pre-shared key, certificate trust and client clock
Error 691 or a repeated password promptUser authenticationAccount state, domain, RADIUS or NPS policy
Tunnel up, some hosts unreachableRouting or DNS after PPPSplit-tunnel routes, pushed DNS, remote subnet mask

Здесь важны две роли учётных данных. Предварительно общий ключ или сертификат удостоверяет стороны друг перед другом, а MSChapv2 или EAP удостоверяет вас внутри туннеля. Сброс пароля пользователя не исправит первое, новый общий секрет не исправит второе, а изменение обоих сразу уничтожает доказательство того, что именно было неверно.

На пути с сертификатом проверьте часы клиента, цепочку доверия и удостоверение, которое ожидает шлюз, прежде чем рассматривать ослабление проверки. Отключение проверки превращает видимую 789 в туннель, который подключается, доверяя неверной стороне, и ничто в клиенте не скажет вам, что это произошло. список ошибок удалённого доступа Microsoft является справочником для самих кодов и отделяет отказы уровня безопасности от отказов при входе.

Проверьте с обеих сторон, прежде чем считать это исправленным

Прочитайте профиль обратно, но не ждите предложения в выводе. Get-VpnConnection сообщает имя, адрес сервера, тип туннеля, уровень шифрования и метод аутентификации и ничего не знает о трансформациях, поэтому чтение подтверждает, что запись существует и указывает на правильный узел:

Get-VpnConnection -Name "Contoso L2TP" |
  Select-Object Name, ServerAddress, TunnelType, EncryptionLevel, AuthenticationMethod

Набирайте из командной строки, чтобы получить номер вместо диалогового окна: rasdial "Contoso L2TP" возвращает тот же код отказа, что вернул бы интерфейс, а rasdial "Contoso L2TP" /disconnect очищает его между попытками. Затем прочитайте сторону шлюза для той же попытки. ipsec statusall strongSwan или журнал IKE маршрутизатора сообщает, какое предложение пришло и какое было отклонено, и сравнение этого со значениями командлета — единственный шаг, который действительно доказывает, что обе стороны договорились.

Успешное подключение — не финишная черта. Откройте приложение, которое важно пользователю, потому что маршруты, проталкиваемый DNS и настройки раздельного туннеля отказывают после поднятия туннеля и вообще не создают диалогового окна ошибки.

Автоматизируйте это и откатывайтесь чисто

Именно автоматическая установка — причина писать для этого скрипт, а шаг набора номера — место, где утекают учётные данные. rasdial принимает их в своей командной строке, где другие локальные пользователи и большинство сборщиков журналов могут их прочитать:

subprocess.run(["rasdial", "Contoso L2TP"], check=True)

Предпочитайте учётные данные, ограниченные учётной записью, которая выполняет задачу, или позвольте профилю сохранить их с помощью -RememberCredential, вместо передачи пароля как аргумента в планировщике заданий. Сами команды развёртывания безопасно повторять с -Force, но они охотно перезапишут старое предложение, поэтому повторный запуск помогает только если скрипт несёт текущие значения.

Профили сохраняются после перезагрузок и живут дольше конфигурации шлюза, для которой были построены. Когда предложение шлюза меняется, удалите запись и создайте её заново, вместо того чтобы наслаивать второй набор значений: Remove-VpnConnection -Name "Contoso L2TP" -Force, а затем повторите два командлета с новым набором.

Замкните цикл четырьмя проверками, которые живут рядом со скриптом: Get-VpnConnection показывает ожидаемый тип туннеля и уровень шифрования; шлюз журналирует завершённые фазу 1 и фазу 2 для адреса вашего клиента; rasdial возвращает успех, и приложение открывается; и предложение, записанное в скрипте, совпадает с текущей настройкой шлюза. Когда придёт следующая 789, это сравнение займёт минуты вместо половины дня.

Похожие статьи