MyDNS.JPのIP更新通知をRTX1200のLuaスクリプト機能で行う

YAMAHA RTX1200 からMyDNS.JPにIPを通知させる
非固定グローバルIP環境の場合、DynamicDNSサービスを使ってサーバを公開できますが、IPアドレスが非固定のため、定期的にIPが更新されたことをDynamicDNSサービスに通知してやらねばなりません。

DynamicDNSサービス MyDNS.JPでは、下記のIP更新通知の方法が4通りあり、YAMAHAのRTX1200でつかえるのはメールによる更新方法がつかえるので、これをLuaスクリプト機能により実現してみます。

  • MyDNS.JPへのIP更新通知の方法
    1. メール受信(というよりPOPアクセスを行えばよいので、POP before SMTPでも可能)
    2. FTPアクセス
    3. HTTPのBasic認証
    4. 直接IP指定


※サーバでIPの更新通知をしたい場合、DiCEというソフトウエアでツールで定期的に通知することもできます。
参考: DiCE DynamicDNS Client (自宅でインターネットサーバー)

前提

プロバイダ: YahooBB(モデム: Trio 3G plus)

使用するDynamicDNSサービス: MyDNS.JP

  • MyDNS.JPへのIP更新通知の方法
    1. メール受信(というよりPOPアクセスを行えばよいので、POP before SMTPでも可能)
    2. FTPアクセス
    3. HTTPのBasic認証
    4. 直接IP指定

RTX1200側の設定
HTTPアクセスはおそらくつかえないため(LuaSocketを組み込めばつかえると思いますがその辺はよく調べていないので...)、MyDNS.JPへのIP更新通知の方法は、メール通知機能のPOP before SMTPを使用して、POPアクセスで行います。

  • メール通知機能のPOP before SMTPを使用
  • Luaスクリプト機能
    • ログ監視
    • メール送信

Luaスクリプト

かなり適当ですが、Lua言語のライブラリ関数 を参考に、グローバルIPアドレスが取得できたタイミングで
MyDNS.JPに対してPOPアクセスを行うスクリプトを作成しました。

スクリプトの内容

  • IPアドレスの更新ログが出力されていないかを10分ごとにログ監視
  • 対象ログが見つかったら、MyDNS.JPのサーバへメール通知
    • ※POPアクセス後のメール送信はSMTPサーバが存在しないため失敗するはず
  • 念のためメール通知したことをログに残す
-- ### dhcpcevent.lua ###

-- mail params
mail_table = {
  smtp_address = "mail.mydns.jp",
  from = "hoge@mail.mydns.jp",
  to = "hoge@mail.mydns.jp",
  subject = "MyDNS.JP IpInfo Update from MAIL",
  pop_before_smtp = true,
  pop_address = "mail.mydns.jp",
  pop_protocol = "pop3",
  pop_auth_name = "mydns?????",  -- MyDNS.JPのユーザID
  pop_auth_password = "????????" -- MyDNS.JPのパスワード
}

-- monitoring eventlog pattern
PATTERN = "[DHCPC] Obtained (%d+%.%d+%.%d+%.%d+): LAN2 primary"

-- entry point (main)
while true do
  trn, str = rt.syslogwatch(PATTERN)
  if rtn > 0 and str then
    rt.mail(mail_table)
    rt.syslog("info", mail_table.subject)
  end

  rt.sleep(600)
end

POP before SMTPは有効にしておきます。

mail_table = {
:
  pop_before_smtp = true,
  pop_address = "mail.mydns.jp",
  pop_protocol = "pop3",
:
}

下記の部分には、MyDNS.JPの登録メールに記載されているユーザIDとパスワードを入力します。

  pop_auth_name = "mydns?????",  -- MyDNS.JPのユーザID
  pop_auth_password = "????????" -- MyDNS.JPのパスワード
}

下記のPATTERNに、グローバルIP取得時に出力されるログ文字列パターンを入力します。
(%d+%.%d+...)の部分は、数値文字列が.(ピリオド)3つで区切られるIPv4アドレスのパターンを示しています。

PATTERN = "[DHCPC] Obtained (%d+%.%d+%.%d+%.%d+): LAN2 primary"