概要
このページはvpnとddnsを使用してリモートアクセス環境を構築の「6.httpサーバーからマジックパケット送信(断念)」です。
ローカルエリア内に構築したWebサーバーからマジックパケット送信を行えるようにします。
「5.iPadからopenVPNサーバーにアクセスする」はこちら
「7.Android端末にアクセス環境を設定」はこちら
構築を途中で断念
Webサーバー構築、PHPのインストールまでは出来ましたが、マジックパケット送信をhttpdから行うところが出来ずに断念しました。1日くらい頑張ったのですが知識が足らず無理だったので、途中までトライした内容を記録しておきます。
必要な準備
[1]サーバーにapacheをインストール
今回はVPNを構築しているサーバー上に構築しますが、firewallで外部からのアクセスは出来ない構成とします。基本的なインストールと設定は別サイトにて詳細に解説されていたので、SElinux周りの設定のみに絞って説明します。
[2]サーバーにPHPをインストール
マジックパケット送信を行うためにPHPもインストールします。基本的なインストール手順は別サイトでの説明に譲ります。
[3]マジックパケット送信受付用サイトの作成
pingでの死活確認と、マジックパケット送信をWebサイトから行えるように構築します。ここで断念しました。
Apacheをインストール
基本的には下記サイトを参考にしました。SElinuxを有効にしている場合に注意点があるのでそこだけ説明します。
参考サイト
CentOS 8へApacheをインストールしてウェブサーバーを最短で構築する
注意点
SElinux有効状態の場合、参考サイトに沿ってインストール・設定を行い、テストページを作成してもブラウザからはHTTP403エラーが発生します。この理由としてはルートディレクトリをデフォルトの場所から
/home/www/html
に変更しているため、正しいラベルが付いていないことにあります。そこでルートディレクトリとCGI用ディレクトリに正しいラベルを付けます。
[root@host ~]# semanage fcontext -a -t httpd_sys_content_t /home/www/html [root@host ~]# restorecon -v /home/www/html [root@host ~]# semanage fcontext -a -t httpd_sys_script_exec_t /home/www/cgi-bin [root@host ~]# restorecon -v /home/www/cgi-bin
実行後にラベルを確認すると変更されているはずです。
[root@host ~]# ls -Zd /home/www/html unconfined_u:object_r:httpd_sys_content_t:s0 /home/www/html [root@host ~]# ls -Zd /home/www/cgi-bin/ unconfined_u:object_r:httpd_sys_script_exec_t:s0 /home/www/cgi-bin/
PHPのインストール
PHPのインストールは下記サイトの手順で行います。
CentOS8.0のPHP7.2をインストールする手順を【コマンド付き】で丁寧に解説
で、この手順通り行って動作確認しましたが、503エラーが出て動作しませんでした。そこで参考にしたのが次のサイトです。
fedora 30 PHP7が503エラー「Service Unavailable」→ /etc/httpd/conf.modules.d/00-mpm.conf を編集して解消
ここに記載がある通り、"00-mem.conf"を編集します。
[root@host ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf
編集前
# Select the MPM module which should be used by uncommenting exactly # one of the following LoadModule lines. See the httpd.conf(5) man # page for more information on changing the MPM. # prefork MPM: Implements a non-threaded, pre-forking web server # See: http://httpd.apache.org/docs/2.4/mod/prefork.html # # NOTE: If enabling prefork, the httpd_graceful_shutdown SELinux # boolean should be enabled, to allow graceful stop/shutdown. # #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server # See: http://httpd.apache.org/docs/2.4/mod/worker.html # #LoadModule mpm_worker_module modules/mod_mpm_worker.so # event MPM: A variant of the worker MPM with the goal of consuming # threads only for connections with active processing # See: http://httpd.apache.org/docs/2.4/mod/event.html # LoadModule mpm_event_module modules/mod_mpm_event.so
編集後
# Select the MPM module which should be used by uncommenting exactly # one of the following LoadModule lines. See the httpd.conf(5) man # page for more information on changing the MPM. # prefork MPM: Implements a non-threaded, pre-forking web server # See: http://httpd.apache.org/docs/2.4/mod/prefork.html # # NOTE: If enabling prefork, the httpd_graceful_shutdown SELinux # boolean should be enabled, to allow graceful stop/shutdown. # LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server # See: http://httpd.apache.org/docs/2.4/mod/worker.html # #LoadModule mpm_worker_module modules/mod_mpm_worker.so # event MPM: A variant of the worker MPM with the goal of consuming # threads only for connections with active processing # See: http://httpd.apache.org/docs/2.4/mod/event.html # #LoadModule mpm_event_module modules/mod_mpm_event.so
これで無事に動くようになりました。(何の変更か知らんけど)
死活確認機能の実装
参考サイト
死活確認はpingで行います。
/* Ping送信プログラム */ define('PING_OPTION', [ 'Linux' => '-c', // linux 'Darwin' => '-c', // macOS 'WINNT' => '-n', // windows ]); function ping($host, $count = 1){ $option = PING_OPTION[PHP_OS]; exec("ping {$option} {$count} {$host}", $output, $result); //exec("/bin/ping -c 2 192.168.xyz.10", $output, $result); if ($result) { echo 'ping 失敗', PHP_EOL; echo implode(PHP_EOL, $output); } else { echo 'ping 成功', PHP_EOL; } //return compact('result', 'output'); return ($result); }
で、これを実行してみますが、疎通しているはずなのに"$result=2"となって失敗します。原因はいつも通りSElinuxということまでわかりました。設定をこねくりまわしたりしましたが今回はSElinuxを有効にしたままでは対処法が分からずあきらめました。
マジックパケット送信機能の実装
参考サイト
実際に動かしてみた結果
実際に下記スクリプトで動かしてみましたが無理でした。今回はSElinuxをPermissiveにしてもダメで、pingが動かないことでモチベーションを失っていたため早々にあきらめました。
//WakeOnLanプログラム function wakeOnLan($macAddr, $ipAddr) { // makeMagicPacket $magicPacket = ""; for ($i=0; $i<6; $i++) { $magicPacket.= chr(0xff); } $aryMacAddr = explode(":", $macAddr, 6); $buffer = pack("H*H*H*H*H*H*", $aryMacAddr[0], $aryMacAddr[1], $aryMacAddr[2], $aryMacAddr[3], $aryMacAddr[4], $aryMacAddr[5]); for ($i=0; $i<16; $i++) { $magicPacket.= $buffer; } // makeBroadCastAddr $aryIpAddr = explode(".", $ipAddr, 4); if ($aryIpAddr[0] < 127) { $aryIpAddr[1] = "255"; } if ($aryIpAddr[0] < 191) { $aryIpAddr[2] = "255"; } if ($aryIpAddr[0] < 223) { $aryIpAddr[3] = "255"; } $broadCastAddr = join(".", $aryIpAddr); // send $fp = fsockopen("udp://".$broadCastAddr, 2304, $errno, $errstr); if (!$fp) { print("ERROR: $errno - $errstr\n"); } else { fwrite($fp, $magicPacket); fwrite($fp, $magicPacket); fclose($fp); } }