複数のホストを監視する

Luaスクリプト機能の対応機種は、RTX5000RTX3500RTX1210RTX1200(Rev.10.01.16以降)、RTX810NVR700WNVR510NVR500FWX120です。

図 複数のホストを監視する

指定したIPアドレス宛てに一定の間隔でpingを実行し、pingへの応答が無かった場合に、管理者へメールで通知するLuaスクリプトです。
pingを実行する宛先IPアドレスには、複数のホストを指定することができます。

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

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

機種 掲載内容 備考
RTX5000 RTX3500 RTX1210 RTX1200 NVR700W NVR510 NVR500 コマンド設定例
Luaスクリプト例
Luaスクリプト機能

ルーターの設定例

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の設定 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スクリプトファイル名)

Luaスクリプト例

設定値

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

-- pingを実行する宛先IPアドレス
dst_tbl = {
 "(宛先IPアドレス1)",
 "(宛先IPアドレス2)"
}

-- ping への応答がない、または応答が回復したと判断する連続回数(1, 2 ..)
count = (回数)

-- 応答が回復したときにもメールを送るか否か(送る:true / 送らない:false)
down_mail = (true / false)

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

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

pingを実行し、到達したか
どうかを返す関数

function ping_reach(adr)
 local rtn, str, loss
 local reach = false
 local cmd = "ping " .. adr
 local ptn = "(%d+)%.%d+%%"

 rtn, str = rt.command(cmd)
 if (rtn) and (str) then
  loss = str:match(ptn)
  if (loss) then
   loss = tonumber(loss)
   if (loss == 0) then
    reach = true
   end
  end
 end

 return rtn, reach, str
end

連続何回pingに応答がないかを
示すカウンタの処理関数

function count_proc(t, reach, th)
 local rtn = 0

 if (not reach) then
  if (not t.flag) then
   t.ng = t.ng + 1
   if (t.ng == th) then
    rtn = 1
    t.flag = true
   end
  else
   if (t.ok > 0) then
    t.ok = 0
   end
  end
 else
  if (t.flag) then
   t.ok = t.ok + 1
   if (t.ok == th) then
    rtn = -1
    t.flag = false
    t.ng = 0
    t.ok = 0
   end
  else
   if (t.ng > 0) then
    t.ng = 0
   end
  end
 end

 return rtn
end

メール本文を作成する関数

function make_pingmsg(tbl, reach, adr, cnt, sec, down)
 local rtn
 local str = ""

 rtn = count_proc(tbl, reach, cnt)
 if (rtn < 0) then
  if (down) then
   str = "pingの応答が回復しました。\r\n"
   str = str .. string.format(" 送信先: %s\r\n 監視間隔: %d(秒)\r\n\r\n",adr, sec)
  end
 elseif (rtn > 0) then
  str = "pingの応答がありません。\r\n"
  str = str .. string.format(" 送信先: %s\r\n 応答がなかった回数: %d回\r\n 監視間隔: %d(秒)\r\n\r\n",
     adr, cnt, sec)
 end

 return str
end

連続不応答回数を記録する
テーブルの初期化関数
function init_count_tbl(n, cnt_t)
 for i = 1, n do
  cnt_t[i] = {ng = 0, ok = 0, flag = false}
 end
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 rtn, reach, str, adr
local cnt_tbl = {}

init_count_tbl(#dst_tbl, cnt_tbl)

while (true) do
 mail_tbl.text = ""

 for i, adr in ipairs(dst_tbl) do
  rtn, reach, str = ping_reach(adr)
  if (rtn) then
   mail_tbl.text = mail_tbl.text .. make_pingmsg(cnt_tbl[i], reach, adr,
         count, idle_time, down_mail)
  else
   mail_tbl.text = string.format("%s (ping送信先: %s\r\n\r\n)", str, dst_tbl[i])
  end
 end

 if (mail_tbl.text:len() > 0) then
  mail_tbl.subject = string.format("watch ping : multi destination (%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

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