バックアップ動作を監視する

本設定例は、以下の機種に対応しています。

対応機種: RTX5000 RTX3500 RTX1210 RTX1200 FWX120 SRT100

図 バックアップ動作を監視する:正常時
下矢印:障害発生
図 バックアップ動作を監視する:バックアップ時
下矢印:復旧
図 バックアップ動作を監視する:メイン回線に復帰時

VPNのバックアップ動作を監視し、バックアップ回線への切り替え、およびメイン回線への復帰を管理者へメールで通知するLuaスクリプトです。
トンネルバックアップ、またはネットワークバックアップについて、バックアップ動作の際に出力されるログをLuaスクリプトで監視しています。

RTX1200(1) トンネルバックアップの設定例

ルーターの名前の設定 set ROUTER_NAME=(ルーターの名前)
LANの
インタフェースの設定
(LAN1ポートを使用)
ip lan1 address 172.16.100.1/24
WANの
インタフェースの設定
(LAN2ポートを使用)
pp select 1
pp always-on on
pppoe use lan2
pp auth accept pap chap
pp auth myname (ISP1に接続するID) (ISP1に接続するパスワード)
ppp lcp mru on 1454
ppp ipcp msext on
ppp ccp type none
ip pp address (グローバルアドレス1)
ip pp nat descriptor 1
pp enable 1
ip route (グローバルアドレス3) gateway pp 1
WANの
インタフェースの設定
(LAN3ポートを使用)
pp select 2
pp always-on on
pppoe use lan3
pp auth accept pap chap
pp auth myname (ISP2に接続するID) (ISP2に接続するパスワード)
ppp lcp mru on 1454
ppp ipcp msext on
ppp ccp type none
ip pp address (グローバルアドレス2)
ip pp nat descriptor 2
pp enable 2
ip route (グローバルアドレス4) gateway pp 2
NATの設定 nat descriptor type 1 masquerade
nat descriptor address outer 1 (グローバルアドレス1)
nat descriptor masquerade static 1 1 172.16.100.1 udp 500 # 注釈1
nat descriptor masquerade static 1 2 172.16.100.1 esp # 注釈1
nat descriptor type 2 masquerade
nat descriptor address outer 2 (グローバルアドレス2)
nat descriptor masquerade static 2 1 172.16.100.1 udp 500 # 注釈1
nat descriptor masquerade static 2 2 172.16.100.1 esp # 注釈1
VPN(IPsec)の設定
(共通項目)
ipsec auto refresh on
VPN(IPsec)の設定
(主系)
tunnel select 1
ipsec tunnel 101
ipsec sa policy 101 1 esp aes-cbc sha-hmac
ipsec ike always-on 1 on
ipsec ike keepalive use 1 on
ipsec ike local address 1 172.16.100.1
ipsec ike pre-shared-key 1 text (パスワード1)
ipsec ike remote address 1 (グローバルアドレス3)
tunnel backup tunnel 2
tunnel enable 1
ip route 172.16.1.0/24 gateway tunnel 1
VPN(IPsec)の設定
(従系)
tunnel select 2
ipsec tunnel 102
ipsec sa policy 102 2 esp aes-cbc sha-hmac
ipsec ike always-on 2 on
ipsec ike keepalive use 2 on
ipsec ike local address 1 172.16.100.1
ipsec ike pre-shared-key 2 text (パスワード2)
ipsec ike remote address 2 (グローバルアドレス4)
tunnel enable 2
DHCPの設定 dhcp service server
dhcp scope 1 172.16.100.2-172.16.100.100/24
Luaスクリプトの
スケジュール設定
schedule at 1 startup * lua (Luaスクリプトファイル名)

RTX1200(1) ネットワークバックアップの設定例

