#author("2021-02-06T17:05:01+09:00","default:ryuichi","ryuichi")
#author("2021-02-06T17:07:34+09:00","default:ryuichi","ryuichi")
* WSL2上で起動しているアプリに外部のPCからアクセスできるようにする [#kabf5612]

** 問題 [#xea6acb5]

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

** 解決方法 [#hcab1c0f]

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

** ポートフォワーディング設定スクリプト [#m1356b35]

 $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'''を実行すると全削除できる

** タスクスケジュールにスクリプトの実行を登録 [#b4db62ae]

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

** 参考 [#ffd83159]

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

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