wslでtsubame のdocker compose およびtsubame/src のserver.pyで支援頂きました。この環境を使って、これを外部(とりあえずLANに繋がったリモートマシンのブラウザからアクセスできるようにして下さい。
WSL 上の Web サーバ(tsubame)を LAN 内から公開する手順
前提
-
Windows + WSL2 環境
-
~/tsubame/docker compose(DB 等)と~/tsubame/src/server.py(HTTP サーバ)を WSL 上で稼働 -
公開ポート:
18080 -
公開範囲:同一 LAN 内のみ
1. WSL 側:server.py を外部待受にする
WSL 内で、HTTP サーバが 0.0.0.0:18080 で待受するようにする。
Flask 例
if __name__ == "__main__":
app.run(host="0.0.0.0", port=18080)
起動:
python3 server.py
待受確認
ss -lntp | grep 18080
期待結果:
LISTEN ... 0.0.0.0:18080 ...
2. Windows 側:ファイアウォールで 18080/TCP を許可
管理者 PowerShell で実行。
New-NetFirewallRule `
-DisplayName "tsubame 18080" `
-Direction Inbound -Action Allow `
-Protocol TCP -LocalPort 18080 `
-Profile Any
3. Windows → WSL のポート転送(portproxy)を設定
WSL2 環境では自動転送されない場合があるため、明示的に設定する。
3.1 WSL の IP を確認
ip -4 addr show eth0 | grep inet
例:
172.29.11.141
3.2 portproxy を追加(管理者 PowerShell)
netsh interface portproxy add v4tov4 `
listenaddress=0.0.0.0 listenport=18080 `
connectaddress=172.29.11.141 connectport=18080
確認:
netsh interface portproxy show all
4. アクセス方法(これが正解)
LAN 内の別PCのブラウザから
http://<WindowsのLAN IP>:18080/
今回の環境では:
http://192.168.0.3:18080/
5. docker compose について
-
PostgreSQL 等の 内部サービスは LAN 公開不要
-
server.pyが WSL 内 DB に接続できていれば OK -
docker compose側のポート公開設定は不要
全体構成(最終形)
別PCブラウザ
↓
Windows (192.168.0.3:18080)
↓ portproxy
WSL (172.29.x.x:18080)
↓
server.py
↓
docker compose(DB 等)
まとめ(要点だけ)
-
WSL の Web サーバは 0.0.0.0 で待受
-
LAN 公開の入口は Windows の IP
-
WSL2 では portproxy を使うのが確実
-
netshは 必ず Windows の管理者 PowerShell で実行
HTTPS 化の最終手順(mkcert+nginx+Windows/WSL 構成)
1. mkcert によるサーバ証明書の作成(Windows)
本環境では、mkcert は以下の実行ファイルを直接使用している。
C:\Users\tomoi\Downloads\mkcert-v1.4.1-windows-amd64.exe
証明書は、IP アドレス・localhost・loopback を SAN に含めて生成する。
cd C:\Users\tomoi\Downloads
.\mkcert-v1.4.1-windows-amd64.exe 192.168.0.3 localhost 127.0.0.1 ::1
192.168.0.3+3.pem
192.168.0.3+3-key.pem
DNS:localhost
IP Address:192.168.0.3
IP Address:127.0.0.1
IP Address:::1
2. 証明書を WSL(nginx)側へ配置
WSL(Ubuntu)上で、nginx 用のディレクトリを作成し、Windows 側から証明書をコピーする。
sudo mkdir -p /etc/nginx/ssl/192.168.0.3
sudo cp /mnt/c/Users/tomoi/Downloads/192.168.0.3+3.pem \
/etc/nginx/ssl/192.168.0.3/cert.pem
sudo cp /mnt/c/Users/tomoi/Downloads/192.168.0.3+3-key.pem \
/etc/nginx/ssl/192.168.0.3/key.pem
sudo chmod 644 /etc/nginx/ssl/192.168.0.3/cert.pem
sudo chmod 600 /etc/nginx/ssl/192.168.0.3/key.pem
3. nginx 設定(192.168.0.3 用 HTTPS)
設定ファイル名は IP アドレスで統一する。
/etc/nginx/sites-available/192.168.0.3.conf
server {
listen 443 ssl;
server_name 192.168.0.3;
ssl_certificate /etc/nginx/ssl/192.168.0.3/cert.pem;
ssl_certificate_key /etc/nginx/ssl/192.168.0.3/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:18080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name 192.168.0.3;
return 301 https://$host$request_uri;
}
有効化と反映。
sudo ln -s /etc/nginx/sites-available/192.168.0.3.conf \
/etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
4. Windows → WSL への 443 番ポート転送
PowerShell を 管理者権限で実行する。
netsh interface portproxy add v4tov4 `
listenaddress=0.0.0.0 listenport=443 `
connectaddress=172.29.11.141 connectport=443
併せてファイアウォールを許可する。
netsh advfirewall firewall add rule name="Allow HTTPS 443" `
dir=in action=allow protocol=TCP localport=443
※ 172.29.11.141 は WSL 側の eth0 の IP。
クライアント側(LAN 内 PC)の信頼設定
5. mkcert CA の実体(あなたの環境)
mkcert が使用している CA の実体ディレクトリは以下である。
C:\Users\tomoi\AppData\Local\mkcert
この中にある
rootCA.pem
を、HTTPS アクセスを行うクライアント PC(例:192.168.0.25)へコピーする。
6. クライアント PC(Windows 11)への CA インストール
重要:必ず「ローカル コンピューター」ストアに入れる。
-
Win + R -
certlm.mscを実行 -
信頼されたルート証明機関
└ 証明書
-
右クリック →「証明書のインストール」
-
ローカル コンピューター
-
信頼されたルート証明機関
-
完了(UAC は許可)
※ certmgr.msc(現在のユーザー) では Chrome/Edge に効かない点に注意。
7. ブラウザ再起動と確認
Chrome / Edge を完全終了(タスクマネージャでプロセス消滅を確認)後、再起動。
https://192.168.0.3
🔒 鍵アイコンが表示され、
「信頼されていない通信」は解消される。
まとめ
-
mkcert による SAN 付き証明書生成
-
nginx による TLS 終端
-
Windows → WSL の 443 転送
-
ローカル コンピューター証明書ストアへの CA 登録
この 4 点が揃うことで、
LAN 内 IP アドレス指定でも、警告なしの HTTPS が成立する。
ーーーーー
HTTPS 構成 固定化メモ(Windows + WSL + nginx + mkcert)
前提構成
-
Windows 11(ホスト)
-
WSL2(Ubuntu)
-
nginx(WSL 上で TLS 終端)
-
mkcert による自己署名 CA
-
LAN 内 IP:
192.168.0.3 -
HTTPS 終端:
https://192.168.0.3
本メモでは Flask / server.py の常駐化は扱わない。
(nginx が 443 を受けて 127.0.0.1:18080 に流す前提のみ維持)
固定化の観点整理
HTTPS が不安定になる要因は以下の 3 点に集約される。
-
WSL の IP アドレスが起動ごとに変わる
-
nginx が WSL 起動後に立ち上がっていない
-
Windows 側 portproxy が古い IP を向いたままになる
一方、以下は 一度設定すれば原則固定であり、再対応不要。
-
mkcert の CA(rootCA)
-
サーバ証明書(192.168.0.3+3.pem)
-
クライアント側 CA 信頼設定(certlm.msc)
1. WSL IP 変動への対策(最重要)
問題
WSL2 の eth0 IP は固定ではない。
例:
172.29.11.141 ← 起動のたびに変わる可能性あり
Windows の portproxy は 固定 IP 前提のため、
WSL 再起動後に HTTPS が無言で死ぬ。
対策方針
Windows 起動時に WSL の IP を再取得し、portproxy を張り直す。
最も単純で壊れにくい。
実装(PowerShell スクリプト)
ファイル:
C:\scripts\wsl_https_fix.ps1
内容:
# 既存 portproxy を削除
netsh interface portproxy delete v4tov4 `
listenaddress=0.0.0.0 listenport=443
# WSL の IP を取得
$wsl_ip = wsl hostname -I
$wsl_ip = $wsl_ip.Trim().Split(" ")[0]
# 新しい IP で portproxy を再設定
netsh interface portproxy add v4tov4 `
listenaddress=0.0.0.0 listenport=443 `
connectaddress=$wsl_ip connectport=443
2. portproxy 自動再設定(Windows 側固定化)
タスクスケジューラ登録
-
プログラム
powershell.exe
-
引数
-ExecutionPolicy Bypass -File "C:\scripts\wsl_https_fix.ps1"
-
開始(オプション)
C:\scripts
-
実行権限
-
最上位の特権で実行
-
-
トリガー
-
システム起動時
-
ユーザーのログオン時
-
これにより、
-
Windows 再起動
-
ログオン
-
WSL 再起動後
いずれでも 443 → WSL の最新 IP が自動復旧する。
3. nginx の自動起動(WSL 側)
目的
WSL 起動後に nginx が停止している状態を防ぐ。
設定
WSL(Ubuntu)で一度だけ実行。
sudo systemctl enable nginx
確認:
systemctl is-enabled nginx
enabled であれば OK。
4. 証明書まわりは「固定済み」
以下は 再起動・更新で壊れない。
サーバ証明書
-
/etc/nginx/ssl/192.168.0.3/ -
有効期限:2035年
-
SAN:192.168.0.3 含有
CA(クライアント側)
-
C:\Users\tomoi\AppData\Local\mkcert\rootCA.pem -
各クライアントで
certlm.msc → 信頼されたルート証明機関
一度入れれば、Windows Update でも消えない。
固定化後の動作モデル
[Windows 起動]
↓
タスクスケジューラ
└ wsl_https_fix.ps1 実行
└ portproxy を最新 IP に再設定
↓
[WSL 起動]
└ nginx 自動起動
↓
https://192.168.0.3 常時有効
まとめ(メモ要約)
-
壊れる原因は WSL IP と portproxy のズレ
-
解決策は Windows 起動時に張り直す
-
nginx は systemctl enable で固定
-
mkcert / CA / 証明書は もう触らない
この状態で、
再起動・ログアウト・WSL 再起動後も HTTPS は維持される。