Ubuntu/Apacheサーバーへの外部からのアクセス 20260412
1.Apacheサーバーへのアクセス
Apacheサーバーが起動していれば,DocumentRootにあるindex.htmlは,同じPCのブラウザからhttp://localhost/で閲覧できる。
しかし,自PCのipアドレスがわかっていても,http://自PCのipアドレス/では閲覧できない。
例えば,自PCのipアドレスが192.168.1.18の場合,http://192.168.1.18/では閲覧できない。
別のPCやスマートフォンからhttp://192.168.1.18/のようにしても閲覧できない。
WSLを使ってUbuntuを導入すると,1つのPC内に,仮想的なUbuntuマシンが存在し,仮想的なUbuntuマシンは別のipアドレスを持っているからこのようなことが起こっている。
Localhostというのは,Ubuntuが動作中の仮想マシンを指している。(なんか変だが仕様のようだ)
2.仮想ipアドレスの確認とブラウザからのipアドレスアクセス
(1)PCのipアドレスの確認
Ubuntuが動作中のPC,Vegaで内部のipアドレスを確認する。
windowsのpowershellでの作業
>ipconfig
Ethernet adapter Ethernet: : IPv4 address 192.168.1.18 : vEthernet (WSL) : IPv4 address 172.31.128.1日本語環境ではイーサネット アダプター イーサネット: : IPv4 アドレス 192.168.1.18 : イーサネット アダプター vEthernet (WSL (Hyper-V firewall)): : IPv4 アドレス 172.31.128.1自PC(ホストPC)のipアドレスは192.168.1.18であることがわかった。これは,内部的には仮想Windowsマシンの外向けipアドレスである。
vEthernetのipアドレス記述172.31.128.1もあるがこれは仮想Windowsマシンの仮想LAN側のipアドレスである。
(vEthernetのipアドレス記述は,WSLが起動中のみ表示される。)
(2)Ubuntuのipアドレスの確認
Ubuntuでの作業$ ip a show dev eth0
2: eth0:と表示されます。3行目のmtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:15:5d:49:ac:af brd ff:ff:ff:ff:ff:ff inet 172.31.137.5/20 brd 172.31.143.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::215:5dff:fe49:acaf/64 scope link valid_lft forever preferred_lft forever
inet 172.31.137.5/20 brd 172.31.143.255 scope global eth0
に着目します。
172.31.137.5がUbuntuの仮想マシンが持つIPアドレスです。
(/20は上位20ビットがネットワーク部 下位12ビットが個々の機器(ホスト部)の識別)
Ubuntuの仮想LAN向けのipアドレスが172.31.137.5であることがわかった。
ここまで判ったら,Vegaのブラウザでhttp://localhost/は,http://172.31.137.5/でもアクセスできることがわかる。
3.他のPCやスマートフォンのブラウザからアクセス
他のPC(ここではAltair)のブラウザからアクセスすることを想定する。
AltairからVegaへののHTTPのアクセスは,Vegaのport80を通して行われる。通常はファイアウォールが遮断しているので通過できるようにする必要がある。
AltairからVegaへのHTTPアクセスはVegaのWindowsマシンに対して行われるため,Vegaの WindowsマシンからUbuntuに転送されなければならない。(ポートフォワーディング)
そのためにはPC,Vega上で次の2つの作業が必要になる。3.1 VegaのファイアウォールでHTTP(port80)のアクセス許可
- VegaのファイアウォールでHTTP(port80)のアクセス許可
- VegaのWindowsマシンのipアドレスからWSLの仮想ipアドレスへのHTTPのアクセスの転送(ポートフォワーディング)
3.2 ポートフォワーディング
- Vega上で「すべてのアプリ から windowsセキュリティ」を起動する
- 「ファイアウォールとネットワークの保護」をクリックする
- 「詳細設定」をクリックする。(下のほうにある)
- 「セキュリティが強化されたWindowsDefenderファイアウォール」が起動する
- ウィンドウ左側にある「受信の規則」を選択する
- 右側にある「新しい規則」を選択する
- 「ポート」を選ぶ → 次へ進む
- 「TCP」を選んで「特定のローカルポート」に 80 を設定する → 次へ進む
- 「接続を許可する」に設定する → 次へ進む
- この規則をいつ適用するか プライベート,パブリックにチェック → 次へ進む
- この規則に名前を付ける 「HTTP」 → 完了
ファイアウォールでのポート80の通過許可は,解除の作業をするまで有効である。
- ポートフォワードの設定
ホストPC(192.168.1.18)上のポート 80 でリッスンし,
それを IPアドレス172.31.137.5 のポート 80 に接続するポートフォワーディング設定をする
(ポート80はHTTP)
管理者権限のPowerShell上で
> netsh.exe interface portproxy add v4tov4 listenport=80 connectaddress=172.31.137.5- ポートフォワーディング設定の確認
管理者権限のPowerShell上で
> netsh.exe interface portproxy show v4tov4 ipv4 をリッスンする: ipv4 に接続する: Address Port Address Port --------------- ---------- --------------- ---------- * 80 172.31.137.5 80- ブート時にポートフォワーディング起動設定
PowerShell上で
> sc.exe config iphlpsvc start=auto
この設定は1回行うと以降は有効になる- ポートフォワーディングの動作開始
PowerShell上で
> sc.exe start iphlpsvc
すでに動作中の場合は,その旨注意される。
以上の作業が終了すると,
であればVegaのwindowsのブラウザ,Vega以外のPCのブラウザやスマートフォンのブラウザからのVegaへのHTTPアクセス
- Vegaが起動中
- VegaのファイアウォールでHTTPのアクセス許可
- VegaのWindowsマシンのipアドレスからWSLの仮想ipアドレスへのHTTPのアクセスのポートフォワーディングが設定されている
- Vegaのubuntuのapache2が起動している
http://192.168.1.18
が可能になる。応答するのはVegaのubuntuで動作中のApache2である。
ただし,これはhttpアクセスであり,httpsアクセスではないため,ブラウザによっては安全ではないとの警告が出たり,表示が注意されたりすることもある。
〇ポートフォワーディング設定の解除
(Apache2サーバを利用している場合はこのコマンドは使わない)
PowerShell上で
> netsh.exe interface portproxy delete v4tov4 listenport=80
〇ブート時にポートフォワーディング起動設定解除
(Apache2サーバを利用している場合はこのコマンドは使わない)
PowerShell上で
> sc.exe config iphlpsvc start=disabled
★ 少し前まで,Microsoftのwslのipアドレスの仕様で,PCが起動するたびに仮想側(Ubuntu)に新しいipアドレスが割り当てられていた。ipアドレス(上記の例では172.31.137.5)が毎回変化していた。そのため,PCの起動時に毎回Ubuntuのipアドレスの確認とポートフォワーディング設定作業が必要になっていた。(この問題はすでに解決されていいて,仮想側のipアドレスは固定になっている。)
4.次回以降のPC起動時について
次回以降のPC Vega起動時には,
(1) Vegaの外部向けのファイヤーウォールも設定どおりport80を開いている。
(2) Vegaからubuntuへのポートフォワーディングも起動中である。
の状態にある。
あとはubuntuを起動し,apache2をrootで起動すればubuntuはWebサーバとして機能する。
〇 apache2の起動
windows VegaにstartApache2.batを次の内容で作っておけば,このファイルを起動するだけでよい。
ただし,2行目はapache2とは無関係の便利コマンド。
これがないと,1行目はすぐに作業を終了するのでubuntuは誰も使用していないととらえ,自分を停止してしまう。
2行目はubuntuにある作業を継続的に行わせ,ubuntuが自動停止するのを阻んでいる。
wsl -d Ubuntu -u root service apache2 start
wsl --exec dbus-launch true
〇 apache2の停止
起動中のapache2を止めるだけなら,windows VegaにstopApache2.batを次の内容で作っておけば,このファイルを起動するだけでよい。wsl -d Ubuntu -u root service apache2 stop
〇 apache2の停止+ubuntuの停止
起動中のapache2を止め,ubuntuも止めるなら,windows VegaにstopApache2exitUbuntu.batを次の内容で作っておけば,このファイルを起動するだけでよい。wsl -d Ubuntu -u root service apache2 stop wsl --shutdown