Introduction
忘備録。
Windows Subsystem for Linux Version 2 に構築したサーバーに外部からアクセスできず困っていた。
ググってみれば、いろいろ答えは書いてあったが、ファイヤーウォール解除、ポート転送の許可など、何をやってもうまくいかなかったため自宅で検証。
How to resolve?
一度ゼロから Windows 10 内に下記 Hyper-V マシンを構築。
1 | エディション Windows 11 Pro |
1. WSL のインストール
仮想マシン内に WSL をインストールしていく。
1 | wsl --install |
再起動後、自動でシェルが立ち上がり、デフォルトでインストールされた Ubuntu の設定が始まる。
1 | Ubuntu は既にインストールされています。 |
ちなみに、再起動後下記のようなメッセージなった場合は、 Nested Virtualization が無効になっている状態で Hyper-V の中で WSL をインストールしたことを意味している。
1 | Ubuntu は既にインストールされています。 |
そのため、仮想マシンをシャットダウン、ホストマシンに戻り、下記を実行。
1 | Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true |
再度、仮想マシンを立ち上げ、wsl --install
を実行することで前述の Ubuntu の設定が再開される。
2. サーバーの用意
WSL にサーバーアプリケーションを構築する。
ポート転送が動作するかを検証したいだけなので、何でもいい。
ここでは cockpit
をインストール。
WSL 起動後、下記でインストール可能。
1 | $ sudo apt update |
WSL のホストマシンからブラウザを立ち上げ、 http://localhost:9090
にアクセスすると無事に WSL 内の Cockpit にアクセスできる。
ここまでは特に問題なかった。
3. ネットワーク構成
構築した環境におけるネットワークは下記の状態になっている。
1 | ┌────────────────────────────────────────────┐ |
WSL のホストマシンである Hyper-V から、localhost
宛の通信は適切に WSL 側に転送されるため、先のように問題なくブラウザで表示することができた。
(localhost
ではなく vEthernet (WSL)
のアドレスを指定してもよい。つまり http://172.17.192.1:9090
でも Cockpit を表示できる)
これについては、 Microsoft Learn の Windows からの Linux ネットワーク アプリへのアクセス (localhost) に明記してある。
やりたいのは、WSL のホストマシンの外部マシン (今回の場合は Windows 10) から、WSL 内のサーバー アプリケーションへのアクセスである。
4. ファイヤーウォールとポート転送
Windows 10 から、WSL 内で起動している Cockpit へアクセスするためには
- Hyper-V (Windows 11) のファイヤーウォール設定変更 (9090 へのインバウンド)
- Hyper-V (Windows 11) 宛の通信を WSL へポート転送
が必要になる。
これらを一括で実施するのが下記の Powershell スクリプト (port-forward.ps1)
1 | # Set port numbers to be allowed |
上記の管理者権限をつけて立ち上げたコマンドプロンプトから実行。
1 | $ powershell.exe -ExecutionPolicy Bypass -File .\port-forward.ps1 |
WSL のアドレスを自動で調べて、ポート転送設定を行ってくれる。
Windows 10 のブラウザから、Hyper-V のアドレス (172.30.90.62) を指定して、WSL 内の Cockpit にアクセスできることが確認できる。