Amazon Web Services の Route53 でDDNS。


ピカ〜



※写真と本文は関係ありません。


客先のイントラ内にあるサーバ。
sshでメンテナンス出来るようにルータでポートフォワードしてある。
アクセスするIPアドレスは固定IPアドレス契約じゃないのでルータを再起動すると変わる。
今までは、Perl-CGIで作ったページにcronで定期的にアクセスして、IPを記録してた。(sshで繋げるだけなので不便じゃなかった。)
VPNでそのイントラネットに接続したい要望があったり、そうするとIPアドレスだけじゃ不便。
前からダイナミックDNSでDNSサーバに登録したいという気持ちがあったんだけど、運用中のDNSサーバにDDNSの設定を追加するのは怖いなぁと思ってたところ。

AWSのRoute53で登録出来たら便利だよなぁ。と調べると、登録スクリプトを公開してる人がいたのでやってみた。

example.co.jp を持っているDNSサーバで、kyoyu-kun.example.co.jp のサブドメインをroute53に移譲する設定を書く。
AWSで登録するホスト名は『hogehoge.kyoyu-kun.example.co.jp』という感じにしたいので、こんな感じ


; kyoyu-kun
kyoyu-kun IN NS ns-465.awsdns-58.com. 
kyoyu-kun IN NS ns-776.awsdns-33.net.
kyoyu-kun IN NS ns-1050.awsdns-03.org.
kyoyu-kun IN NS ns-1718.awsdns-22.co.uk.


kyoyu-kun.example.co.jp をRoute53にHosted Zone登録する。

でリモート側で定期的にRoute53に登録する仕掛けを。

http://www.improvisedscience.org/notes/Route_53_Dynamic_DNSこのあたりを参考に。まずAWSで公開してるdnscurl.pl を使えるようにする。
このあたりのパッケージが必要でした。(インストールしたOSはVine4.2からCent6のRedhat系のOS。)

  • perl-Digest-HMAC
  • perl-Digest-SHA1
  • curl
  • expat

bashのスクリプトを公開してる方がいらっしゃったので、ちょっと改造して使わせていただく。
xpath が必要だったのでXML::XPathをインストール。

修正したスクリプト。→ https://gist.github.com/furu-nob/4711578

xpath の-eオプション使えなかった。(ubuntu のxpathは-eオプションらしい。)スクリプト中の『2>/dev/null』をなくすとエラーが見えるのでデバッグしやすい。
あ、あとコマンドを『$ LANG=C route53DynDNS.bash』とコマンドラインを英語にしないと、日付が日本語で処理されてうまく動かないので注意!

タイムアウトするようであれば、dnscurl.pl のsub fetch_server_date の中の『”–max-time”, “5”,』を調整する。(30 くらいにしないとちゃんと動かないことがあった。原因はなんだろう。回線?そんなに大きなデータやりとりしてないよね。。参考にした情報→ https://forums.aws.amazon.com/message.jspa?messageID=291859

http://www.matt-helps.com/dnscurl-pl-lookup-timed-out-amazon-route53


sub fetch_server_date {
    my ($url) = @_;
#    my $curl_output_lines = run_cmd_read($CURL, "--progress-bar", "-I", "--max-time", "5", "--url", $url);
    my $curl_output_lines = run_cmd_read($CURL, "--progress-bar", "-I", "--max-time", "30", "--url", $url);
    for my $line (@$curl_output_lines) {
        if ($line =~ /^Date:\s+([[:print:]]+)/) {
            return $1;
        }
    }
    die "Could not find a Date header in server HEAD response: " . join(";", @$curl_output_lines);
}


こんな感じで帰ってくれば、登録成功。


Could not find A RR for hoge.kyoyu-kun.example.co.jp.
Creating initial record
Public IP address is: 218.47.21.11
Creating A record for hoge.kyoyu-kun.example.co.jp. to be 218.47.21.11
Got update status ID C2D7D41QNH6QMM with status PENDING
Pausing 40 seconds to allow for sync
Success!


正常な時の返事はこんな感じ。


Public IP address is: 218.47.21.11
Current A RR IP address is: 218.47.21.11
No need to update A record.


IP変更時はこんな返事。


Public IP address is: 218.47.21.13
A Record for hoge.kyoyu-kun.example.co.jp. is 218.47.21.11 with ttl: 600
Updating A record for hoge.kyoyu-kun.example.co.jp. to be 218.47.21.13 with ttl 600
Got update status ID C3FHALYY4B1VTU with status PENDING
Pausing 40 seconds to allow for sync
Success!


ちゃんと更新されてるかLogを取りたかったので、cron にこんなスクリプトを5分おきに動くように登録。


#!/bin/sh
LOG='/var/log/route53'
LANG='C'
echo '-------8<-------' >> $LOG
date >> $LOG
/root/scripts/route53/route53DynDNS.bash >> $LOG 2>&1


AWS料金は、DNSサーバへのクエリ回数で課金されるのでほとんど課金されないはず。

1ヶ月使うとこんな感じでした。(Queries なんて自分以外は使わないから誤差の範囲w。)


Amazon Route 53 $0.51
$0.50 per Hosted Zone for the first 25 Hosted Zones	 1 HostedZone	 0.50
$0.50 per 1,000,000 queries for the first 1 Billion queries	 213 Queries	 0.01


Windows サーバ同じことをしたいなら。
Route53 Dynamic DNS Windows GUI | Stepan Yakovlev’s Blog このあたりを参考に。
github からダウンロードする。

Service版とそうじゃないのがある。
私が試したのは『そうじゃない版』
※ .NET 4.0が必要なので要インストール。(Wondows 2000 Serverは.NET4.0 はインストール出来ないので使えない)
access key などを設定して、スタートアップで起動する設定にする。設定変更・停止はタスクバーの右の黒いアイコンから出来る。
引っかかったところは、登録しようとするレコードがないと更新されないので、あらかじめ適当なIPアドレスを登録しておくくらいかな。Route53のGUIから適当なIPアドレス(hogehoge.example.com 192.168.1.1)を登録しておく。

デフォルトだと600秒(5分)おきに更新実行するので、ログを見て更新されてるのを確認する。(とてもわかりにくいけど)
更新不要のときはログで『Bye monster.』とか言ってておもしろい。