いわゆる宅鯖を運用していると、外からアクセスしたいこと、させたいことがよくある。
当然ながらその場合には自宅ルータのWAN側IPアドレスでアクセスするわけだが、悲しいかな庶民には固定のグローバルIPアドレスは所有できない。
つまりちょくちょく変わるんである。
そこでDDNSを使いますよね。
私が使っているDDNSは後述するとして、DDNSを使うには、IPアドレスが変わる都度、DDNSに伝えてやる必要がある。
しかしこの作業はいちいち手作業でやりたくない。
それで今回の記事。

DDNS何使ってますか

ちょっと前まではブロードバンドルータにおまけで付いてたりしたけど、最近なくなっちゃったよね。
私はここ使ってます。

おすすめ。

dynuにIPアドレスを通知するには

dynuにIP update protocolという説明があるのでそれを読む。
曰く、以下のようにすればよいと。

http://username:password@api.dynu.com/nic/update?myip=198.144.117.32&myipv6=2604:4400:a:8a::f4

ここで、パスワードはmd5ハッシュしたものでよい。
しがたって、必要なものはグローバルIPアドレスとハッシュ化されたパスワード。

わたしのグローバルIPアドレスはなんですか

結論
そういうサービスがあるから使う。
以下二つともシェルスクリプト等でIPアドレスを得られるので便利。

WTFisMyIPは愉快である。ぜひブラウザで覗いてみてほしい。
それはともかく、ifconfig.meを使う。
wget -qO - http://ifconfig.me/ipでIPアドレスが返る。

パスワードのハッシュを得る

これはmd5を使うだけ。

$ md5 -s hogehoge
MD5 ("hogehoge") = 329435e5e66be809a656af105f42401e

シェルスクリプトに

#!/bin/sh

GETIP='http://ifconfig.me/ip'
MYHASH='329435e5e66be809a656af105f42401e'

WGET='/usr/local/bin/wget'
WGET_OPT='-qO -'

echo 'Getting my IP address...'
MYIP=`${WGET} ${WGET_OPT} ${GETIP}`
echo "My IP address is ${MYIP}"

URL="http://api.dynu.com/nic/update?myip=${MYIP}&username=user&password=${MYHASH}"

# echo ${URL}

echo "Registering my IP address to DDNS service..."
${WGET} ${WGET_OPT} ${URL}
echo
echo 'Done.'

実行結果
IPアドレスが変わった瞬間の結果を記録し忘れた。

$ dyn.sh
Getting my IP address...
My IP address is 198.144.117.32
Registering my IP address to DDNS service...
nochg
Done.

あとはこれをcronでもなんでも仕込めばよい。

FreeBSDのみなさま用。periodicファイル

以下のファイルを/usr/local/etc/periodic/dailyに置いて、毎日、実行させている。
cronでもいいんだけど、cronは目に付きにくくて、バックアップなどを忘れてしまうから。
よければどうぞ。

#!/bin/sh


GETIP='http://ifconfig.me/ip'
MYHASH='329435e5e66be809a656af105f42401e'

WGET='/usr/local/bin/wget'
WGET_OPT='-qO -'


rc=0
if [ -x $WGET ]; then
        echo 'Getting my IP address...'
        MYIP=`${WGET} ${WGET_OPT} ${GETIP}`
        echo "My IP address is ${MYIP}"
        URL="http://api.dynu.com/nic/update?myip=${MYIP}&username=user&password=${MYHASH}"
        echo "Registering my IP address to DDNS service..."
        ${WGET} ${WGET_OPT} ${URL}
        echo
        echo 'Done.'
else
        echo "${WGET} is not installed and I gave up."
        rc=2
fi

exit "$rc"

以上