WSL2からWindowsの上のプログラムへネットワークアクセスするときに見ること
IPアドレスとWindowsDefenderファイヤウォール
WSL2WindowsたとえばWindowsで起動しているプログラムがHTTPを受けるとして、それにWSL2からアクセスするとき。
NATモードにおける対処です。
最近正式解放された networkingMode=mirrored
の場合ではない。
はじまり
ある日私はVOICEVOX 1 へWSL2からAPI呼び出しをしようとしました。
バインドアドレス
WSL2固有ではない話です。
デフォルトでloopbackアドレスからのみのアクセスを許可するプログラムが多く、127.0.0.1
や localhost
へバインドしています。
使用するアプリケーションの起動オプションまたは設定ファイルでバインドアドレスを指定します。オプション名はだいたい --host
や --bind
です。
特にセキュリティを気にしない環境なら 0.0.0.0
を、アクセスされる経路がわかっているならその経路へプログラムから見えているアドレスを設定するとよいです。
VOICEVOXの場合、APIのみ使うなら voicebox.exe のある場所の run.exe を使います。 例です。
PS C:\Users\###\AppData\Local\Programs\VOICEVOX> .\run.exe --host 192.168.96.1
WSL2から見たWindowsのアドレス
WSL2からは $(hostname).local
で Windowsへネットワークアクセスできます。
$ echo "$(hostname).local"
ホスト名.local
$ nslookup "$(hostname).local"
(省略)
Address: 192.168.96.1
この 192.168.96.1 は WSLから見える eth0
の inet 192.168.102.57/20
のネットワークアドレスに1bit足した値と一致します。
$ ip addr
(省略)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1420 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:4f:b8:25 brd ff:ff:ff:ff:ff:ff
inet 192.168.102.57/20 brd 192.168.111.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fe4f:b825/64 scope link
valid_lft forever preferred_lft forever
(省略)
Windowsファイヤウォール
WSL2は vEthernet (WSL (Hyper-V firewall))
の後ろにいてNATで外に出ています。
Windowsはこの vEthernet からのアクセスを パブリックネットワークとして扱うためデフォルトでブロックされます。
なので穴を空けます。
Windowsファイアウォールでアプリごとの許可でパブリックを通せばよいです。
プログラムを初回起動したときに確認ダイアログが現れていて許可をしていた場合はすでに設定済みになっているかもしれません。
また、“セキュリティが強化された Windows Defender ファイアウォール” の受信の規則から新しい規則追加でポートを空けてもよいです。 今回はアプリ単位のルールの方が簡単です。
おわり
これでWSL2からWindowsの上にいるVOICEVOX APIを使えるようになりました。
脚注
-
VOICEVOX Linux版を使うのが自然ですが、すでにWindowsに入れているのでそのまま使いたい ↩