行き先なし

WSL2からWindowsの上のプログラムへネットワークアクセスするときに見ること

IPアドレスとWindowsDefenderファイヤウォール

WSL2Windows

たとえばWindowsで起動しているプログラムがHTTPを受けるとして、それにWSL2からアクセスするとき。

NATモードにおける対処です。
最近正式解放された networkingMode=mirrored の場合ではない。

はじまり

ある日私はVOICEVOX 1 へWSL2からAPI呼び出しをしようとしました。

バインドアドレス

WSL2固有ではない話です。

デフォルトでloopbackアドレスからのみのアクセスを許可するプログラムが多く、127.0.0.1localhost へバインドしています。

使用するアプリケーションの起動オプションまたは設定ファイルでバインドアドレスを指定します。オプション名はだいたい --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から見える eth0inet 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 ファイアウォール > 許可されたアプリ

プログラムを初回起動したときに確認ダイアログが現れていて許可をしていた場合はすでに設定済みになっているかもしれません。

Windows セキュリティ ネットワークアクセス許可

また、“セキュリティが強化された Windows Defender ファイアウォール” の受信の規則から新しい規則追加でポートを空けてもよいです。 今回はアプリ単位のルールの方が簡単です。

Windows セキュリティ ネットワークアクセス許可

おわり

これでWSL2からWindowsの上にいるVOICEVOX APIを使えるようになりました。

脚注

  1. VOICEVOX Linux版を使うのが自然ですが、すでにWindowsに入れているのでそのまま使いたい