ルーターの状態をSORACOM Harvestに送信する

管理番号:YMHRT-21122 
(最終更新日: 2023/7/26)

本設定例では、Luaスクリプト機能と内蔵無線WAN機能を使用しています。

Luaスクリプト機能の対応機種は、RTX5000RTX3510RTX3500RTX1300RTX1220RTX1210RTX830NVR700WNVR510NVR500FWX120です。

内蔵無線WAN機能の対応機種は、NVR700Wです。

図 ルーターの状態をSORACOM Harvestに送信する

定期的に、ルーターの状態をSORACOM Harvestに送信するLuaスクリプトです。
コマンドの実行結果から以下の数値を抽出し、SORACOM Harvest Data(Harvest Data)を利用してHTTPで送信します。

  • CPU使用率
  • メモリ使用率
  • NATセッションの使用率
  • DHCPサーバー機能でのIPアドレスプールの使用率

送信したデータは、SORACOMのユーザーコンソールで確認できます。

本設定例では、ソラコム社が提供するSIMカード(SORACOM Air)を使用します。
使用可能なSIMカードの詳細は、内蔵無線WAN 対応SIMカードをご覧ください。
※SIMカードをNVR700WのSIMカードスロットに挿入するときは、必ず電源を切った状態で行ってください。

事前に、使用するSIMカードに対してHarvest Dataの設定を有効化しておく必要があります。
Harvest Dataに関する情報および設定方法については、ソラコム社にご確認ください。

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

機種 掲載内容 備考
NVR700W コマンド設定例
Luaスクリプト例
Luaスクリプト機能、内蔵無線WAN機能

通信制限について

データ通信(パケット通信)の契約が従量制サービスなどの場合、長時間の通信や大容量データのやりとりで高額な料金が発生します。それを防ぐために、通信時間とデータ長に上限を設定できます。上限に達した場合、通信中であれば通信を強制終了し、以降は発信・接続を停止します。
通信制限の設定方法は、内蔵無線WAN 通信制限についてをご覧ください。

NVR700Wの設定例

※ネットワーク機器を安全にお使いいただくために、管理パスワードの変更を奨励します。

内蔵無線WANを使用する設定 wwan-module use on
ゲートウェイの設定 ip route default gateway pdp wan1
LANインターフェースの設定
(LANポートを使用)
ip lan1 address 192.168.100.1/24
WAN1インターフェースの設定
(内蔵無線WANを使用)
ip wan1 address pdp
ip wan1 secure filter in 300003 300020 300021 300022 300023 300024 300025 300030 300032 300100 300101 300102
ip wan1 secure filter out 300013 300020 300021 300022 300023 300024 300025 300026 300027 300099 dynamic 300080 300081 300082 300083 300084 300085 300098 300099
ip wan1 nat descriptor 1
WWANインターフェースの設定
(内蔵無線WANを使用)
wan1 bind wwan 1
wwan select 1
wwan auth accept chap
wwan auth myname (無線WANのユーザーID) (無線WANの接続パスワード)
wwan disconnect time off
wwan disconnect input time off
wwan disconnect output time off
wwan access-point name (アクセスポイント名)
wwan access limit length off
wwan access limit time off
wwan enable 1
フィルターの設定 ip filter 300000 reject 10.0.0.0/8 * * * *
ip filter 300001 reject 172.16.0.0/12 * * * *
ip filter 300002 reject 192.168.0.0/16 * * * *
ip filter 300003 reject 192.168.100.0/24 * * * *
ip filter 300010 reject * 10.0.0.0/8 * * *
ip filter 300011 reject * 172.16.0.0/12 * * *
ip filter 300012 reject * 192.168.0.0/16 * * *
ip filter 300013 reject * 192.168.100.0/24 * * *
ip filter 300020 reject * * udp,tcp 135 *
ip filter 300021 reject * * udp,tcp * 135
ip filter 300022 reject * * udp,tcp netbios_ns-netbios_ssn *
ip filter 300023 reject * * udp,tcp * netbios_ns-netbios_ssn
ip filter 300024 reject * * udp,tcp 445 *
ip filter 300025 reject * * udp,tcp * 445
ip filter 300026 restrict * * tcpfin * www,21,nntp
ip filter 300027 restrict * * tcprst * www,21,nntp
ip filter 300030 pass * 192.168.100.0/24 icmp * *
ip filter 300031 pass * 192.168.100.0/24 established * *
ip filter 300032 pass * 192.168.100.0/24 tcp * ident
ip filter 300033 pass * 192.168.100.0/24 tcp ftpdata *
ip filter 300034 pass * 192.168.100.0/24 tcp,udp * domain
ip filter 300035 pass * 192.168.100.0/24 udp domain *
ip filter 300036 pass * 192.168.100.0/24 udp * ntp
ip filter 300037 pass * 192.168.100.0/24 udp ntp *
ip filter 300099 pass * * * * *
ip filter 500000 restrict * * * * *
ip filter dynamic 300080 * * ftp
ip filter dynamic 300081 * * domain
ip filter dynamic 300082 * * www
ip filter dynamic 300083 * * smtp
ip filter dynamic 300084 * * pop3
ip filter dynamic 300085 * * submission
ip filter dynamic 300098 * * tcp
ip filter dynamic 300099 * * udp
NATの設定 nat descriptor type 1 masquerade
nat descriptor address outer 1 primary
DHCPの設定 dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.2-192.168.100.191/24
DNSの設定 dns host lan1
dns server pdp wan1
dns private address spoof on
Luaスクリプトのスケジュール設定 schedule at 1 startup * lua (Luaスクリプトファイル名)

