2024年4月15日月曜日

VPN + WSL2 で名前解決できなかったりインターネットに接続できない場合の対処方法

VPN + WSL2 で名前解決できなかったりインターネットに接続できない場合の対処方法

概要

VPN (今回は GrobalProtect 環境) に接続した Windows マシン上で WSL2 を使おうとするとネットワークのルーティングがおかしくなり DNS が参照できずにインターネットに接続できない現象が発生します

環境

  • Windows10 22H2
  • GrobalProtect
  • WSL2 (Ubuntu22.04)

準備

  • Windows マシンで VPN に接続する
  • WSL2 (Ubuntu) を起動する
  • 以下のパワーシェルを実行する

ネットワークのルーティングメトリックを更新する Powershell

このスクリプトは参考サイトにあるにサイトかあそのまま拝借しました
自分も GrobalConnect だったのでネットワークのアダプタ名などはそのまま使えました

Powershell を管理者権限で実行して以下のスクリプトをコピペして実行しましょう

  • vim C:\Users\username\app\connect_vpn_on_wsl2.ps1
$targetIfName = 'PANGP Virtual Ethernet Adapter';
# define function
function Get-NetworkAddress {
    param([Parameter(Mandatory, ValueFromPipelineByPropertyName)][string]$IPAddress, [Parameter(Mandatory, ValueFromPipelineByPropertyName)][int]$PrefixLength);
    process {
        $bitNwAddr = [ipaddress]::Parse($IPAddress).Address -band [uint64][BitConverter]::ToUInt32([System.Linq.Enumerable]::Reverse([BitConverter]::GetBytes([uint32](0xFFFFFFFFL -shl (32 - $PrefixLength) -band 0xFFFFFFFFL))), 0);
        [pscustomobject]@{
            Addr = $IPAddress;
            Prfx = $PrefixLength;
            NwAddr = [ipaddress]::new($bitNwAddr).IPAddressToString + '/' + $PrefixLength;
        };
    }
}
# extend route metric
$targetAddresses = Get-NetAdapter -IncludeHidden | Where-Object InterfaceDescription -Match 'Hyper-V Virtual Ethernet Adapter' | Get-NetIPAddress -AddressFamily IPv4 | Get-NetworkAddress;
$targetIfs = Get-NetAdapter -IncludeHidden | Where-Object InterfaceDescription -Match $targetIfName;
$targetIfs | Set-NetIPInterface -InterfaceMetric 2;
$targetIfs | Get-NetRoute -AddressFamily IPv4 | Select-Object -PipelineVariable rt | Where-Object { $targetAddresses | Where-Object { $_.NwAddr -eq (Get-NetworkAddress $rt.DestinationPrefix.Split('/')[0] $_.Prfx).NwAddr } } | Set-NetRoute -RouteMetric 6000;

やっていることは VPN のルーティングに対してメトリックを 6000 に設定しています (Set-NetRoute -RouteMetric 6000)

デフォルト 5256 が最大優先度なのでそれ以上になっていれば OK です

ダブルクリックで実行する方法

上記をコピペして

C:\Users\username\app\connect_vpn_on_wsl2.ps
に保存します
ショートカットを作成しプロパティからリンク先を以下のように設定すればダブルクリックで実行できます

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File C:\Users\username\app\connect_vpn_on_wsl2.ps1

今回の場合は管理者権限が必要なので右クリックから管理者権限で実行が必要になります

DNS の変更

必要に応じて WSL2 側の resolve.conf を変更しましょう
スクリプトを実行すると VPN 側への通信ができるようになっているので VPN 側で使用している DNS サーバの IP を設定すると良いかなと思います

再起動した際に変わらないようにするには以下のようにします

  • sudo vim /etc/wsl.conf
[boot]
systemd=true

[network]
generateResolvConf=false
  • sudo vim /etc/resolv.conf
nameserver 8.8.8.8
  • sudo chattr +i /etc/resolv.conf

最後に

VPN + WSL2 で WSL2 側から VPN 側への通信をしたい場合は魔法のスクリプトを実行しましょう

参考サイト

0 件のコメント:

コメントを投稿