Ubuntu に Apacheサーバーへのアクセスを広げる 20230215

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アドレスアクセス

Ubuntuが動作中のPC,Vegaで内部のipアドレスを確認する。 (1)PCのipアドレスの確認
powershellでの作業

>ipconfig
  :
 IPv4 address 192.168.1.18
  :
 vEthernet (WSL)
  :
 IPv4 address 172.31.208.16

自PC(ホストPC)のipアドレスは192.168.1.18であることがわかった。これは,内部的には仮想Windowsマシンの外向けipアドレスである。
vEthernetのipアドレス記述172.31.208.16もあるがこれは仮想Windowsマシンの仮想LAN側のipアドレスである。
(vEthernetのipアドレス記述は,WSLが起動中のみ表示される。)

(2)Ubuntuのipアドレスの確認
Ubuntuでの作業

> ip a show dev eth0
6: eth0: mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:bb:18:85 brd ff:ff:ff:ff:ff:ff
    inet 172.31.208.28/20 brd 172.31.223.255 scope global eth0
        valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:febb:1885/64 scope link
        valid_lft forever preferred_lft forever

Ubuntuの仮想LAN向けのipアドレスが172.31.208.28であることがわかった。



ここまで判ったら,Vegaのブラウザでhttp://localhost/は,http://172.31.208.28/でもアクセスできることがわかる。

3.他のPCのブラウザからアクセス

他のPC(ここではAltair)のブラウザからアクセスしたい。
AltairからVegaへのHTTPアクセスはVegaのWindowsマシンに対して行われるため,WindowsマシンからUbuntuに転送されなければならない。(ポートフォワーディング)
そのためにはPC,Vega上で次の2つの作業が必要になる。 3.1 VegaのファイアウォールでHTTPのアクセス許可
  1. Vega上で「すべてのアプリ から windowsセキュリティ」を起動する
  2. 「ファイアウォールとネットワークの保護」をクリックする
  3. 「詳細設定」をクリックする。(下のほうにある)
  4. 「セキュリティが強化されたWindowsDefenderファイアウォール」が起動する
  5. ウィンドウ左側にある「受信の規則」を選択する
  6. 右側にある「新しい規則」を選択する
  7. 「ポート」を選ぶ
  8. 「TCP」 「特定のローカルポート 80」に設定する
  9. 「接続を許可する」に設定する
  10. この規則をいつ適用するか とりあえず プライベートのみにする
  11. この規則に名前を付ける 「HTTP」
    ファイアウォールでのポート80への許可は,解除の作業をするまで有効である。
3.2 ポートフォワーディング
  1. ポートフォワードの設定
    ホストPC(192.168.1.18)上のポート 80 でリッスンし,
    それを IPアドレス172.31.208.28 の WSLのポート 80 に接続するポートフォワーディング設定をする
    (ポート80はHTTP)
    PowerShell上で
    > netsh.exe interface portproxy add v4tov4 listenport=80 connectaddress=172.31.208.28

  2. ポートフォワーディング設定の確認
    PowerShell上で
    > netsh.exe interface portproxy show v4tov4
    ipv4 をリッスンする:         ipv4 に接続する:
    
    Address         Port        Address         Port
    --------------- ----------  --------------- ----------
    *               80          172.31.208.28   80
    
  3. ブート時にポートフォワーディング起動設定
    PowerShell上で

    > sc.exe config iphlpsvc start=auto

    この設定は1回行うと以降は有効になる
  4. ポートフォワーディングの動作開始
    PowerShell上で

    > sc.exe start iphlpsvc

    すでに動作中の場合は,その旨注意される。
以上の作業が終了すると,
apache2が動作しているPC以外のPCのブラウザからのアクセス
http://192.168.1.18
が可能になる。
apacheが動作しているPCのブラウザからも,アクセス
http://192.168.1.18
が可能になる。


〇ポートフォワーディング設定の解除
Apache2サーバを利用している場合はこのコマンドは使わない
PowerShell上で

> netsh.exe interface portproxy delete v4tov4 listenport=80

〇ブート時にポートフォワーディング起動設定解除
Apache2サーバを利用している場合はこのコマンドは使わない
PowerShell上で

> sc.exe config iphlpsvc start=disabled

★ Microsoftのwslのipアドレスの仕様で,PCが起動するたびに仮想側のipアドレスが変化してしまうので,PCの起動時に毎回ipアドレスの確認とポートフォワーディング設定作業が必要になる。(いずれは対処されると思われる。)
→対処方法はある。次の項目「4」参照

4.WSLのipアドレス問題(起動ごとに変わってしまう)の解決方法

外部PCからHTTPアクセス出来るようにするポートフォワーディングであるが,ApacheサーバPCが再起動するたびにWSLのipアドレスが変わってしまう。
この問題を解決するために。classAのipアドレスを固定(追加)で割りつけてしまうアイディアが公開されている。
https://www.kemasoft.net/?vm/wsl2%A4%CB%B8%C7%C4%EAIP%A4%C7ssh-server
これはSSH接続(port22)の話なので,参考にさせていただいて,HTTP接続(port80)の設定にすればよい。

次の内容のファイルxxxxxx.cmdを作って,利用時に動かす。
Ubuntuを立ち上げて固定アドレスを与え,apache2を立ち上げて,Windowsにも仮想側固定アドレスを与え,ポートフォワーディング設定をしてくれる。

ただし,次の2点に注意
  1. 3行目を利用中のubuntuディストリビューション名に書き換える必要がある。
    set WSL_DISTRIBUTION=Ubuntu → set WSL_DISTRIBUTION=[インストールしたubuntuディストリビューション名] (PowerShellで[ wsl -l -v ]を実行して確認,Ubuntu-22.04のような名前になっているかもしれない)
  2. このコマンドはPC起動後,1回だけ実行すればよい。2回目以降では,すでに動作中といった意味のエラーメッセージが表示されるが問題ない。

@echo off
cd /d %~dp0
set WSL_DISTRIBUTION=Ubuntu

@rem 管理者特権が必要なコマンドを実行し、エラーだったら 昇格再起動
openfiles > NUL 2>&1
if %ERRORLEVEL% EQU 0 goto :RunAsAdministrator
echo 〇 管理者権限に移行して再起動します。
echo 〇 EnterKeyを押し,ユーザアカウント制御画面で(はい)を選択してください。
pause >nul
powershell start-process %~nx0 -verb runas
exit

:RunAsAdministrator
@rem 管理者権限で実行
echo on
wsl -d %WSL_DISTRIBUTION% -u root ip addr add 10.255.255.16/24 broadcast 10.255.255.255 dev eth0 label eth0:1
wsl -d %WSL_DISTRIBUTION% -u root service apache2 start
netsh interface ip add address "vEthernet (WSL)" 10.255.255.88 255.255.255.0
netsh interface portproxy add v4tov4 listenport=80 connectaddress=10.255.255.16
sc.exe config iphlpsvc start=auto
sc.exe start iphlpsvc 2>&1 | find /v "1056" | find /v "既"
@echo off
echo.
echo 〇 apace2が起動し,エラー表示がなければ成功です。
echo 〇 EnterKeyを押してください。
pause >nul
exit
その結果次のような構成になる。