Luaスクリプト例

設定値

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

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

-- 使用状況を取得する DHCPの スコープ番号(1 - 65535)
dhcp_scope = (スコープ番号)

-- SORACOM Harvestへのデータ送信に失敗したときに出力する SYSLOG のレベル(info, debug, notice)
log_level = "(SYSLOG レベル)"

定数

-- NATセッション数 (NVR700W)
nat_session = 65534

SORACOM Harvest用のリクエストテーブル

req_tbl = {
 url = "http://harvest.soracom.io/",
 method = "POST",
 content_type = "application/json"
}

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

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
  rt.syslog(log_level, cmd .. " cannot be executed. (Luaスクリプトファイル名)")
 end

 return rtn
end

使用中のNATセッション数を返す関数

function natmsq_use_status(id)
 local rtn, str, session
 local cmd = "show nat descriptor address " .. tostring(id)
 local ptn = "(%d+) セッション"
 local err = "NATディスクリプタは定義されていません"
 
 rtn, str = rt.command(cmd)
 if (rtn) and (str) then
  session = str:match(ptn)
  if (session) then
   session = tostring(session)
  else
   if (string.find(str, err) ~= nil) then
    rt.syslog(log_level, "NAT Descriptor is not defined. (Luaスクリプトファイル名)")
    rtn = false
   else
    session = 0
   end
  end
 else
  rt.syslog(log_level, cmd .. " cannot be executed. (Luaスクリプトファイル名)")
 end

 return rtn, session
end

IPマスカレード同時セッション数の最大値を返す関数

function natmsq_limit_total(id)
 local rtn, str, limit
 local cmd = "show config | grep total"
 local ptn = "nat descriptor masquerade session limit total " .. tostring(id) .. " (%d+)"

 rtn, str = rt.command(cmd)
 if (rtn) then
  if (str) then
   limit = str:match(ptn)
   if (limit) then
    limit = tostring(limit)
   else
    limit = nat_session
   end
  else
   limit = nat_session
  end
 else
  rt.syslog(log_level, cmd .. " cannot be executed. (Luaスクリプトファイル名)")
 end

 return rtn, limit
end

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

function dhcp_status(id)
 local rtn, str, leased, usable
 local cmd = "show status dhcp " .. tostring(id)

 rtn, str = rt.command(cmd)
 if (rtn) and (str) then
  leased = str:match("割り当て中アドレス数: (%d+)")
  if (leased) then
   leased = tostring(leased)
  end
  usable = str:match("利用可能アドレス数: (%d+)")
  if (usable) then
   usable = tostring(usable)
  end
 else
  rt.syslog(log_level, cmd .. " cannot be executed. (Luaスクリプトファイル名)")
 end

 return rtn, leased, usable
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 }
}

local rtn, rtn2, str, session, limit, leased, usable, res_tbl

while (true) do
 req_tbl.post_text = ""

 -- cpu, mem
 rtn = rt_res_status(rt_res_tbl)
 if (rtn) then
  str = string.format("\"cpu_5sec(%%)\":%d,\"cpu_1min(%%)\":%d,\"cpu_5min(%%)\":%d,\"memory(%%)\":%d,",
   rt_res_tbl.cpu_5sec.val, rt_res_tbl.cpu_1min.val,
   rt_res_tbl.cpu_5min.val, rt_res_tbl.memory.val)
  req_tbl.post_text = req_tbl.post_text .. str
 end

 -- nat
 rtn, session = natmsq_use_status(nat_descriptor)
 rtn2, limit = natmsq_limit_total(nat_descriptor)
 if (rtn) and (rtn2) then
  if (session) and (limit) then
   str = string.format("\"nat(%%)\":%d,", (session * 100) / limit)
   req_tbl.post_text = req_tbl.post_text .. str
  end
 end

 -- dhcp
 rtn, leased, usable = dhcp_status(dhcp_scope)
 if (rtn) then
  if (leased) and (usable) then
   str = string.format("\"dhcp(%%)\":%d,", (leased * 100) / usable)
   req_tbl.post_text = req_tbl.post_text .. str
  end
 end

 if (req_tbl.post_text:len() > 0) then
  -- JSON形式に変換
  req_tbl.post_text = "{" .. string.sub(req_tbl.post_text, 1 , -2) .. "}"

  -- SORACOM HarvestへHTTPでデータを送信
  res_tbl = rt.httprequest(req_tbl)
  if (res_tbl.rtn1) and (res_tbl.code) and (res_tbl.code == 201) then
   -- 送信成功
   rt.syslog(log_level, "[LUA] success to send data. (Luaスクリプトファイル名)")
  else
   -- 送信失敗
   rt.syslog(log_level, "[LUA] failed to send data. (Luaスクリプトファイル名)")
  end
 end

 rt.sleep(idle_time)
end

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

メール

ご相談・お問い合わせ