rtx1210は高価だけどネットワークの勉強をするにはいい教材。 業務でも稀に箱モノの設定することがあるから、頭の体操にもなる。

ブラウザでログインしてポチポチ設定することから初め、設定ファイルを入れ込めば複雑なことができることもわかった。

コマンドラインでいろいろできることがわかったとき、設定ファイルがその積み上げ結果というのもわかった。

ブラウザから設定保存するとconfig0.txtっていうファイルが作成できる。

ログ監視

この設定ファイルに以下の内容を追記して、ログ監視してみる。 やってることはembedded fileっていうのを定義しておき、この内容をルータ起動時から実行させる。

ヤマハのページにsyslog監視のサンプルがあった。他にもいくつかググって方法を探し、試しながら作成。

検出したい文字列は、いったんlinuxの監視処理で使ってたものをそのまま流用。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
embedded file tmp.txt <<EOF
--[[

  ●SYSLOG 監視スクリプト-gvis
  SYSLOG を監視し、特定の文字列が含まれたログを検出したら、
  指定したshow log コマンドの出力結果を管理者にメールで
  送信するスクリプト。

  メール本文には監視実施日の日付に検出された特定の文字列の履歴を含みます。

  原本はyamahaさまの以下のページにあったものから改造作成し、
  複数文字列を監視するようにしている。
  
  https://network.yamaha.com/setting/router_firewall/monitor/lua_script/syslog

]]


--------------------------##  設定値  ##--------------------------------

-- 検出したい SYSLOG の文字列パターン
ptn_tbl = {                         -- ★
    "error",
    "ERROR",
    "Error",
    "fail",
    "Fail",
    "FAIL",
    "panic",
    "Panic",
    "PANIC",
    "warn",
    "Warn",
    "WARN",
    "respond",
    "connect",
    "TUNNEL",
    "Login",
    "Logout",
    "Restarting router"
}

-- ptn の文字列パターンを検出したときに結果を通知する show コマンド
cmd_whenFind = "show log reverse"   -- ★

-- メールの設定
mail_tbl = {                        -- ★
    smtp_address = "smtp.xxxx.jp",
    from = "xxxx@gavann-it.com",
    to = "xxxx@gavann-it.com"
}

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

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


------------------------------------------------------------
-- コマンドを実行結果を出力する関数                       --
------------------------------------------------------------
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

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

------------------------------------------------------------
-- 今日の日付を取得する関数                               --
------------------------------------------------------------
function date_today()
    local today

    today = os.date("*t")
    return string.format("%d/%02d/%02d", 
        today.year, today.month, today.day)
end

------------------------------------------------------------
-- メインルーチン                                         --
------------------------------------------------------------
local rtn, logstr

while (true) do

    -- SYSLOGから何か追加された文字列を格納するまで待つ
    rtn, logstr = rt.syslogwatch(".*")

    -- SYSLOG文字列が何か拾えたらマッチする文字列を探す
    if (rtn) and (logstr) then
        for i, str in ipairs(logstr) do
            for j, ptn in ipairs(ptn_tbl) do

                -- マッチする文字列があったらメールする
                if string.find(str, ptn) ~= nil then
                    mail_tbl.text = string.format("ログに検索文字列が検出されました。\r\n検索文字列: \"%s\"\r\n\r\n", ptn)

                    runCmd = cmd_whenFind .. " | grep " .. ptn .. " | grep " .. date_today()
                    rtn, str = exec_command(runCmd)
                    mail_tbl.text = mail_tbl.text .. str

                    mail_tbl.subject = string.format("auto)alertReport-Netlog-rtx1210 (%s)", time_stamp())
                    rtn = rt.mail(mail_tbl)
                    if (not rtn) then
                        rt.syslog(log_level, "failed to send mail. (syslogWatch-rtx1210lua)")
                    end
                end
            end
        end
    end
end


EOF

embedded fileの定義を起動時から実行するように設定ファイルに書いておくと、SYSLOGを監視してくれる。

schedule at 1 startup * lua emfs:/tmp.txt

この監視のおかげで、監視キーワードがログで見つかる都度メールしてくれるようになる。

172.16.17.xxのwindowsの仮想マシンからssh接続したり、ブラウザで接続したら"Login"ってのがログに載って監視スクリプトが反応してくれる。

例えば本文はこんな感じ。イベント発生から数秒でメールが飛んでくる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Model: RTX1210
SystemName: RTX1210_S4H013716
Revision: Rev.14.01.38
Time: 2021/06/15 08:02:37

ログに検索文字列が検出されました。
検索文字列: "Login"

# show log reverse | grep Login | grep 2021/06/15
2021/06/15 08:02:31: Login succeeded for SSH: 172.16.17.xx nari
2021/06/15 08:01:57: Login succeeded for SSH: 172.16.17.xx nari
2021/06/15 07:10:08: Login succeeded for SSH: 172.16.17.xx nari
2021/06/15 07:09:34: Login succeeded for SSH: 172.16.17.xx nari
2021/06/15 05:35:42: Login succeeded for SSH: 172.16.17.xx nari

おかげで、linuxで1分ごとにsyslog監視処理動かしてたのをやめて、この処理に切り替えた。

linuxは24h365day稼働させてたけど、電気もったいないかなぁって思い始めたので、毎日8h程度の利用に縮めることができた。

あとで気づいたこと

メールで25番ポートが飛ばなくなり、smtp認証設定をlinux内で 追加したことがある。

そのときはそれでメデタシメデタシってなったけど、rtx1210から急にメールが飛ばなくなって、この監視処理にも変更が必要なことに気づいた。

最初は本体のsmtp設定を変える必要があるなって思ってて、mail server smtpのコマンドラインで設定をいじろうとしてた。

1
2
3
4
5
mail server name 1 gvis
mail server smtp 1 smtp.xxxx.jp port=587
mail template 1 1 From:xxxx@gavann-it.com To:xxxx@gavann-it.com
mail notify 1 1 trigger lan-map
mail notify 2 1 trigger status all

587でうまく飛ばないなら465にしてみたり。

そしたらログにこんなメッセージ出るようになるし、smtpの設定変更するたびに再起動かかって「なんやねんこれは」ってなった。

1
2
_gateway  [MAIL] [11]Mail Wait Service Is Timeout(mail: 1 sec)
_gateway  [MAIL] [11]Mail IO Service Is Timeout(mail: 60 sec)

地味に悩んでボーっとログ眺めてたら、3回リトライ後にメール送信あきらめてるのが見えた。

1
2
_gateway  [MAIL] [11]Give up to Retry Mail Service(mail)
failed to send mail. (syslogWatch-rtx1210lua)

んんん!? syslogWatch-rtx1210luaってembedded fileの中に書いた箇所やんけ。

よく見ると、smtpのこと書いている箇所があるのを思い出した。

1
2
3
4
5
6
-- メールの設定
mail_tbl = {                        -- ★
    smtp_address = "smtp.xxxx.jp",
    from = "xxxx@gavann-it.com",
    to = "xxxx@gavann-it.com"
}

こりゃあかん。 本体のsmtp設定やなくて、ここ直さなあかん。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
-- メールの設定
mail_tbl = {                        -- ★
    smtp_address = "smtp.xxxx.jp",
    smtp_port = "587",
    smtp_auth_protocol = "plain",
    smtp_auth_name = "xxxx@gavann-it.com",
    smtp_auth_password = "xxxx",
    from = "xxxx@gavann-it.com",
    to = "xxxx@gavann-it.com"
}

メール飛ばんなぁって、気づくのに1日かかった。