2015年9月11日金曜日

ddclient 用 IP チェックを内部化

IP 電話用にダイナミック DNS のサービスを使用していましたが、WAN 側の IP アドレスを調べて更新する ddclient 用の IP チェック機能を外部の IP チェックサイトの利用を終了して、自宅サーバで行うように変更しました。

背景

昨日から IP 電話が通じなくなり、どうしたものかと調べてみると、IP アドレスが変更になったにも係わらず、ダイナミック DNS の IP アドレスへ変更されず、以前のままとなっていることが判明しました。

IP 電話が使用できない症状は、(1)着信できない (2)発信することはできるが、相手が出た途端、無音通話となってしまう ・・・といった、我が家の IP アドレスが IP 電話サーバへ正しく伝わっていないときに発生する現象でした。

ダイナミック DNS の登録情報を更新する ddclient などを調べてみましたが異常はありませんでした。ようやく発見したのは ddclient が使用する IP チェック用のウェブサイトが閉鎖となっていました(涙)。

IP チェック用のスクリプトを配置してページへアクセスすると・・・

ちょうど一年ほど前にダイナミック DNS の IP チェック用に使用していた DynDns のサーバが不調だと記事にしていました。その時から私が契約しているプロバイダのニフティのホームページ上に cgi スクリプトを配置して、この cgi スクリプトを呼び出すことでチェックを行なっていました。今回このニフティのホームページサービスが終了してしまったようです。
dyn の IP チェックサイトが危ない?んですけど
http://near-unix.blogspot.jp/2014/08/dyn-ip.html

元々 2000 年前後から同社の無料ホームページサービスを利用していましたが、確か 2005 年ごろを最後にずっと使用することがなくなっていました。ようやく昨年 IP チェックのためにスクリプトを配置して再度利用を開始していたところ、上記の通り閉鎖となっていました。元々古い仕様のホームページ・サービスであったこともあり、廃止されてしまった模様です。しかし何故か FTP でログオンを試みると、所定のサーバは存在しており、ホームページのデータも残っている状態でした。なおニフティの方からは通知のような案内はありませんでした(プンプン)。

そこで ddclient 用に IP チェックが必要だということになり、以前作りかけだったスクリプトを完成させて、我が家で IP チェックの運用を開始したわけです。

IP チェック・スクリプト

上記の記事の中で紹介したシェルスクリプトを使用して完成させました。

動作原理は NTT 西日本がサービスしているフレッツ光ネクスト隼用にレンタルされているホームゲートウェイの PR-400NE のステータス画面を読み出し、その中から WAN ポートへ割り当てられている IP アドレスを読み出します。この IP アドレスを自宅サーバ内のウェブサーバへ IP アドレス情報として静的ページとして保管します。この IP アドレス情報のページを ddclient が読み出すことによって WAN 側の IP アドレスを通知する手法です。この PR-400NE のステータス画面を読み出して IP アドレス情報として書きだすスクリプトを 5 分ごとに crontab で処理させて、IP アドレス情報を更新させます。

シェルスクリプト紹介(ipcheck.sh)

#!/bin/sh

cd /usr/local/www/data/ipcheck/

/usr/local/bin/wget --http-user user --http-passwd PASSWORD -N http://192.168.1.1/index.cgi/info2_main

/usr/bin/egrep -o '[0-9]+(\.[0-9]+){3}' info2_main | sed -n '1p' > my-ip.html

上記のシェルスクリプトを ipcheck.shとして保管した後、ファイルの属性を 755 に変更しておきます。
$ chmod 755 ipcheck.sh

シェルスクリプトの解説

自宅サーバは FreeBSD 9.3 で動作しています。そしてウェブサーバに Apache 2.4 系がインストールされています。Linux サーバでも同様に動作するものと思われます。そしてウェブサーバも静的なホームページが表示できるものであればどのウェブサーバでも問題ありません。

1. 作業ディレクトリへ移動します。
cd /usr/local/www/data/ipcheck/
我が家のウェブサーバは歴史的背景からずっと /usr/local/www/data の中にホームページのデータを保管しており、ここの内容を Apache が読みだして表示させています。その中のサブ・ディレクトリに ipcheck というディレクトリを作成して、その中にシェルスクリプトを配置して、動作させています。

2. PR-400NE のステータス画面の読み出し
/usr/local/bin/wget --http-user user --http-passwd PASSWORD -N http://192.168.1.1/index.cgi/info2_main
wget を使用してユーザ名とパスワードを設定してステータス画面(info2_main)を読みだして、"info2_main" の名前で作業ディレクトリ内へ保管します。 この行にある IP アドレスの "192.168.1.1" は PR-400NE の LAN 側の IP アドレスです。なお wget コマンドの "-N" オプションはダウンロードしたページを上書き保存するものです。

3. IP アドレス情報の切り出し
/usr/bin/egrep -o '[0-9]+(\.[0-9]+){3}' info2_main | sed -n '1p' > my-ip.html
egrep や sed などを利用して IP アドレスのみを抽出します。そして "my-ip.html" という名前のページへ保管します。

手動で動作確認をしてみる場合

正しく動作するか手動でシェルスクリプトを動作させて確認します。
$ ./ipcheck.sh
--2015-09-11 15:50:00--  http://192.168.1.1/index.cgi/info2_main
Connecting to 192.168.1.1:80... connected.
HTTP request sent, awaiting response... 401 Unauthorized
Authentication selected: Basic realm="USER-NAME:user"
Connecting to 192.168.1.1:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 25162 (25K) [text/html]
Last-modified header missing -- time-stamps turned off.
--2015-09-11 15:50:01--  http://192.168.1.1/index.cgi/info2_main
Connecting to 192.168.1.1:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 25162 (25K) [text/html]
Saving to: 'info2_main'

     0K .......... .......... ....       100% 3.95M=0.006s

2015-09-11 15:50:04 (3.95 MB/s) - 'info2_main' saved [25162/25162]


一度でもこのシェルスクリプトを動作させると次の三つのファイルができます。
ipcheck.sh (シェルスクリプト本体)
info2_main (PR-400NE のステータス画面のソースコード)
my-ip.html (IP アドレス情報)

crontab で更新

crontab コマンドで ipcheck.sh を定期的に動作させます。
$ crontab -e
*/5 * * * * /usr/local/www/data/ipcheck/ipcheck.sh > /dev/null 2>&1

最後尾の " > /dev/null 2>&1" の部分はログ出力を抑制するものです。これが無いと、 5 分ごとに ipcheck.sh が動作するたびに、内部メールとして wget が PR-400NE のステータス画面をダウンロードする様子が送られてきます。

ddclient.conf の修正

ダイナミック DNS の IP 情報を更新する ddclient の設定ファイル(ddclient.conf)を修正します。
# use=web, web=checkip.dyndns.com
use=web, web=localhost/ipcheck/my-ip.html
そして ddclient を再起動させます。
# /usr/local/etc/rc.d/ddclient restart

動作確認

WAN 側の IP アドレスを変化させるために PR-400NE の再起動などを行います。WAN 側の IP アドレス情報が変更となり、契約しているダイナミック DNS の IP 情報が更新されれば成功です。

以上で我が家のダイナミック DNS 用の IP チェック機能ができました。今までのように外部サーバの動作状況に影響されずに IP チェックが出来るようになりました。

[ 追記:ddclient.conf の設定見直し ] 2015-09-21

ddclient の設定を見直しました。次の記事を参照してください。
FreeBSD ddclient の設定見直し
http://near-unix.blogspot.jp/2015/09/freebsd-ddclient.html

0 件のコメント:

コメントを投稿