RTX1210でVPNアクセスがあった時にメール通知する!

なぜ?
ヤマハのRTXルーターにリモートアクセスVPN(L2TP/IPsec又はPPTP)の設定をして何年か使ってきましたが、その間ずっと思ってきたことがあります。それは、RTXルーターにVPN接続があったことをVPNユーザー名と共に知りたいということ。いちいちsyslogを遡って確認するのではなく、例えばVPN接続があったらその時点でメールで知らせてくれたらどんなに便利だろうと思っていた。この度、RTX1210に乗り換えたこともあり、どうすれば実現できるか調べてみた。
調査結果
RTXルーターには不正アクセスがあった場合なんかにメール通知するというコマンドはあるけども、VPN接続があったことをメール通知してくれるそれ専用の機能はない(はず)。他の方法を探すと、なにやらRTXルーターはLuaスクリプト(ヤマハ公式サイト)というものが実行できるらしく、設定サンプルを見るとsyslogを拾ったりshowコマンドで出力する情報をメールで通知できるということが分かった。この方法しかない!ということで早速スクリプトを作ってみた。
Luaスクリプトを作る!
VPN接続があったことを知るための方法はいくつかあると思いますが、今回はsyslogに出力される以下の1行があったらVPN接続があったと判断し、この1行をそのままメール通知するようにします。
2015/01/27 10:10:00: PP[ANONYMOUS01] Call detected from user '(ユーザー名)'

作ったLuaスクリプト(ダウンロードはこちら
--------------------------##  設定値  ##--------------------------------

-- 検出したい SYSLOG の文字列パターン
ptn = " Call detected from user "

-- メールの設定
mail_tbl = {
	smtp_address = "(SMTPサーバーのアドレス)",
	smtp_port = "587",              ← SMTP認証の場合(例)
	smtp_auth_protocol = "plain",        ← SMTP認証の場合(例)
	smtp_auth_name = "(アカウント名)",    ← SMTP認証の場合
	smtp_auth_password = "(パスワード)",    ← SMTP認証の場合
	from = "(送信元メールアドレス)",
	to = "(宛先メールアドレス)"
}

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

----------------------##  設定値ここまで  ##----------------------------

------------------------------------------------------------
-- 現在の日時を取得する関数                               --
------------------------------------------------------------
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

while (true) do
	rtn, str = rt.syslogwatch(ptn)  -- SYSLOG の監視(SYSLOG の出力が行われない間、呼び出し元の Lua タスクはスリープ状態になる)。
	if (rtn) and (str) then
		mail_tbl.text = string.format("ログに検索文字列が検出されました。\r\n検索文字列: \"%s\"\r\n\r\n", ptn)
		mail_tbl.text = mail_tbl.text .. str[1]
		mail_tbl.subject = string.format("VPNアクセスあり (%s)", time_stamp())
		rtn = rt.mail(mail_tbl)
		if (not rtn) then
			rt.syslog(log_level, "failed to send mail. (Lua スクリプトファイル名)")
		end
	end
end
通知されるメール本文
Model: RTX1210
Revision: Rev.14.01.05
Time: 2015/01/27 10:10:01

ログに検索文字列が検出されました。
検索文字列: " Call detected from user "

2015/01/27 10:10:00: PP[ANONYMOUS01] Call detected from user '(ユーザー名)'
実行方法
Luaスクリプトを実行するためには、Windows(等)で作成したLuaスクリプトをRTXルーターに転送しなければなりません。方法は2つ、microSDカードやUSBを経由するか、TFTPで転送する方法です。実行エラー(バグ)があると媒体経由は手間がかかるので、TFTPで転送した方が楽だと思います。TFTPクライアントはWindowsに標準搭載(コマンドプロンプトで実行できる)されていますが、標準状態では利用出来ないので、コントロールパネルのプログラム一覧のところにある「Windowsの機能の有効化または無効化」というところでTFTPクライアントを有効化します。

さてRTX側ですが、RTXはRTFSというWindowsと同じようなディレクトリ構造を持っているようです(RTFSはルーターの内蔵フラッシュROMに構築されるファイルシステム)。ここにLuaスクリプトを格納します。今回はルートディレクトリ配下にluaというディレクトリを作成し、その中にluaスクリプト(vpnmail.lua)を格納して実行します。
# tftp host 192.168.X.Y ← 特定のIPアドレスからのTFTP接続(Windows)を許可。
# show file list / all ← ルートディレクトリ配下すべてのディレクトリ・ファイルを表示。
# make directory /lua ← ルートディレクトリ配下にluaディレクトリを作成。

→ここでWindowsからTFTPでluaスクリプトを転送する。
 Windowsコマンドプロンプト例
  >tftp 192.168.X.Z(RTXルーターIP) put C:\xxx\vpnmail.lua(Windows格納Luaスクリプトパス) /lua/vpnmail.lua/pass(RTX Administratorパス)

# lua /lua/vpnmail.lua ← 格納したluaスクリプトを実行。
# show status lua running ← 実行中のlua表示。
※ # terminate lua 1 ←luaを強制終了(↑で実行中のluaを表示してその Lua Task ID を指定)。

# schedule at 2 startup * lua /lua/vpnmail.lua ← ルーター起動時にluaスクリプトを自動実行

ではVPN接続してみましょう。ちゃんとメールが届いたら成功です。エラーになった場合はsyslogにメッセ―ジが出力されるので確認してみましょう。