これまで外部の Dynamic DNS サービスに頼っていたのですが、利用していたサービスに変更があったのをきっかけに自前の仕組みに置き換えました。今回は、その仕組みについて紹介します。
私の自宅では RTX1100 が上流ネットワークとの PPPoE 接続を行っており、 pp 1 インターフェイスが外側のアドレスを持っています。このインターフェイスのアドレスを、自分が Amazon Web Services の Route 53 上で管理するゾーンのAレコードとして登録します。
ちょっと面倒だったのが RTX1100 の外側 IP アドレスの取得をどうするか、です。最初は 「SNMP クライアントでつっつけば出てくるじゃろ?」と適当に snmpwalk してみたのですが、よくわからなかったので、結局 telnet で調べるローテクで実装しています。
使っているコードのうち自宅依存部分を取り除いたものを https://github.com/hasegaw/route53update に Push してあります。
この中には3つのファイルが含まれています。
- rtx1x00_show_status_pp_1.exp …… RTX1100 と telnet して IP アドレスを取得する
- route53update.py …… 取得したアドレスを R53 に反映する
- run.sh …… 実行方法
rtx1x00_show_status_pp_1.exp
RTX1100 に telnet して IP アドレスを取得します。このスクリプトは実際には RTX1100 と通信して、その内容を標準出力に書き出すまでです。実行には expect が必要です。引数としてホスト名とパスワードをとります。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ ./rtx1x00_show_status_pp_1.exp 192.168.XX.YY PASSWORD | |
Escape character is '^]'. | |
Password: ← スクリプトが自動的にログイン | |
RTX1100 | |
(snip) | |
Memory 32Mbytes, 3LAN, 1BRI | |
> show status pp 1 ← スクリプトが自動的に問い合わせコマンドを実行 | |
PP[01]: | |
Description: | |
Current PPPoE session status is Connected. | |
(snip) | |
PPP Cofigure Options | |
LCP Local: Magic-Number MRU, Remote: CHAP Magic-Number MRU | |
IPCP Local: IP-Address, Remote: IP-Address | |
PP IP Address Local: x.x.x.x, Remote: x.x.x.x | |
↑ルータからIPアドレスが送られてくる | |
CCP: None |
route53update.py
上記 Except スクリプトを実行し、ルータからの出力を実際にパースし、 Route 53 のレコード内容と比較してみて、必要なら反映するのがこちらのスクリプトです。ファイル内にいくつか設定項目があります。(レコード名、 ゾーン名、ルータのホスト名とパスワードなど)
おまけで Slack にも対応しています。
run.sh
route53update.py を実行する方法の例です。 AWS の API キーを設定しスクリプトを叩いています。手元ではこのスクリプトを cron に仕掛けています。
定期的にこのしくみが実行されることにより、Route 53 上の A レコードが常に自宅のルータに向くようになります。また、 Slack に新しい IP アドレスが通知されるため、ネットワークの不調に気づきやすかったり、などのメリットがあるかもしれません。