グローバルIPアドレスが変化したらDNSの正引き逆引きを更新するシェルスクリプト

  • 投稿日:
  • by
  • カテゴリ:

グローバルIPアドレスが変化したらnamedの設定ファイルを更新するシェルスクリプトを書いてみた。perlで書くか迷ったが、そんなに複雑な文字列操作がないので、sedとawkで踏ん張ってみた。

注記)DynamicDns.com(=Oracle)のサービスは、子ドメインの委譲ではなく、DynamicDnsに正引きをした結果を当家のGlobal IPに誘導されるだけで、実際に自宅鯖のbindにqueryが発生する訳では無い。したがってこの企てはまったくむいみなのだが、実験してみる。

さて、環境は

FreeBSD 12.1-RELEASE r354233 GENERIC arm64

BIND 9.16.4 (Stable Release)

が動いているmailサーバー。DNSも内と外のqueryに答える。(ルータで53 tcp/udp開放)

ということでスクリプト本体;

#!/bin/sh

CURIP=`curl -s globalip.me`
PREVIPFILE="/tmp/CurrentGlobalIP"

# echo "Current Global IP Address is ${CURIP}"

if [ -f $PREVIPFILE ]; then
# echo "Previus file exist"
else
echo "Previus File is not found ..."
echo "Create New File $PREVIPFILE"
echo $CURIP > $PREVIPFILE
fi

PREVIPADDR=`cat $PREVIPFILE`

# echo "---$CURIP---$PREVIPADDR---"

if [ $CURIP = $PREVIPADDR ]; then
# echo "Gloval IP address is not changed, Exiting the process ... "
exit 0
else
echo "IP Address was changed, Process will be starting ..."
fi

REV=`echo "$CURIP" | awk '{split($0,a,"."); print a[4]"."a[3]"."a[2]"."a[1]".in-addr.arpa" }'`

# echo "$REV"

CONFDIR="/usr/local/etc/namedb/"
CONFORG="named.conf.org"
CONFNEW="named.conf"
ZONEORG="master/for-the-biz_zone.org"
ZONENEW="master/for-the-biz_zone"
SERIALNO=`date '+%y%m%d%H'`
NAMEDPID=`ps -ax|grep named|grep -v grep|awk '{print $1}'`

cat $CONFDIR$CONFORG | sed "s/inaddrarpa/$REV/" > $CONFDIR$CONFNEW
cat $CONFDIR$ZONEORG | sed -e "s/serialnumber/$SERIALNO/" -e "s/globalipaddr/$CURIP/" > $CONFDIR$ZONENEW
kill -HUP $NAMEDPID

# echo "---------------------------------------------"
# echo "$SERIALNO --- $CURIP"
# echo "$NAMEDPID"
exit 0

コメントアウトしてあるechoの行(# echo)は、スクリプトを書いていく際に変数の状態を確認するために挿入した行。思い通りに動かなくなったら、#を外して、変数を観測する。

FreeBSDからLinux(Debian等)に移植する際、変更が必要そうなところは、

  • bindのファイル群の位置(/usr/local/etc/namedb/ -> /etc/bind/
  • namedのプロセス名(named -> bind
  • named.conf の構造(named.conf -> named.conf.local
  • プロセスの採取方法(ps -ax -> ps -ef

辺りを変更すれば使えると思う。(近々、多分そうなる。)

named.conf.orgの動的に変える部分、赤字部をsedで書き換える;

zone "match.for-the.biz" {
type master;
file "/usr/local/etc/namedb/master/for-the-biz_zone";
};

zone "inaddrarpa" {
type master;
file "/usr/local/etc/namedb/master/for-the-biz.rev";
};

for-the.biz_zone.orgの動的に変える部分、赤字部をsedで書き換える;

ORIGIN .
$TTL 100
match.for-the.biz IN SOA root.match.for-the.biz. root.localhost. (
serialnumber ;
600 ; refresh
600 ; retry
3600 ; expire
600 ; minimum (1 day)
)
NS localhost.
NS ns4.dyndns.org.
NS ns1.dyndns.org.
NS ns3.dyndns.org.
NS ns5.dyndns.org.
$ORIGIN match.for-the.biz
@ IN TXT "v=spf1 a:match.for-the.biz ~all"
@ A globalipaddr
IN MX 10 match.for-the.biz.
IN MX 50 pi.homelinux.net.

てな感じ。

最後に/etc/crontabに下記の行を挿入して、crondを再起動すればOK。プログラムは/root/checkip.shとした。流儀では/usr/local/bin辺りに置くのが正しいのでしょうけれども。

*/10 * * * * root /root/checkip.sh

10分に一度はちょっと頻繫かも知れない。