続、自分でDDNSを実現化(ルータログ)
過去に「自分でDDNSを実現化(サブドメインの活用)」という内容を書いていましたが、今回は別のアプローチで書いてみます。 ●事前準備 当サイトの「ルータのログを取得」を設定しておく必要があります。 ●最初に ルータからログを得る事により、割り当てられている hostname もしくは IPアドレスがわかります。 それを利用してわかりやすい名前を付けて、安定したサービスを実現しようと考えています。 自宅VPNやデータ収集先としても、自分でつけた名前なら扱いやすいでしょう。 ★ちなみにこの方法を取ると正引きは対応できますが、逆引きは対応できないので注意してください★ ●使用プログラム OS:AlmaLinux 9.3 bind 9.16.23 PHP 8.2.14.1 ●ネームサーバの設定 DDNSを実現する為には、動的IPアドレスを変更するたびにゾーンファイルに書き込む必要があります。 しかし、そのためにファイルを開いたり更新したりすることは手順が多すぎて実用的ではありません。 そこで、『 nsupdate 』というコマンドを使います。 nsupdate が受け付けられるように、ネームサーバを設定します。 named.conf の編集 # cd /etc # vi named.conf 正引き部分に設定を追加します。 【変更前】 zone "usi.nu" { type master; file "seibiki.zone"; }; 【変更後】 zone "usi.nu" { type master; file "seibiki.zone"; allow-update { 133.18.168.21; 127.0.0.1; }; <-- 追加 }; 再起動します # systemctl restart named これでネームサーバの方は準備完了です。 ●データファイルの保存 nsupdate を利用するのですが、コマンドをいちいち送らなくてもファイル化しておけば一挙に登録できます。 今回は、ファイルを利用する方法で行います。 ・保存場所 保存場所は、「 /usr/local/share/ddns 」という場所を作成します。 # cd /usr/local/share # mkdir ddns drwxr-xr-x 1 root root 43 1月 10 ddns ・チェックプログラムを作成 作成プログラムのフローチャート 1:URLをつけるフルドメイン名の設定 2:ログファイル名(router)を指定 3:今日の日付を確認(hi) 4:9日より以前か以後かを確認。スペースの個数を調整 5:URLの現在の IPアドレスを取得(ipnow) 6:ログファイルの最終行を取得(endline) 7:endlineをスペースで区切る 8:ログファイルからの IPアドレスを取得(iplog) 9:ipnow と iplog を比べて一致するかどうか確認する 10:不一致の場合は更新用ファイルを作成する 11:nsupdate を実行する 12:格納用ファイルを作成 13:9行目で一致した場合は何もせず終了する。 change_ddns.php の編集 # cd /root # vi change_ddns.php <?php /* Make DDNS ipaddres to URL. sins 2024-01-10 Ver1.0 Make by usi. */ $url='ddns.usi.nu'; $dnsserver='dns.usi.nu'; $logf='router'; $putlog='/var/log/' . $logf; // 日付の桁数確認 date_default_timezone_set('Asia/Tokyo'); $date = new DateTime(); $hi=$date->format('d'); if ($hi>9) { $sp=3; } else { $sp=4; } //echo "sp=" . $sp . "\n"; // 現在のURLのIP addressを確認 $ipnow_o=gethostbynamel($url); $ipnow=$ipnow_o[0]; //echo "ipnow=" . $ipnow . "\n"; // log最終行のURLを取得し、IP addressを確認 $logdata = file($putlog, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $endline=array_pop($logdata); //echo $endline . "\n"; $iplog_g=explode(' ',$endline); $iplog_o=gethostbynamel($iplog_g[$sp]); $iplog=$iplog_o[0]; //echo $iplog . "\n"; //IPアドレス一致判定 if ($ipnow!=$iplog) { //IPアドレス更新用ファイル $file = '/usr/local/share/ddns/dns2rev.txt'; //IPアドレス格納用 $ipfile = '/usr/local/share/ddns/ipaddr.txt'; // アドレス不一致 //書き込むファイルの文字列とIPアドレス $str = "server " . $dnsserver . "\n"; $str = $str."update delete " . $url . ". IN A\n\n"; $str = $str."update add " . $url . ". 10080 IN A ".$iplog."\n\n"; //ファイルを書き込む file_put_contents($file, $str, LOCK_EX); //nsupdateの実行 $ex="nsupdate ".$file; exec($ex); //IP格納用更新 file_put_contents($ipfile, $iplog, LOCK_EX); } else { // echo "IPアドレスは一致しました。\n"; } ?> 「//」を外すと途中経過の値を表示します。見たい値がある場合は、外して確認してください。 ●動作確認 php で動きますので、動作確認をしてみます。 # php change_ddns.php # 一行空けて終了します。 実際に動作したかどうか確認してみましょう。 # ls -l /usr/local/share/ddns 合計 8 -rw-r--r-- 1 root root 15 1月 10 09:48 ipaddr.txt -rw-r--r-- 1 root root 139 1月 10 09:48 dns2rev.txt ファイルが2つできています。
ipaddr.txt | 最新のIPアドレス |
dns2rev.txt | nsupdateで使うファイルです |
Let's PC の Topに戻る
ホームページのTopに戻る