WSL2上で起動しているアプリに外部のPCからアクセスできるようにする

問題

  • WSL2のLinuxのIPアドレスはWSL2を起動しているPCのIPアドレスとは違う
    • (WSL1ではLinuxのIPアドレスはWSL1を起動ているPCのIPアドレスと同じ)
  • また、WSL2のLinuxはPCを再起動するたびにIPアドレスが変わる
  • したがって、このままでは外部のPCからWSL2のLinuxにIPアドレスを使ってアクセスすることができない

解決方法

  • WSL2を起動しているPC(Windows)にポートフォワーディング設定をして、外部のPCからのアクセスをWSL2のLinuxへ転送するように設定する
  • ポートフォワーディング設定はスクリプトにして、PC起動時に自動的に実行するようにする。

ポートフォワーディング設定スクリプト

 $ip_in_linux = bash.exe -c 'ip -4 address show eth0 | grep inet | awk ''BEGIN{FS=\" +\"}{print $3}\'' | cut -d / -f 1'
 $found = $ip_in_linux -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
 
 if (!$found) {
   Write-Output "The Script Exited, the ip address of WSL 2 cannot be found";
   exit;
 }
 
 $ports_in_linux = @(22, 80, 443, 8000);
 $_ports_in_linux = $ports_in_linux -join ",";
 
 Invoke-Expression "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock'";
 
 Invoke-Expression "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $_ports_in_linux -Action Allow -Protocol TCP";
 Invoke-Expression "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $_ports_in_linux -Action Allow -Protocol TCP";
 
 for ($i = 0; $i -lt $ports_in_linux.length; $i++) {
   $port = $ports_in_linux[$i];
   Invoke-Expression "netsh interface portproxy delete v4tov4 listenport=$port listenaddress='0.0.0.0'";
   Invoke-Expression "netsh interface portproxy add v4tov4 listenport=$port listenaddress='0.0.0.0' connectport=$port connectaddress=$ip_in_linux";
 }
  • $ports_in_linuxは自分の環境に合わせて書き換える
  • 上のスクリプトを適当なファイル名(wsl_portforwading.p1など)にして保存する
  • ポートフォワーディングの設定が残ってしまった場合は、自分でコンソールを開いて、netsh interface portproxy reset v4tov4を実行すると全削除できる

タスクスケジュールにスクリプトの実行を登録

  • WIN+Sキーを押して、taskschd.mscと入力して、出てきたアイコンを開く
  • タスクスケジューラーが起動するので、右上のペインから「基本タスクの作成...」を開く
  • 基本タスクの作成ウィザードが開くので、名前に適当な名前(WSL2ポートフォワーディング設定、など)を入力して、次へ
  • いつタスクを開始するかを聞かれるので、「ログオン時」を選んで、
    • プログラムに C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe
    • 引数の追加にc:\scripts\wsl2-portforwading.ps1 (パス名は自分の環境に合わせる)
    • と入力して、次へ
  • タスクで度の操作を実行しますかを聞かれるので、「プログラムの開始」を選んで、次へ
  • 完了ボタンを押して、ウィザードを閉じる
  • タスクスケジューラーの真ん中のペインに今作ったタスク(WSL2ポートフォワーディング設定、など)があるので探して、右クリックしてプロパティを選ぶ
  • プロパティのダイアログが開くので、全般タブを選んで、「最上位の特権で実行する」にチェックを入れて、OKボタンを押して閉じる

参考

https://github.com/microsoft/WSL/issues/4150#issuecomment-504209723


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2021-02-06 (土) 17:07:34