Windows の L2TP/IPsec エラー 789:プロファイルを作成し提案を固定する
エラー 789 は IPsec 交換で失敗し、パスワードではありません。L2TP プロファイルをスクリプトで作り、提案を固定し、後のコードを段階ごとに読み解きます。
Windows の L2TP 接続でエラー 789 が出るのは、トンネルが 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 の構成の一つであり、万能の答えではありません。各パラメーターは固定の値リストを受け入れ、プラットフォームがマップできない組み合わせは、静かに弱められたプロファイルではなく cmdlet エラーとして返ります。そのようなエラーは、権限ではなく値についての表明として扱ってください。
提案はゲートウェイのドキュメント、またはそのライブのフェーズ 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 は試行の間にそれを消します。次に同じ試行についてゲートウェイ側を読みます。strongSwan の ipsec statusall やルーターの IKE ログは、どの提案が届きどれが拒否されたかを示し、それを cmdlet の値と比較することが、両端が合意したことを実際に証明する唯一の手順です。
接続成功はゴールではありません。ユーザーが気にするアプリケーションを開いてください、ルート、プッシュされた DNS、スプリット トンネルの設定はトンネルが上がった後に失敗し、エラー ダイアログをまったく出さないからです。
自動化し、きれいにロールバックする
無人セットアップがこれをスクリプト化する理由であり、ダイヤルの手順は資格情報が漏れる場所です。rasdial はそれらを自身のコマンド ラインで受け取り、他のローカル ユーザーやほとんどのログ コレクターが読めます:
subprocess.run(["rasdial", "Contoso L2TP"], check=True)
ジョブを実行するアカウントに限定した資格情報を優先するか、スケジュールされたタスクでパスワードを引数として渡すのではなく、-RememberCredential でプロファイルに保存させてください。プロビジョニング コマンド自体は -Force で安全に繰り返せますが、古い提案を喜んで上書きするので、再実行が役立つのはスクリプトが現在の値を運んでいるときだけです。
プロファイルは再起動を越えて残り、作成されたゲートウェイ構成より長く生きます。ゲートウェイの提案が動いたら、値の二セット目を重ねるのではなく、エントリを削除して作り直してください:Remove-VpnConnection -Name "Contoso L2TP" -Force、その後に 二つの cmdlet を新しいセットで繰り返します。
スクリプトのそばに置く 四つのチェックでループを閉じます:Get-VpnConnection は期待されるトンネルの種類と暗号化レベルを示し、ゲートウェイはクライアント アドレスのフェーズ 1 とフェーズ 2 の完了を記録し、rasdial は成功を返してアプリが開き、スクリプトに記録された提案が現在のゲートウェイ設定と一致します。次の 789 が来たら、その比較は半日ではなく数分で済みます。