Tag Archives: YAMAHA

RTX1200でDHCPとDDNS

自宅のネットワークの上流にはRTX1200が居るのですが,DHCPサーバや,静的なレコードを登録できるDNSサーバになれるので,DHCPサーバとかDNSサーバを別途立てるのはめんどくさいけど,或る程度細かく設定したいという場合に大変便利です.

しかし,DHCPとDNSが互いに連携していないので,DHCPで配布したアドレスをホスト名で名前解決をすることはできません.

そこで,LuaスクリプトでSYSLOGを監視し,DHCPでIPの払い出しを行ったら,show status dhcp summaryからホスト名を検索し,静的DNSレコードを自動で登録するようにしてみました.

公式のサンプルのおかげで初めてでもあっという間にできました.

--[[

  ●DHCPによるDDNS
  DHCPDのSYSLOGを監視し、検出したら当該のホスト名とIPアドレス対を
  静的DNSレコードとして登録

]]

--------------------------##  設定値  ##--------------------------------

-- 検出したい SYSLOG の文字列パターン
ptn = "%[DHCPD%]"

-- MACアドレス検出の文字列パターン
ip_ptn = "%d+%.%d+%.%d+%.%d+"
mac_ptn = "%x%x:%x%x:%x%x:%x%x:%x%x:%x%x"
base_dn = "hogehoge.local"

-- 出力する SYSLOG のレベル (info, debug, notice)
log_level = "info"        -- ★

------------------------------------------------------------
-- ホスト名検索                                             --
------------------------------------------------------------
function search_host_by_mac(mac)

        rtn, str = rt.command("show status dhcp summary")
        ipaddr, host = string.match(str, "("..ip_ptn.."):%s+"..mac..",%s+([%a%w%p]+)")

        return ipaddr, host
end

function search_host_by_ip(ipaddr)

        rtn, str = rt.command("show status dhcp summary")
        host = string.match(str, ipaddr..":%s+([%a%w%p]+)")

        return ipaddr, host
end

------------------------------------------------------------
-- メインルーチン                                         --
------------------------------------------------------------
local rtn, str
local buf

while (true) do
        rtn, str = rt.syslogwatch(ptn)
        ip,mac = string.match(str[1], "("..ip_ptn.."):%s+("..mac_ptn..")")
        if (mac) then
                ipaddr, host = search_host_by_mac(mac)

                if (host == nil) then
                    ipaddr, host = search_host_by_ip(ip)
                end

                if (host) then
                        buf = host .. "@" .. ipaddr
                        rt.syslog(log_level, "[Lua] Host detect " .. buf)

                        rt.command("no ip host "..host.."."..base_dn)
                        rt.command("ip host "..host.."."..base_dn.." "..ipaddr)
                        rt.command("clear dns cache")
                end
        end
end

このスクリプトをschedule at 2 startup * lua /dhcp_ddns.luaのように自動実行するようにしておけば,hostname.hogehoge.local等の名前解決ができるようになります.

居なくなったホストの削除が無いので流動的な環境では一定期間で削除するような処理が要るかも…

こうやって拡張出来るのがいいですねー

  • ホスト名に数字が含まれていると途中で切れる問題を修正しました
  • ホスト名登録後DNSのキャッシュをクリアするようにしました