ルーターの名前の設定 set ROUTER_NAME=(ルーターの名前)
経路の設定 ip route 172.16.1.0/24 gateway tunnel 1 keepalive 1 gateway tunnel 2 weight 0
IPキープアライブの設定 ip keepalive 1 icmp-echo 10 6 (グローバルアドレス3) log=on
LANの
インタフェースの設定
(LAN1ポートを使用)
ip lan1 address 172.16.100.1/24
WANの
インタフェースの設定
(LAN2ポートを使用)
pp select 1
pp always-on on
pppoe use lan2
pp auth accept pap chap
pp auth myname (ISP1に接続するID) (ISP1に接続するパスワード)
ppp lcp mru on 1454
ppp ipcp msext on
ppp ccp type none
ip pp address (グローバルアドレス1)
ip pp nat descriptor 1
pp enable 1
ip route (グローバルアドレス3) gateway pp 1
WANの
インタフェースの設定
(LAN3ポートを使用)
pp select 2
pp always-on on
pppoe use lan3
pp auth accept pap chap
pp auth myname (ISP2に接続するID) (ISP2に接続するパスワード)
ppp lcp mru on 1454
ppp ipcp msext on
ppp ccp type none
ip pp address (グローバルアドレス2)
ip pp nat descriptor 2
pp enable 2
ip route (グローバルアドレス4) gateway pp 2
NATの設定 nat descriptor type 1 masquerade
nat descriptor address outer 1 (グローバルアドレス1)
nat descriptor masquerade static 1 1 172.16.100.1 udp 500 # 注釈1
nat descriptor masquerade static 1 2 172.16.100.1 esp # 注釈1
nat descriptor type 2 masquerade
nat descriptor address outer 2 (グローバルアドレス2)
nat descriptor masquerade static 2 1 172.16.100.1 udp 500 # 注釈1
nat descriptor masquerade static 2 2 172.16.100.1 esp # 注釈1
VPN(IPsec)の設定
(共通項目)
ipsec auto refresh on
VPN(IPsec)の設定
(主系)
tunnel select 1
ipsec tunnel 101
ipsec sa policy 101 1 esp aes-cbc sha-hmac
ipsec ike always-on 1 on
ipsec ike keepalive use 1 on
ipsec ike local address 1 172.16.100.1
ipsec ike pre-shared-key 1 text (パスワード1)
ipsec ike remote address 1 (グローバルアドレス3)
tunnel enable 1
VPN(IPsec)の設定
(従系)
tunnel select 2
ipsec tunnel 102
ipsec sa policy 102 2 esp aes-cbc sha-hmac
ipsec ike always-on 2 on
ipsec ike keepalive use 2 on
ipsec ike local address 1 172.16.100.1
ipsec ike pre-shared-key 2 text (パスワード2)
ipsec ike remote address 2 (グローバルアドレス4)
tunnel enable 2
DHCPの設定 dhcp service server
dhcp scope 1 172.16.100.2-172.16.100.100/24
Luaスクリプトの
スケジュール設定
schedule at 1 startup * lua (Luaスクリプトファイル名)

RTX1200(2)の設定例

LANの
インタフェースの設定
(LAN1ポートを使用)
ip lan1 address 172.16.1.1/24
WANの
インタフェースの設定
(LAN2ポートを使用)
pp select 1
pp always-on on
pppoe use lan2
pp auth accept pap chap
pp auth myname (ISP3に接続するID) (ISP3に接続するパスワード)
ppp lcp mru on 1454
ppp ipcp msext on
ppp ccp type none
ip pp address (グローバルアドレス3)
ip pp nat descriptor 1
pp enable 1
ip route (グローバルアドレス1) gateway pp 1
NATの設定 nat descriptor type 1 masquerade
nat descriptor address outer 1 (グローバルアドレス3)
nat descriptor masquerade static 1 1 172.16.1.1 udp 500 # 注釈1
nat descriptor masquerade static 1 2 172.16.1.1 esp # 注釈1
VPN(IPsec)の設定
(共通項目)
ipsec auto refresh on
VPN(IPsec)の設定 tunnel select 1
ipsec tunnel 101
ipsec sa policy 101 1 esp aes-cbc sha-hmac
ipsec ike keepalive use 1 on
ipsec ike local address 1 172.16.1.1
ipsec ike pre-shared-key 1 text (パスワード1)
ipsec ike remote address 1 (グローバルアドレス1)
tunnel backup lan1 172.16.1.2
tunnel enable 1
ip route 172.16.100.0/24 gateway tunnel 1
DHCPの設定 dhcp service server
dhcp scope 1 172.16.1.11-172.16.1.100/24

RTX1200(3)の設定例

LANの
インタフェースの設定
(LAN1ポートを使用)
ip lan1 address 172.16.1.2/24
WANの
インタフェースの設定
(LAN2ポートを使用)
pp select 1
pp always-on on
pppoe use lan2
pp auth accept pap chap
pp auth myname (ISP4に接続するID) (ISP4に接続するパスワード)
ppp lcp mru on 1454
ppp ipcp msext on
ppp ccp type none
ip pp address (グローバルアドレス4)
ip pp nat descriptor 1
pp enable 1
ip route (グローバルアドレス2) gateway pp 1
NATの設定 nat descriptor type 1 masquerade
nat descriptor address outer 1 (グローバルアドレス4)
nat descriptor masquerade static 1 1 172.16.1.2 udp 500 # 注釈1
nat descriptor masquerade static 1 2 172.16.1.2 esp # 注釈1
VPN(IPsec)の設定
(共通項目)
ipsec auto refresh on
VPN(IPsec)の設定 tunnel select 1
ipsec tunnel 101
ipsec sa policy 101 1 esp aes-cbc sha-hmac
ipsec ike keepalive use 1 on
ipsec ike local address 1 172.16.1.2
ipsec ike pre-shared-key 1 text (パスワード2)
ipsec ike remote address 1 (グローバルアドレス2)
tunnel enable 1
ip route 172.16.100.0/24 gateway tunnel 1

