概要
このページは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);
}
}

