ポートを転送する - netsh portproxy
WSL2 は独自 IP を持つ VM なので、Windows の `localhost` からアクセスするには自動転送、同一 LAN の別端末からアクセスするには `netsh portproxy` 等の追加設定が必要になる。
概念図
構文
bash
netsh interface portproxy add v4tov4 listenport=3000 connectaddress=<WSL2 IP>実例
WSL2 側の IP を確認
bash
ip -4 addr show eth0現在の Windows 側の転送設定を一覧
bash
netsh interface portproxy show allLAN からのアクセスを WSL2 に転送
bash
netsh interface portproxy add v4tov4 listenport=3000 listenaddress=0.0.0.0 connectport=3000 connectaddress=172.21.0.5概要
WSL2 は Hyper-V 上の軽量 VM なので、eth0 には 172.x.y.z のような仮想ネットワーク上の IP が割り当てられます。
Windows 本体と VM は内部仮想スイッチで接続されている構成です。
Windows 10 以降では、WSL2 内でリッスンした localhost:PORT を Windows 側 localhost:PORT から直接見られる「localhost フォワーディング」が組み込まれています。
ただしこれは Windows 自身(同じマシン)からのアクセスに限られ、LAN 上の別端末・スマホ・VM 同士でテストする場合は別途設定が必要になります。
典型的な用途
- WSL2 内で Next.js / Rails / FastAPI などを開発し、Windows のブラウザで
localhost:3000を開く - 同じ LAN のスマホや別 PC から開発サーバーを確認する
- WSL2 内のデータベースに Windows 側 GUI クライアント(DBeaver 等)から接続
- SSH サーバーを WSL2 内で動かし、別端末から
ssh windows-host:2222でつなぐ - Docker Desktop を使っていて、コンテナ側のポートを LAN に公開する
コマンド例
# WSL2 側の IP を拾う
ip -4 addr show eth0 | awk '/inet /{print $2}'
# 172.21.0.5/20
# Windows 側: LAN からの 3000 番を WSL2:3000 に転送
netsh interface portproxy add v4tov4 `
listenport=3000 listenaddress=0.0.0.0 `
connectport=3000 connectaddress=172.21.0.5
# 現状確認
netsh interface portproxy show all
# 削除
netsh interface portproxy delete v4tov4 listenport=3000 listenaddress=0.0.0.0
# ファイアウォール穴開け
New-NetFirewallRule -DisplayName "WSL dev 3000" -Direction Inbound -LocalPort 3000 -Protocol TCP -Action Allow
# %USERPROFILE%\.wslconfig で Mirrored Mode(Windows 11)を有効化すると、
# 手動の portproxy が不要になり、localhost と LAN の両方で素直に届く
[wsl2]
networkingMode=mirrored
ベストプラクティス
- 可能であれば Windows 11 の Mirrored Mode を使う。手動転送が不要になり、IP が変わっても動き続ける
- 従来の NAT モードでは、起動ごとに WSL2 IP が変わるため再登録スクリプトを用意する
- 開発サーバーは
0.0.0.0で bind する。127.0.0.1で bind すると localhost フォワーディングでしか届かない - ファイアウォールの規則は「開発用」と明記し、不要になったら削除する運用にする
- LAN 越しの接続は HTTPS ではない開発サーバーが多いので、社外ネットワーク(カフェ・公衆 Wi-Fi)では行わない
注意点
- 旧 NAT モードでは WSL2 再起動のたびに IP が変わる。固定したいなら Mirrored Mode か、起動スクリプトで portproxy を再登録する
- Mirrored Mode はドライバや VPN クライアントとの相性問題がある。業務 PC では挙動をテストしてから採用する
netsh portproxyの設定は再起動しても残る。不要になった転送は定期的に掃除する- Windows ファイアウォールで止まっている場合、外部からはつながらないがタイムアウトまで待たされるため切り分けが難しい
- WSL2 内の IPv6 は限定的。IPv6 を前提にしたテストは Mirrored Mode を使うか別環境を用意する
関連トピック
WSL2- Windows Subsystem for Linux の第 2 世代。Hyper-V 技術を基盤にした軽量 VM 上で本物の Linux カーネルを動かす方式で、WSL1 のエミュレーションとは根本的に別物。Docker Desktop の標準バックエンドでもある。 Docker Desktop- Docker Desktop for Windows は WSL2 をバックエンドとしてコンテナを動かす構成。`docker-desktop` 専用ディストリに dockerd を常駐させ、ユーザーのディストリからは統合機能で透過的に使える。 /mnt/c vs ~- WSL2 では `~/`(Linux 側 ext4)と `/mnt/c/`(Windows 側 NTFS)で IO 性能が 10 倍以上違うことがある。`9p` プロトコルを介した Windows FS アクセスが遅いため、作業ファイルの置き場所で体感が大きく変わる。 