ルーターの状態を報告する

Luaスクリプト機能の対応機種は、RTX5000RTX3500RTX1210RTX1200(Open in new windowRev.10.01.16以降)、RTX810
NVR700WNVR510NVR500FWX120です。

図 ルーターの状態を報告する

定期的にルーターの状態をメールで通知するLuaスクリプトです。
コマンドの実行結果から下記の数値を抽出し、管理者へ通知します。

  • CPU使用率
  • メモリ使用率
  • 筐体内温度(※)
  • IPマスカレードで使用中のポート数
  • DHCPサーバー機能で割り当て中のIPアドレスの数と利用可能なIPアドレスの数

(※) 筐体内温度の計測に対応した機種を使用する場合に通知されます。

光回線に接続するためには、別途ONUが必要です。
NVR700WとNVR510は、本体のONUポートに小型ONUを装着することで、光回線に接続できます。

対応機種のうち、設定例を掲載している機種は、以下のとおりです。

機種 掲載内容 備考

RTX5000 RTX3500 RTX1210 RTX1200 NVR700W NVR510 NVR500

コマンド設定例
Luaスクリプト例

Luaスクリプト機能

ルーターの設定例

下記の設定(Config)を取り出すことができます。

RTX1210 / NVR700W / NVR510

上記以外のルーター

LANの
インタフェースの設定
(LAN1ポートを使用)

ip lan1 address 192.168.0.1/24

WANの
インタフェースの設定
(LAN2ポートを使用)

pp select 1
pp always-on on
pppoe use lan2
pp auth accept pap chap
pp auth myname (ISPに接続するID) (ISPに接続するパスワード)
ppp lcp mru on 1454
ppp ipcp ipaddress on
ppp ipcp msext on
ip pp mtu 1454
ip pp nat descriptor 1
pp enable 1
ip route default gateway pp 1

NATの設定 #注釈1

nat descriptor type 1 masquerade

DHCPの設定

dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.0.2-192.168.0.100/24

DNSの設定

dns server (ISPより指定されたDNSサーバーのIPアドレス)
dns private address spoof on

フィルタの設定

ip filter source-route on
ip filter directed-broadcast on
ip filter 1010 reject * * udp,tcp 135 *
ip filter 1011 reject * * udp,tcp * 135
ip filter 1012 reject * * udp,tcp netbios_ns-netbios_ssn *
ip filter 1013 reject * * udp,tcp * netbios_ns-netbios_ssn
ip filter 1014 reject * * udp,tcp 445 *
ip filter 1015 reject * * udp,tcp * 445
ip filter 1020 reject 192.168.0.0/24 *
ip filter 1030 pass * 192.168.0.0/24 icmp
ip filter 2000 reject * *
ip filter 3000 pass * *
ip filter dynamic 100 * * ftp
ip filter dynamic 101 * * www
ip filter dynamic 102 * * domain
ip filter dynamic 103 * * smtp
ip filter dynamic 104 * * pop3
ip filter dynamic 105 * * netmeeting
ip filter dynamic 106 * * tcp
ip filter dynamic 107 * * udp
pp select 1
ip pp secure filter in 1020 1030 2000
ip pp secure filter out 1010 1011 1012 1013 1014 1015 3000 dynamic 100 101 102 103 104 105 106 107
pp enable 1

Luaスクリプトのスケジュール設定

schedule at 1 startup * lua (Luaスクリプトファイル名)

[注釈の説明]
注釈1
RTX1210, NVR700W, NVR510 を使用する場合は、NAT動作タイプを1に設定する必要があります。次のコマンドを追加してください。
nat descriptor backward-compatibility 1
詳細は、NAT動作タイプの違いについて を参照してください。

設定値

-- 監視間隔 (1-864000 秒)
idle_time = (監視間隔)

-- 使用状況を取得するIPマスカレードのNATディスクリプタ番号(1 - 2147483647)
nat_descriptor = (NATディスクリプタ番号)

-- メールの設定
mail_tbl = {
 smtp_address = "(SMTPサーバーのアドレス)",
 from = "(送信元メールアドレス)",
 to = "(宛先メールアドレス)"
}

-- メールの送信に失敗した時に出力する SYSLOG のレベル(info, debug, notice)
log_level = "(SYSLOGレベル)"

ルーターのハードウェアリソースの使用状況を取得する関数

function rt_res_status(t)
 local rtn, str
 local cmd = "show environment"
 
 rtn, str = rt.command(cmd)
 if (rtn) and (str) then
  for k, v in pairs(t) do
   v.val = str:match(v.ptn)
   if (v.val) then
    v.val = tostring(v.val)
   end
  end
 else
  str = cmd .. "コマンド実行失敗\r\n\r\n"
 end

 return rtn, str
end

IPマスカレードの使用ポート数を返す関数

