VALUE-DOMAINのDDNSがHTTPS対応してた

新年あけましておめでとうございます。今年も頑張って生きます。

DDNSは動的なIPで自宅鯖を運用する身としてはとても助かる。(固定IPぐらい買えって思うけども。)
うちはValue-Domainを使っているのだけど、DDNSはHTTPのみでHTTPSが使えなかった。

ずっと疑問に思ってるけど、HTTPでこの手の情報をやり取りするのは不味くないの?みんななんでD○CEを使えるの?ってずっと思ってた。
外出先で間違えてWifi拾ってHTTPでDDNS更新が走ったら・・・って思うと少しでも安全な通信をしたいと思うわけです。

だからWWW::Mechanizeでこんなことやったりしてました。
value-domainのDDNS更新を使わずになるべく安全に更新したい - 日々量産
この後いろいろ手を加えたのだけど、debug用のprint文をコメントアウトすると動かなくなる事象が起きて頭抱えたのもいい思い出

ここから本題

休日で暇してたときに、ふとこれについてサポートに問い合わせてみようと思い問い合わせたら、対応はしているとのこと。

VALUE-DOMAINDDNSの使い方は ダイナミックDNS機能 | VALUE-DOMAIN ユーザーガイド を見てもらうとして、
HTTPS対応するには、DDNSのアクセス先に使うURLを https://www.value-domain.com/dyn/dyn.cgi に変えるだけ。
簡単ですね!もうあのゴミスクリプトを消してもいいんや!

教えてもらった後、ずうずうしくいろいろ聞いたところ、答えてもらえました。

  • このURLは教えちゃっても良い
  • https://www.value-domain.com/dyn/dyn.cgi?ip もサポートしてる
  • 正式に公開するときはURLが変わる可能性がある(それでもこのURLは使えるよう残しておくらしい)

やるやん・・・

以下、早速組み込んだメモ


動作イメージはcronでたたいて、標準出力は/var/log/message、標準エラー出力は多分cronでメールいきという感じ

# プログラム置く場所
mkdir ~/bin
chmod 0700 ~/bin
# 隠したい情報
mkdir ~/.secret
chmod 0700 ~/.secret

DDNS更新スクリプト。DOMAIN, PASSWORD, SUBDOMAINSは環境に合わせる。
PASSWORDはスクリプトに書きたくないので、別ファイルからcatして読み込む
SUBDOMAINSはスペース区切りで複数指定してもよい。(mydomain.localhost, www.mydomain.localhostのIPを更新するイメージ)

echo -n > ~/bin/ddns_updater.sh
chmod 0700 ~/bin/ddns_updater.sh
vi ~/bin/ddns_updater.sh
#!/bin/bash

set -ue

DOMAIN='mydomain.localhost'
PASSWORD=$(cat /home/ryozi/.secret/ddns_password)
SUBDOMAINS='@ www'

VD_URL='https://www.value-domain.com/dyn/dyn.cgi'

CURL_OPTS='-s'

IP=`curl $CURL_OPTS "${VD_URL}?ip"`

err=$?
if [ $err -ne 0 ]; then
        echo "Get IP failed. ($err)" 1>&2
        exit 1
fi

for SUBDOMAIN in $SUBDOMAINS; do
        response=`curl $CURL_OPTS "${VD_URL}?d=${DOMAIN}&p=${PASSWORD}&h=${SUBDOMAIN}&i=${IP}"`
        err=$?
        if [ $err -ne 0 ]; then
                echo "Update failed. (curl error=$err)" 1>&2
                exit 2
        fi

        response=`echo $response | tr '\r\n' ' '`
        if echo $response | grep "OK" >/dev/null; then
                # it's OK
                :
        else
                echo "Update failed. res=$response, subdomain=$SUBDOMAIN" 1>&2
                exit 3
        fi
done

echo "Update success. subdomains='$SUBDOMAINS' IP=$IP"

exit 0

パスワードは別ファイルで書いた。改行抜きで1行で書く。こういったパスワードの扱いはどうすれば良いんだろう。

echo -n | ~/.secret/ddns_password
chmod 0600 ~/.secret/ddns_password
vi ~/.secret/ddns_password

cron設定の追加。ログはloggerでsyslogまかせ。10分間隔で更新をかけに行く。

crontab << __EOF__
### DDNS UPDATE
*/10 * * * * /home/ryozi/bin/ddns_updater.sh | logger -t DDNS_UPDATE -p local0.info
__EOF__

おしまい。

IPチェックして無駄に更新しないとかしたほうが良いかも。