自宅のネットワークの上流にはRTX1200が居るのですが,DHCPサーバや,静的なレコードを登録できるDNSサーバになれるので,DHCPサーバとかDNSサーバを別途立てるのはめんどくさいけど,或る程度細かく設定したいという場合に大変便利です.
しかし,DHCPとDNSが互いに連携していないので,DHCPで配布したアドレスをホスト名で名前解決をすることはできません.
そこで,LuaスクリプトでSYSLOGを監視し,DHCPでIPの払い出しを行ったら,show status dhcp summaryからホスト名を検索し,静的DNSレコードを自動で登録するようにしてみました.
公式のサンプルのおかげで初めてでもあっという間にできました.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | --[[ ● 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のキャッシュをクリアするようにしました