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

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

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

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 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スクリプト例(メインスクリプト)

下記のLuaスクリプトを取り出すことができます。

設定値

-- トンネル生成キーパケット受信待ち時間(1 - 864000 秒)
create_sec = (待ち時間)

-- トンネル生成キーパケット受信回数(1, 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スクリプト例(サブスクリプト)

下記の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

ページトップへ戻るReturn to Top