前回の記事でLuaスクリプトのファイル作成・ルータへのコピー・実行 までを紹介しました。 今回はTFTPを利用してルータにLuaスクリプトファイルをアップロードする方法とルータの状態を把握するためCPUやメモリの使用率などの状態をメールで通知するLuaスクリプトの紹介をします。
ルータの設定内容
まずは今回利用するRTX1200の設定内容です。
login password *
administrator password *
console character euc
ip route default gateway pp 1
ip filter source-route on
ip filter directed-broadcast on
ip lan1 address 192.168.0.1/24
pp select 1
pp keepalive interval 30 retry-interval=30 count=12
pp always-on on
pppoe use lan2
pppoe auto connect on
pppoe auto disconnect off
pp auth accept pap chap
pp auth myname (ISPの接続アカウント) (ISPのパスワード)
ppp lcp mru on 1454
ppp ipcp ipaddress on
ppp ipcp msext on
ip pp mtu 1454
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
ip pp nat descriptor 1
pp enable 1
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
nat descriptor type 1 masquerade
tftp host any
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.0.101-192.168.0.200/24
dns server pp 1
dns private address spoof on
上記はインターネット接続する一般的な設定内容になります。
ルータの状態をメール通知する
ヤマハのサイトで公開されているLuaスクリプト を利用させて頂きます。 今回のLuaスクリプトは
CPU使用率
メモリ使用率
筐体内温度
IPマスカレードで使用中のポート数
DHCPサーバー機能で割り当て中のIPアドレスの数と利用可能なIPアドレスの数
をメールで定期的に通知するスクリプトになります。 下記の内容をメモ帳にコピーして「rtx1200-info.lua」のファイル名で保存します。
--[[
●ルーターリソース監視スクリプト
定期的にルーターのリソースを監視して、各リソースの使用状況を管理者にメール
で送信するスクリプトです。監視するリソースは以下です。
・CPU 使用率
・メモリ使用率
・筐体内温度(RTX1200, RTX3500, RTX5000, RTX1210)
・IP マスカレードの使用ポート数
・DHCP サーバ機能での割り当て中と利用可能なアドレス数
<説明>
・このファイルを RTFS か外部メモリに保存してください。
・本項目の config の設定では schedule at コマンドでルーター起動時に Lua スク
リプトが実行されるように設定しています。
・スクリプトを停止するときは terminate lua コマンドを実行してください。
・再度、Lua スクリプトを実行する場合は lua コマンドで実行してください。
・★マークの付いた設定値は変更が可能です。
<ノート>
・メールの送信失敗時に出力する SYSLOG レベルを指定可能です。
SYSLOG のレベルを指定するには、log_level を設定してください。
debug レベル、notice レベルの SYSLOG を出力するためには、それぞれ以下の設定
が必要です。
debug レベル ・・・ syslog debug on
notice レベル・・・ syslog notice on
・本スクリプトファイルを編集する場合、文字コードは必ず Shift-JIS を使用してく
ださい。
]]
--------------------------## 設定値 ##--------------------------------
-- 監視間隔(1 - 864000 秒)
idle_time = 300 -- ★
-- 使用状況を取得する IP マスカレードの NAT ディスクリプタ番号(1 - 2147483647)
nat_descriptor = 1 -- ★
-- メールの設定
mail_tbl = { -- ★
smtp_address = "(SMTPサーバのアドレス)",
smtp_port = "587",
smtp_auth_protocol = "plain",
smtp_auth_name = "(アカウント名)",
smtp_auth_password = "(パスワード)",
from = "(送信元メールアドレス)",
to = "(送信先メールアドレス)"
}
-- メールの送信に失敗した時に出力する SYSLOG のレベル(info, debug, notice)
log_level = "info" -- ★
----------------------## 設定値ここまで ##----------------------------
------------------------------------------------------------
-- ルーターのハードウェアリソースの使用状況を取得する関数 --
------------------------------------------------------------
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 サーバー機能で割当中、または利用可能な --
-- アドレスを返す関数 --
------------------------------------------------------------
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
修正が必要な箇所は下記になります。
36行目
idle_time = 300
上記では5分に1回メールで通知するようにしています。 設定値は秒で設定します。1時間ごとにメール通知する場合は
idle_time = 3600
とします。
39行目
nat_descriptor = 1
IP マスカレードの使用ポート数を通知させるための設定になりNATディスクリプタ番号を設定します。今回の設定ではRTX1200の設定内容42行目に記載されている
nat descriptor type 1 masquerade
のNAT ディスクリプタ番号が「1」になっているので「1」を設定しました。
43行目から49行目
smtp_address = "(SMTPサーバのアドレス)",
smtp_port = "587",
smtp_auth_protocol = "plain",
smtp_auth_name = "(アカウント名)",
smtp_auth_password = "(パスワード)",
from = "(送信元メールアドレス)",
to = "(送信先メールアドレス)"
SubmissionポートやSMTP認証が必要な場合は上記設定が必須になります。
TFTPでLuaスクリプトをルータへアップロード
前回はUSBメモリを使ってLuaスクリプトをルータへコピーしましたが、今回はTFTPを利用してルータへファイルをアップロードしたいと思います。まずはWindowsでTFTPコマンドを利用できるようにする必要があります。
TFTPクライアントの利用設定
1.コントロールパネルから「プログラム」をクリックします。
2.「Windowsの機能の有効化または無効化」をクリックします。
3.「Telnetクライアント」と「TFTPクライアント」にチェックを付け「OK」をクリックします。
これでWindowsでTFTPコマンドが利用できるようになります。
TFTPの接続許可
ルータにTFTP接続の許可設定を行います。
tftp host any
上記はすべてのホストからTFTPで接続できるのでアップロードが終ったら下記コマンドで接続できないようにしましょう。
tftp host none
TFTPコマンドでファイルをアップロード
Windowsの「コマンドプロンプト」を利用してルータにファイルをアップロードします。 Luaスクリプトファイル「rtx1200-info.lua」は「C:\lua」に保存しました。
下記コマンドでファイルをアップロードします。
cd c:\lua
tftp 192.168.0.1 put rtx1200-info.lua /rtx1200-info.lua/(Administratorパスワード)
実行結果は下記になります。
ルータのコンソールからファイルがアップロードされているか下記コマンドで確認します。
show file list /
上記からルータへファイルがアップロードされているのが確認できました。
Luaスクリプトの実行
ルータへアップロードされたファイルをスケジュールで実行させます。 ■ルータ起動時に実行
schedule at 1 startup * lua /rtx1200-info.lua
上記の設定はルータの起動時にLauスクリプトが実行されるのでルータの再起動が必要になります。ルータの再起動を回避する為に一時的に時間指定で実行させます。
■時間指定で実行
schedule at 1 17:00:00 * lua /rtx1200-info.lua
上記は17時にLuaスクリプトが実行されるので一度実行されたあとは削除します。 また、通知メールを一時的に止めたい場合は下記コマンドで強制終了させます。
■Lua スクリプトの強制終了
terminate lua file /rtx1200-info.lua
ルータからのメール
上記設定でルータから定期的にルータの状態が通知されるようになりました。下記がルータからのメール内容になります。
CPUの使用率・メモリ使用率・筐体内温度などLuaスクリプトで作成した内容のメールがちゃんと届きました。
まとめ
今回はLuaスクリプトをTFTPでルータにアップロードする方法を紹介しました。前回のUSBでファイルをコピーする方法 ではルータが手元にあれば良いのですが、拠点などに設置している場合では現地に行く必要があります。TFTPでアップロードする方法は通信が確立できていれば手元になくてもLuaスクリプトを設置することができます。次回は実践的なLuaスクリプトを紹介します。