いわゆる宅鯖を運用していると、外からアクセスしたいこと、させたいことがよくある。
当然ながらその場合には自宅ルータの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"
以上