Yamaha RTX1100は安いながら結構高性能。
netvolante dnsというdynamic dnsが無料で利用できるので、利用している人もいるのではないかな。
しかしこのnetvolante-dnsに登録が出来なかった場合、家に帰るまでは家のIPが
分からない…という現象がこの間あったので、なんとかしたいなと思いました。
家のPCから定期的にどこか自分でログが確認できるWebにアクセスするとか、
メールを定期的にチェックさせておくとか、gmailを読むようにしておくとかで
外部からIPを調べることは可能ですが・・・
なにかないかなと思って調べていたらありました。
heartbeat Revision 2
これなんですが、実は生存確認をルーター同士で行う機能。
heartbeat 1は、discardポートを利用するのですが、このheartbeat revision 2は
ポート8512にUDPを送信しているので・・・このポートを監視するサーバー作れば
IPアドレス取れちゃうんじゃない?って思ったのです。
監視するためにはずっと監視するプログラムが必要です。これをデーモンって呼びます。
よくわからないphpで作ってみましたw
[root@www ~]# cat heartbeat2.php <?php require_once('Log.php'); require_once('System/Daemon.php'); error_reporting(E_ALL | E_STRICT); include('./simple_html_dom.php'); mb_internal_encoding("UTF-8"); mb_language("Japanese"); $logger = &Log::singleton('file', 'heartbeat2.log', 'heartbeat2', null, PEAR_LOG_DEBUG); $options = array( 'appName' => 'heartbeat2', 'appDescription' => 'Yamaha Heartbeat 2 Logger daemon', 'appDir' => dirname(__FILE__), 'usePEARLogInstance' => $logger, 'logVerbosity' => '7',); System_Daemon::setOptions($options); System_Daemon::start(); while (!System_Daemon::isDying()) { //echo "daemon running..."; $result = listenheartbeat(); if ($result != "") { $html=str_get_html($result); $ip = $html->find('address',0)->innertext; $name = $html->find('name',0)->innertext; $file = '/var/www/html/home.html'; //これはWebから確認するためのURL及びIP変更確認用一時ファイル兼用 $current = rtrim(file_get_contents($file),"\n"); //IPが変わったら通知する if ($current != $ip ) { $title = "$name のIPが $ip に変わりました"; $body = "新しいIPは $ip です"."\n\n" . "http://hogehoge(サーバー名)/home.html\n\n" . "旧IP: " . $current . "\n\n" . date("Y-m-d H:i:s"); // echo $body; file_put_contents($file, $ip); $title = mb_convert_encoding($title,"JIS"); $body = mb_convert_encoding($body,"JIS"); System_Daemon::info("$name: IP changed from $current to $ip"); if (!mb_send_mail("メアド@gmail.com(送信先)", $title, $body , "FROM: heartbeat@xxxxxxxxxxxxxxxxxxxx.com(FROMメールアドレス)")) { System_Daemon::warning("メールの送信が失敗しました。"); } else { System_Daemon::info("メールの送信が完了しました。"); } } } System_Daemon::iterate(1); } System_Daemon::stop(); function listenheartbeat() { $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_bind($socket, 'xxx.xxx.xxx.xxx(リッスンするIPアドレス)', 8512); $from = ''; $port = 0; socket_recvfrom($socket, $buf, 500, 0, $from, $port); return $buf; } ?> |
という感じに適当にデーモンを作って起動させる。
php ./heartbeat2.php
System_Daemon PEARモジュールがない場合は次のようにしてインストールする。
pear install System_Daemon
simple_html_domはここからダウンロード
次はYamahaの設定
heartbeat2 myname RTX1100(RTXの名前)
heartbeat2 transmit 101 auth testkey heartbeat2.phpが動いているサーバーのIPアドレス
heartbeat2 transmit interval 101 30
heartbeat2 transmit enable 101
こうすることによって、デーモンで動いているhearbeat2.phpの変数$nameにはmynameが入る。