ヤマハRT系ルータのグローバルIPを取得してDDNSを更新するスクリプト

2019年4月8日

自宅ではYAMAHAのRTX1500を使用しており、netvolanteとは別にieserverのDDNSも使っています。(mxレコードのため)

プロバイダから固定のグローバルIPは付与されておりませんので、PPPoEのセッションが切れると新しいIPが付与されます。

IPが切り替わったタイミングでnetvolanteは更新されるので問題ないのですが、ieserverの方は手動で更新してあげる必要があります。

Linuxサーバ上でルータのグローバルIPをチェックして変更されていたらIP更新URLを叩くという昔に作ったスクリプトを共有したいと思います。

このスクリプトをcronに仕掛ければ定期的にチェックしてくれます。

実際に外部(ieserver)に通信を行うのはIPが変更された時のみですので、cronの間隔が短くてもieserverに迷惑はかかりません。

よかったら自分の環境に合わせてスクリプトを自己責任において自由にご利用下さい。

DDNS更新スクリプト

#!/bin/sh

# date
DATE=`date +'%F %T'`

# hostname
HOSTNAME=`hostname`

# basename
BASENAME=`basename $0`

# log
LOG='/var/log/update_ddns.log'

# Last getting external IP info file
INFO_EX_IP='/var/cache/upnpc/external_ip'

# DDNS Update URL
DDNS_UPDATE="http://ieserver.net/cgi-bin/dip.cgi"

# DDNS Account
ACCOUNT="your_account_name"
DOMAIN="your_ieserver_domain(ex. dip.jp,fam.cx, ...etc)"
PASSWORD="your_password"

# Get now ex-ip
NOW_EX_IP=`upnpc -u 'http://192.168.x.x:2869/rootDesc.xml' -s |egrep '^ExternalIPAddress = ([0-9]+\.){3}[0-9]+$' |cut -d' ' -f3`

if [ "${NOW_EX_IP}" = "" ]; then
        exit
fi

# Check ex-ip info
if [ -e $INFO_EX_IP ]; then
        LAST_EX_IP=`cat ${INFO_EX_IP}`

        if [ "${NOW_EX_IP}" = "${LAST_EX_IP}" ]; then
                exit
        fi
fi

# Update ddns
wget --tries=1 --timeout=180 -q -O /dev/null "${DDNS_UPDATE}?username=${ACCOUNT}&domain=${DOMAIN}&password=${PASSWORD}&updatehost=1" || exit 1

# Write now ex-ip to ex-ip info
echo "${NOW_EX_IP}" > $INFO_EX_IP
echo "${DATE} ${HOSTNAME} ${BASENAME} Update ddns ${LAST_EX_IP} > ${NOW_EX_IP}" >> $LOG
echo "${LAST_EX_IP} > ${NOW_EX_IP}" |mail -s "Updated DDNS IP address" your_mail_account@your_mail_domain

# Flush tcp metric cache
/sbin/ip tcp_metrics flush

使用条件

  • upnpcコマンドが使用できる必要があります
  • 下記のようにRT系ルータ側でUPnP機能がONになっており、UPnPでグローバルIPを参照するインターフェースが設定されている必要があります
upnp use on
upnp external address refer pp 1
  • LOG=で設定されたファイルに書き込み権限が必要です。デフォルトでは/var/log/update_ddns.logに設定されています
  • INFO_EX_IP=で設定されたファイルに読み書き権限が必要です。デフォルトでは/var/cache/upnpc/external_ipに設定されています
  • ACCOUNT=、DOMAIN=、PASSWORD=はieserverのIP更新に必要な情報を設定して下さい
  • NOW_EX_IP=を適宜改修すればUPnPが使用できる他のルータに対応できるかもしれません。また最近のRTXシリーズで返ってくる値が異なる場合は適宜改修して下さい
  • wgetのtries=とtimeout=オプションは使用環境で調節して下さい(cronの間隔も考慮して下さい)
  • wgetの行を改修すれば他のDDNSサービスに対応できるかもしれません
  • your_mail_account@your_mail_domainはIPが更新された際に通知されるメールアドレスを設定して下さい。必要なければ行をコメントアウトして下さい。またメールコマンドによってオプションが異なる場合があります
  • グローバルIPが変わるので最後でTCPのmetric情報のキャッシュを消しています。必要なければ行をコメントアウトして下さい
  • スクリプトの使用や改変は自由ですが、あくまで自己責任において使用してください
  • 二次配布はご遠慮下さい

まとめ

このスクリプトを必要としている方がどれだけいるのか分かりませんが、もしお役に立てたのであれば嬉しい限りです。

今後ともアカスブログを宜しくお願い致します。m(_ _)m