自宅のネットワークの上流には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のキャッシュをクリアするようにしました