動的な設定追加でリモートPCとルーターを安全につなぎたい

本設定例では、Luaスクリプト機能とIPsecトンネル機能を使用しています。

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

IPsecトンネル機能の対応機種は、RTX5000RTX3500RTX1210RTX1200RTX830RTX810NVR700WFWX120
SRT100です。

図 動的な設定追加でリモートPCとルーターを安全につなぎたい
下矢印:IPsecトンネル生成
図 動的な設定追加でリモートPCとルーターを安全につなぎたい

リモートPCからのキーパケットを受けて出力するログを監視し、動的にVPNの設定を追加、削除するLuaスクリプトです。
必要なときだけルーターにVPNの設定を追加し、リモートPCとルーター、またはリモートPCとLAN側のサーバーとの間で安全な通信を行うことができます。リモートPCからルーターやLAN側にあるサーバーのメンテナンスを行うときにご利用ください。

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

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

機種 掲載内容 備考
RTX5000 RTX3500 RTX1210 RTX1200 RTX830 RTX810 NVR700W FWX120 SRT100 コマンド設定例
Luaスクリプト例
Luaスクリプト機能、
IPsecトンネル機能

ルーターの設定例

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 log on
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
SYSLOGの設定 syslog notice on
Luaスクリプトのスケジュール設定 schedule at 1 startup * lua (Luaメインスクリプトファイル名)
schedule at 2 startup * lua (Luaサブスクリプトファイル名)

Luaスクリプト例(メインスクリプト)

設定値

-- トンネル生成キーパケット受信待ち時間(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

Luaスクリプト例(サブスクリプト)

設定値 -- トンネル消去用キーパケットのポート番号(最大 65535)
remove_port = (ポート番号)
メインルーチン

local log_ptn = "IP Tunnel%[1%] Down"
local dummy_log = "(dummy) PP[01] Rejected at NAT(1): TCP 1.1.1.1:65535 > 2.2.2.2:" .. tostring(remove_port)

while (true) do
 rt.syslogwatch(log_ptn)
 rt.syslog("notice", dummy_log)
end

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