WindowsのVPNが全トラフィックを奪う?既定ルートを削除する
「リモート ネットワークで既定のゲートウェイを使用する」をオフにし、プッシュされた既定ルートを削除し、オフィスのプレフィックスを戻してから、DNSとIPv6を再確認します。
オフィスのVPNに接続すると、ブラウザーのすべてのページがそのネットワークを通り始めます。ファイルサーバーは速く、それ以外は遅い、フィルターされる、あるいは消えてしまいます。クライアントが誤動作しているのではなくプロファイルがフルトンネルを要求しているのであり、これを止めるスイッチは最新の設定アプリが表示しないダイアログのチェックボックスひとつで、接続のたびにゲートウェイがまた口を出します。この手順はWindowsの画面が実際に示す順序に従い、その後、ルートテーブルが正しく見えても失敗する確認を扱います。
設定ではなくアダプターのプロパティから始める
設定アプリはプロファイルを「ネットワークとインターネット」の下、次にVPNの下に一覧しますが、表示されるのは一般的なオプションだけです。既定ゲートウェイの判断はアダプター側にあります。Win+R と ncpa.cpl でクラシックなアダプター一覧を開き、VPN接続を右クリックし、プロパティを選び、インターネット プロトコル バージョン 4 を選び、もう一度プロパティ、次に詳細設定を選びます。リモート ネットワークで既定のゲートウェイを使用する のチェックを外し、三つのダイアログすべてを閉じます。
テストの前に再接続してください。チェックボックスはトンネル確立時に適用され、既存のセッションは構築済みのテーブルを保持します。クライアントが切断中でアダプターが見当たらない場合は一度接続してからウィンドウを開き直し、IPv4のプロパティページを持たないTAPやWintunアダプターをインストールするベンダークライアントにはこのダイアログがそもそもなく、その場合の同じ判断はクライアント自身の設定にあるスプリットトンネルのオプションで、アダプターのチェックボックスは探す場所が違います。
PowerShellで同じ変更を行う
WindowsのVPNストアで作成したプロファイルならこの設定はスクリプト化でき、マシンを頻繁に作り直すならそれが望ましい方法です:
Set-VpnConnection -Name "Office" -SplitTunneling $true
Get-VpnConnection -Name "Office" | Select-Object Name,SplitTunneling
そのコマンドレットはそのストアのプロファイルにしか届きません。サードパーティ製クライアントが追加した接続は表示されず、コマンドはタイプミスのような名前エラーで失敗します。このスイッチがしないことも確認してください:クライアントが既定ルートをインストールするのを止めますが、接続時にゲートウェイがプッシュするルートは削除しないため、多くのネットワークでは次の節が依然として必要です。
ゲートウェイが既定ルートを押し戻すとき
まずテーブルを読みます。メトリックの異なる既定エントリが二つあれば、プロファイルの変更は効いており、プッシュされたルートがそれでも置き換えたということです:
route print -4
Get-NetRoute -DestinationPrefix 0.0.0.0/0 | Sort-Object RouteMetric
Get-NetAdapter | Select-Object Name,ifIndex
トンネルに属する既定ルートを削除し、物理側を残し、三番目のコマンドのインターフェイスインデックスを使ってアダプターの別名は使わないでください:別名を渡すスクリプトは表示名が変わった瞬間に壊れます。
Remove-NetRoute -DestinationPrefix 0.0.0.0/0 -InterfaceIndex 21 -Confirm:$false
route delete 0.0.0.0 10.8.0.1
削除するとオフィスも一緒に消えるので、トンネルのゲートウェイ経由で社内プレフィックスを戻します:ここを飛ばす人が多く、だからこそスプリットトンネル変更の成功後に「VPNが動かなくなった」が続くのです。
route add 10.0.0.0 mask 255.0.0.0 10.8.0.1 metric 5 if 21
再接続のあとここまでの内容が残らないのは、バグではなく正直な動作です:アダプターが再構築され、クライアントはプロファイルとゲートウェイが合意した内容を再適用するからです。既定ルートが毎回戻るなら、ゲートウェイがスプリットトンネリングを拒否する設定になっており、押し続けるかセッションを切ります。それはネットワーク運用者のポリシーであり、要求はそこへ出すものであって、接続のたびに抵抗するローカルスクリプトの仕事ではありません。
再接続後にDNS、IPv6、メトリックを再確認する
IPv4の既定ルートを削除しても、もう一方のファミリーや名前解決については何も証明できません。トンネルがIPv6を運びながらIPv4の既定はローカルのまま残ることがあり、プッシュされたリゾルバー一覧が内部名を生かしたまま、それを使うクエリが別の経路を通ることもあります。終わりと言う前に三つすべてを確認します:
Get-NetRoute -DestinationPrefix ::/0
Get-DnsClientServerAddress -InterfaceAlias "Office"
Get-DnsClientNrptPolicy
接続のたびに状態が戻るなら、テーブルを手で編集するのではなく接続ごとのアクションに移してください:接続イベントで起動するスケジュールタスク、またはクライアント自身のスプリットトンネル設定がある場合はそれを使います。インターフェイスインデックスは変数に保持し、アダプターの追加や削除で変わりうるため実行時に調べてください。
何を手放したかを決める
ローカルのインターネットトラフィックはもうオフィスに検査もフィルターもされず、トンネル経由でのみ公開されるものは独自のルートが必要になります。スプリットトンネリングをポリシー違反とみなす組織もあるので、管理されたデバイスを変更する前に確認してください:プッシュされた既定は事故ではなく強制の仕組みである場合があります。Set-VpnConnection のドキュメントには、スプリットトンネリングのパラメーターと適用されるプロファイルの種類が記載されています。
次に固定の順序で、既定ルートの所有者、通常のブラウジング、アドレス指定での社内ホストひとつ、内部名ひとつ、そして再接続一回の後に同じ四つを確認します。ブラウジングが動いて社内ホストが失敗するなら、欠けているのは削除した既定ではなくプレフィックスルートで、プロファイルを作り直すよりはるかに安く直せます。