Dock Stay
ポートを転送する - netsh portproxy の使い方・オプション・サンプル

ポートを転送する - netsh portproxy

WSL2 は独自 IP を持つ VM なので、Windows の `localhost` からアクセスするには自動転送、同一 LAN の別端末からアクセスするには `netsh portproxy` 等の追加設定が必要になる。

概念図

netsh portproxy diagram

構文

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 all

LAN からのアクセスを 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 を使うか別環境を用意する

関連トピック