Ошибка 789 L2TP/IPsec в Windows: создайте профиль и зафиксируйте предложение
Ошибка 789 возникает на этапе обмена IPsec, а не из-за пароля. Создайте профиль L2TP скриптом, зафиксируйте предложение и читайте последующие коды по этапам.
Ошибка 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 see | Stage that failed | Check first |
|---|---|---|
| Nothing happens, then a timeout | No IKE response at all | Server address, UDP 500 and 4500 reachability, NAT traversal on the gateway |
| Error 789 | IKE security exchange | Proposal, pre-shared key, certificate trust and client clock |
| Error 691 or a repeated password prompt | User authentication | Account state, domain, RADIUS or NPS policy |
| Tunnel up, some hosts unreachable | Routing or DNS after PPP | Split-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, это сравнение займёт минуты вместо половины дня.