WSL 内のサーバーを LAN に公開する
この記事では WSL 内のサーバーを LAN に公開する方法を紹介します。
サーバーを建てる
既にサーバーがある場合は、この章は読み飛ばしてください。
index.html の作成
例として、以下の内容で index.html 作成します。
<!-- index.html -->
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hello, world!</title>
</head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
Ruby で簡易的なサーバーを立てる
Ruby でサーバーのスクリプトを記述します。
server.rb
に保存します。
#!/usr/bin/env ruby
# server.rb
require 'webrick'
server = WEBrick::HTTPServer.new({
:DocumentRoot => './',
:Port => 8000
})
trap('INT') { server.shutdown }
server.start
次に、ruby server.rb
を実行し、サーバーを立ち上げます。
(ここで、エラーが発生する場合は gem install webrick
を実行してください。)
ブラウザで localhost:8000
に接続すると index.html
の内容が表示されます。
hostname -I
で表示される IP アドレスでも表示できます。
LAN に公開する
最近の WSL2 の仕様では WSL で立ち上げたサーバーが localhost へ転送されます。 しかし、WSL1 とは異なり LAN のアドレス (例えば、192.168.0.2 など) へアクセスしても、WSL2 のサーバーへアクセスすることはできません。
したがって、ポート転送する必要があります。
ポート転送設定
netsh interface portproxy
コマンドを利用することで、ポート転送が可能です。
以下のコマンドは、すべての NIC に割り当てられている IP アドレスの 8000 へのアクセスを、 localhost:8000 へ転送する設定です。 このコマンドは、管理者権限で実行する必要があります。
netsh interface portproxy add v4tov4 listenport=8000 connectaddress=localhost
設定は netsh interface portproxy show v4tov4
を実行することで見ることができます。
PS > netsh interface portproxy show v4tov4
ipv4 をリッスンする: ipv4 に接続する:
Address Port Address Port
--------------- ---------- --------------- ----------
* 8000 localhost 8000
設定の削除方法
netsh interface portproxy delete v4tov4 listenaddress=* listenport=8000
また、すべての NIC ではなく、特定の NIC の IP アドレスに対して行いたい場合は、以下のコマンドを実行します。
netsh interface portproxy add v4tov4 listenport=8000 connectaddress=localhost listenaddress=<対象 NIC の IP アドレス>
ファイアウォール設定
- Win + R で「ファイル名を指定して実行」を開き、wf.msc と入力して「OK」し、「セキュリティが強化された Windows Defender ファイアウォール」を開きます。
- 左側にある「受信の規則」をクリックし、右側の「新しい規則…」をクリックして「新規受信の規則ウィザード」を開きます。
- 「ポート (O)」を選択して [次へ(N) >] をクリック
- 「特定のローカル ポート(S):」のところにポート番号 (今回の場合は 8000) を入力し [次へ(N) >] を 3 回クリック
- 「名前(N):」のところに適当な設定名をつけて [完了(F)] をクリックし設定を保存
LAN からアクセスできるかの確認
ipconfig
を入力し、LAN の IP アドレスを確かめます。
おそらくほとんどの場合は、192.168.x.x の形式だと思います。
このアドレスとポート番号を同じネットワーク内の端末 (スマホなど) のブラウザに入力します。 例えば、IP アドレスが 192.168.0.2 の場合は http://192.168.0.2:8000 です。