Luaスクリプト例

設定値

-- バックアップに切り替え/切り戻りを検出するパターンを選択(1 - 3)
-- 1 ... トンネルバックアップで出力されるログ
-- 2 ... ip keepalive コマンドの実行結果ログ
-- 3 ... ip route change log=on で出力されるログ (# 注釈2)
log_ptn = (ログパターン)

-- バックアップに切り替わった時に通知するshow系コマンドをカンマで区切って列挙する
cmd_switch_tbl = {
 "(show系コマンド1)",
 "(show系コマンド2)"
}

-- メインに復帰した時に通知するshow系コマンドをカンマで区切って列挙する
cmd_recover_tbl = {
 "(show系コマンド1)",
 "(show系コマンド2)"
}

-- メールの設定
mail_tbl = {
 smtp_address = "(SMTPサーバーのアドレス)",
 from = "(送信元メールアドレス)",
 to = "(宛先メールアドレス)"
}

-- メールの送信に失敗した時に出力する SYSLOG のレベル(info, debug, notice)
log_level = "(SYSLOGレベル)"

コマンドの実行結果を出力する関数

function exec_command(cmd)
 local rtn, str

 rtn, str = rt.command(cmd)
 if (not rtn) or (not str) then
  str = "実行失敗\r\n"
 end

 return rtn, string.format("# %s\r\n%s\r\n", cmd, str)
end

設定された環境変数
"ROUTER_NAME"を取得する関数

function router_name()
 local cmd = "show config"
 local ptn = "ROUTER_NAME=(%w+)"
 local rtn, str, name

 rtn, str = rt.command(cmd)
 if (rtn) and (str) then
  name = str:match(ptn)
 end

 return name
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 rtn, str, rt_name

-- ログの中で検出したい文字列
-- バックアップに切り替わったログ
local ptn_switch_tbl = {
 "TUNNEL%[1%]%: switched to backup",
 "%[KEEPALIVE%]%s+1%: unreachable",
 "Change IP route 172%.16%.1%.0/24 via TUNNEL%[2%] by Static"
}
-- メインに戻ったログ
local ptn_recover_tbl = {
 "TUNNEL%[1%]%: recovered from backup",
 "%[KEEPALIVE%]%s+1%: reachable",
 "Change IP route 172%.16%.1%.0/24 via TUNNEL%[1%] TUNNEL%[2%] by Static"
}

rt_name = router_name()
assert(rt_name, "環境変数 \"ROUTER_NAME\" を設定してください。")

while (true) do
 rtn, str = rt.syslogwatch(ptn_switch_tbl[log_ptn])
 if (rtn) and (str) then
  mail_tbl.text = "回線をバックアップに切り替えました。\r\n\r\nルーターの識別名: "
  mail_tbl.text = mail_tbl.text .. rt_name .. "\r\n\r\n"

  for i, cmd in ipairs(cmd_switch_tbl) do
   rtn, str = exec_command(cmd)
   mail_tbl.text = mail_tbl.text .. str
  end

  mail_tbl.subject = string.format("switched to backup (%s)", time_stamp())
  rtn = rt.mail(mail_tbl)
  if (not rtn) then
   rt.syslog(log_level, "failed to send mail. (Luaスクリプトファイル名)")
  end
 end

 rtn, str = rt.syslogwatch(ptn_recover_tbl[log_ptn])
 if (rtn) and (str) then
  mail_tbl.text = "回線をメインに戻しました。\r\n\r\nルーターの識別名: "
  mail_tbl.text = mail_tbl.text .. rt_name .. "\r\n\r\n"

  for i, cmd in ipairs(cmd_recover_tbl) do
   rtn, str = exec_command(cmd)
   mail_tbl.text = mail_tbl.text .. str
  end

  mail_tbl.subject = string.format("recovered from backup (%s)", time_stamp())
  rtn = rt.mail(mail_tbl)
  if (not rtn) then
   rt.syslog(log_level, "failed to send mail. (Luaスクリプトファイル名)")
  end
 end
end

[注釈の説明]

注釈1:
VPN(IPsec)に関係するパケットを通過させる設定です。

注釈2:
パターン3を使用する場合は、RTX1200(1)の設定に以下のコマンドを追加してください。
ip route change log on