function natmsq_use_status(id)
 local rtn, str, num
 local cmd = "show nat descriptor address " .. tostring(id)
 local ptn = "(%d+)個使用中"
 local err = "NATディスクリプタは定義されていません"
 
 rtn, str = rt.command(cmd)
 if (rtn) and (str) then
  num = str:match(ptn)
  if (num) then
   num = tostring(num)
  else
   if (str ~= err) then
    str = "マスカレードテーブルは現在使用されていません\r\n"
   end
   rtn = false
  end
 else
  str = cmd .. "コマンド実行失敗\r\n"
 end

 return rtn, num, str
end

DHCPサーバー機能で割り当て中、または利用可能なIPアドレスの数を返す関数

function dhcp_status(t)
 local rtn, str, n, id, asn, avl
 local cmd = "show status dhcp"

 rtn, str = rt.command(cmd)
 if (rtn) then
  if (str) then
   s = 1
   n = 1
   while (true) do
    s, e, id = string.find(str, "番号: (%d+)", s)
    if (s) then
     s, e, asn = str:find("割り当て中アドレス数: (%d+)", e)
     s, e, avl = str:find("利用可能アドレス数: (%d+)", e)
     t[n] = {id = id, asn = asn, avl = avl}
    else
     break
    end
   end
  else
   str = " 有効なDHCPスコープがありません\r\n\r\n"
   rtn = false
  end
 end

 return rtn, str
end

現在の日時を取得する関数

function time_stamp()
 local t

 t = os.date("*t")
 return string.format("%d/%02d/%02d %02d:%02d:%02d",
  t.year, t.month, t.day, t.hour, t.min, t.sec)
end

メインルーチン

-- ハードウェアリソース情報テーブル
local rt_res_tbl = {
 cpu_5sec = {ptn = "(%d+)%%%(5sec%)", val = 0 },
 cpu_1min = {ptn = "(%d+)%%%(1min%)", val = 0 },
 cpu_5min = {ptn = "(%d+)%%%(5min%)", val = 0 },
 memory = {ptn = "(%d+)%% used", val = 0 },
 temp = {ptn = "筐体内温度%(℃%): (%d+)", val = 0 }
}

local rtn, str, num
local scope_tbl = {}
local rt_name = string.match(_RT_FIRM_REVISION, "(%w+)")

while (true) do
 mail_tbl.text = ""

 -- cpu, mem (,temp -- RTX1200, RTX3500, RTX5000, RTX1210)
 rtn, str = rt_res_status(rt_res_tbl)
 if (rtn) then
  str = string.format("[CPU負荷率]\r\n %d%%(5sec)\t%d%%(1min)\t%d%%(5min)\r\n[メモリ使用率]\r\n %d%%\r\n",
   rt_res_tbl.cpu_5sec.val, rt_res_tbl.cpu_1min.val,
   rt_res_tbl.cpu_5min.val, rt_res_tbl.memory.val)
  if ((rt_name == "RTX1200") or (rt_name == "RTX3500") or (rt_name == "RTX5000") or (rt_name == "RTX1210")) then
   str = str .. string.format("[筐体内温度]\r\n %d℃\r\n", rt_res_tbl.temp.val)
  end
 else
  if ((rt_name == "RTX1200") or (rt_name == "RTX3500") or (rt_name == "RTX5000") or (rt_name == "RTX1210")) then
   str = "[CPU使用率]\r\n[メモリ使用率]\r\n[筐体内温度]\r\n " .. str
  else
   str = "[CPU使用率]\r\n[メモリ使用率]\r\n " .. str
  end
 end
 mail_tbl.text = mail_tbl.text .. str .. "\r\n"

 -- nat
 mail_tbl.text = mail_tbl.text .. string.format("[NATディスクリプタ : %d]\r\n ", nat_descriptor)
 rtn, num, str = natmsq_use_status(nat_descriptor)
 if (rtn) then
  if (num) then
   str = string.format("使用中のポート数: %d個\r\n", num)
  end
 end
 mail_tbl.text = mail_tbl.text .. str .. "\r\n"

 -- dhcp
 mail_tbl.text = mail_tbl.text .. "[DHCP]\r\n"
 rtn, str = dhcp_status(scope_tbl)
 if (rtn) then
  str = ""
  for i, v in ipairs(scope_tbl) do
   str = str .. string.format(" DHCPスコープ番号: %d\r\n", v.id)
   str = str .. string.format(" 割り当て可能アドレス: %d\r\n", v.asn)
   str = str .. string.format(" 利用可能アドレス: %d\r\n", v.avl)
  end
 end
 mail_tbl.text = mail_tbl.text .. str .. "\r\n"

 if (mail_tbl.text:len() > 0) then
  mail_tbl.subject = string.format("watch router resources (%s)", time_stamp())
  rtn = rt.mail(mail_tbl)
  if (not rtn) then
   rt.syslog(log_level, "failed to send mail. (Luaスクリプトファイル名)")
  end
 end

 rt.sleep(idle_time)
end

【ご注意】

本設定例は、設定の参考例を示したもので、動作を保証するものではございません。
ご利用いただく際には、十分に評価・検証を実施してください。

ページトップへ戻るReturn to Top