概要
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 件のコメント:
コメントを投稿