wslで外部からアクセスするポートを開く

wslで外部からアクセスするポートを開く

WSLで外部から端末にアクセスするには、以下の手順が必要。

  1. WSL上のLinuxでホストしているサーバーのIPアドレスとポート番号を確認
  2. Windowsのファイアウォールで外部からの通信を許可するポートを開放
  3. Windowsのnetshコマンドで外部からの通信をWSLにプロキシする設定を追加

ただし、WSL上のLinuxでホストしているサーバーのIPアドレスとポート番号は再起動のたびに変わってしまうため、自動実行のコードが必要

ということを行うコードはこんな感じ。これをtask schedulerに登録しておく

$ports = @(80, 443) # Webアプリで使うポートを配列で指定
$fwRuleName = "WSL 2 Firewall Unlock"
$wsl2Address = wsl -e hostname -I | ForEach-Object { $_.trim() }
$firstWsl2Address = $wsl2Address.Split(" ")[0]
Write-Output $firstWsl2Address
# 古い設定を削除
Remove-NetFireWallRule -DisplayName $fwRuleName

for ($i = 0; $i -lt $ports.length; $i++) {
  $port = $ports[$i]
  netsh interface portproxy delete v4tov4 listenport=$port listenaddress=*
}

# 新しいルールを設定
New-NetFireWallRule -DisplayName $fwRuleName -Direction Inbound -LocalPort $ports -Action Allow -Protocol TCP

for ($i = 0; $i -lt $ports.length; $i++) {
  $port = $ports[$i]
  netsh interface portproxy add v4tov4 listenport=$port listenaddress=* connectport=$port connectaddress=$firstWsl2Address
}