--[[ ●リモートメンテナンススクリプト   インターネット上からルーターに対しキーとなるパケットを発信し、ルーター側で   そのパケットを破棄した際に出力するログをトリガーとして、IPsec トンネルの設定   を追加するスクリプトです。   トンネルの生成は、指定した待ち時間内にトンネル生成用のキーパケットを指定し   た回数だけ受信した場合に行われます。   キーパケットの受信によって生成したトンネルは、以下の条件で消去することがで   きます。   ・消去用のパケットの受信(※1)   ・トンネル生成から一定時間の経過   ・Tunnel Down ログの検出(※2)   ※1 生成用キーパケットを受信中に消去用キーパケットを受信した場合、消去用キー     パケットは無視されます。   ※2 サブスクリプトを同時に実行することで検出することができます。 <説明> ・このファイルを 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 秒) create_sec = (待ち時間) -- ★ -- トンネル生成キーパケット受信回数(2 ..) create_num = (受信回数) -- ★ -- 生成したトンネルを削除するまでの時間(1 - 864000 秒) remove_sec = (時間) -- ★ -- キーパケットのプロトコル(TCP、UDP) key_proto = "(プロトコル)" -- ★ -- トンネル生成用キーパケットのポート番号(最大 65535) create_port = (ポート番号) -- ★ -- トンネル消去用キーパケットのポート番号(最大 65535) remove_port = (ポート番号) -- ★ -- トンネル設定コマンド cmd_tbl = { -- ★ "tunnel select 1", "ipsec tunnel 101", "ipsec sa policy 101 1 esp aes-cbc sha-hmac", "ipsec ike local address 1 192.168.0.1", "ipsec ike pre-shared-key 1 text (パスワード)", "ipsec ike remote address 1 any", "ipsec ike remote name 1 pc-1", "tunnel enable 1", "nat descriptor masquerade static 1 1 192.168.0.1 udp 500", "nat descriptor masquerade static 1 2 192.168.0.1 esp", "ipsec auto refresh on", "ip route 192.168.255.0/24 gateway tunnel 1" } -- トンネル追加/削除の失敗時に出力する SYSLOG のレベル(info, debug, notice) log_level = "(SYSLOG レベル)" -- ★ ----------------------## 設定値ここまで ##---------------------------- ------------------------------------------------------------ -- トンネルの設定を追加、削除する関数 -- ------------------------------------------------------------ function tunnel(add) for i, cmd in ipairs(cmd_tbl) do if (not add) and (i > 1) then cmd = "no " .. cmd end rtn, str = rt.command(cmd) if (not rtn) then return false end end return rtn end ------------------------------------------------------------ -- メインルーチン -- ------------------------------------------------------------ local rtn, str local log_ptn = "PP%[%d+%] Rejected at NAT%(%d+%)%:%s+" .. key_proto .. " %d+%.%d+%.%d+%.%d+%:%d+ %> %d+%.%d+%.%d+%.%d+%:" while (true) do rtn, str = rt.syslogwatch(log_ptn .. tostring(create_port)) if (rtn) then rtn, str = rt.syslogwatch(log_ptn .. tostring(create_port), create_num-1, create_sec) if (rtn == create_num-1) then if (tunnel(true)) then rt.syslog(log_level, "IP tunnel setting added.(Lua スクリプトファイル名)") rtn, str = rt.syslogwatch(log_ptn .. tostring(remove_port), 1, remove_sec) if (tunnel(false)) then rt.syslog(log_level, "IP tunnel setting removed.(Lua スクリプトファイル名)") else rt.syslog(log_level, "IP tunnel remove setting failed.(Lua スクリプトファイル名)") end if (rtn == 0) then rt.syslog(log_level, "Removed IP tunnel by Timeout.(Lua スクリプトファイル名)") end else rt.syslog(log_level, "tunnel up setting failed.(Lua スクリプトファイル名)") end end end end