IPv6のDDNS更新用Luaスクリプト

ヤマハルーターのIPv6

フレッツ光でIPoEを使ったIPv6環境で、IPv6アドレスをDDNSを使って名前解決させるLuaスクリプトです。

フレッツ光ではv6オプションのネーム機能でNGN内では名前解決はできます。ただ配布されるIPv6アドレスが半固定の為にIPv6アドレスが変更になる可能性があります。v6オプションのネーム機能はIPv6アドレスとホスト名を固定的に指定することになるので、IPv6アドレスが変更になった場合に自動的には切り替わりません。またインターネット上では、このv6オプションのネーム機能のホストへはアクセスできないので、今回のLuaスクリプトでIPv6アドレスを名前解決できるようにしてみました。

環境

  • DDNSは無料のMyDNSを利用しています
  • DDNSへの更新はLuaスクリプトのの中でMyDNSのHTTPアドレスにアクセスしてIPv6アドレスの通知を行っています
  • DDNSへの更新は、ヤマハルーターのscheduleコマンドを使って実行します
  • 今回実行したインターネット環境は、フレッツ光ネクストで@nifty、IPv6はIPoE、IPv4はV6プラスを利用した環境でした
  • ルータはヤマハのRTX830またはRTX810で実行しました

なおIPv6でインターネット接続できない環境(NGN内だけで有効なIPv6アドレス(2001:から始まるIPv6アドレス)の場合は、MyDNSでIPv6アドレスを更新してもNGN内では使えないものと思われます。

DDNS更新用のLuaスクリプト

下記Luaスクリプトは、console characteren.asciiの場合にのみ動作します。コンソールを日本語表示するためのsjisutf8を指定している場合は正しくIPv6アドレスを取得できず失敗すると思われます。

このLuaスクリプトは実行すると実行直後に1回だけMyDNSにIPv6アドレスを通知します。

--MyDNS のDDNS更新するための基本情報
interface = "lan2"  -- IPv6のアドレスを割り当てられているインターフェース
mydns_user = "##########"   --MyDNSのユーザーID
mydns_pwd = "**********"    -- MyDNSのパスワード


------------------------------------------------------------
-- IPv6アドレスの取得する関数 --
------------------------------------------------------------
function get_ipv6_adr()
    local ipv6adr, s0, s1, e, rtn, str

    rtn,str=rt.command("show ipv6 address " .. interface)
    s0,s1=str:find("global%s+",0)
    s2=str:find("%x+",s1)
    e=str:find("%/",s2)
    ipv6adr=str:sub(s2,e-1)

    return ipv6adr
end

------------------------------------------------------------
-- syslog出力関数 --
------------------------------------------------------------
function output_syslog(msg)
    rt.syslog("info", "[LUA] ddns-update.lua DDNS " .. msg)
end

------------------------------------------------------------
-- DDNS Update関数 --
------------------------------------------------------------
function update_ddns(ipv6adr)
    template="http://ipv6.mydns.jp/directip.html\?MID=%s&PWD=%s&IPV6ADDR=%s"

    req = {
        url = template:format(mydns_user, mydns_pwd, ipv6adr),
        method = "GET"
    }

    res=rt.httprequest(req)

    if (res.rtn1) then
        output_syslog("Update success for IPv6:" .. ipv6adr)
    else
        output_syslog("Update failed:" .. tostring(res.err) .. "\nurl:" .. req.url)
    end
end

------------------------------------------------------------
-- メイン --
------------------------------------------------------------
update_ddns(get_ipv6_adr())

Luaスクリプトの実行をスケジュール

ヤマハルータにddns_update.luaという名前でファイルを保存しているものとし、そのLuaスクリプトを毎時5分(00:05、01:05…、23:05)に実行されるようにスケジュールしています。

# schedule at 1 */* *:*:05 * lua ddns_update.lua