ルータのログをサーバに取り込む
Buffaloのルータ・VS-1000のログを取り続けたかったのですが、VS-1000にはある程度してしまうと
消えてしまいます。
そこで、Linuxの方に保存することにしてもう少し長く保管することにしました。
【更新】Vinelinux6.3からAlmalinux9.3に変更しました。@20240104
バージョンが異なっているので、全面改定をします。
OS:VineLinux6.2 32bitAlmaLinux9.3 64bit
ルータ:Buffalo VR-S1000
★ソフト情報
・rsyslog 8.2102.0
・logrotate 3.18.0
★インストール
1.root権限でdnfコマンドを使います。
# dnf install rsyslog logrotate
デフォルトでインストールされている可能性が高いので、以下の方法で確認もできます。
# dnf list --installed rsyslog
インストール済みパッケージ
rsyslog.x86_64 8.2102.0-117.el9 @appstream
# dnf list --installed logrotate
インストール済みパッケージ
logrotate.x86_64 3.18.0-8.el9 @baseos
★ファイヤーウォールを解除
外部からのルータデータを受けるためには外部からブロックしているものを解除します。
syslog は UDP と TCP でデータが流れるようになっています。
最初は UDP でデータを送ってきますが、ある一定量を超えると、TCP に送信を変化させます。
これには理由があり、手順が少なく送信できる UDP で送った方が早く情報を相手に送れるという有利な点があります。
しかし、1度に送れるデータ量に限界があり、超えた場合は TCP で送信するようになっています。
この辺りは、ネームサーバの仕様と同じ考えて設計されているように思います。真相は知りません m(_|_)m
●UDP の解除
root権限で操作します。
# firewall-cmd --add-port=514/udp --permanent
success
●TCP の解除
# firewall-cmd --add-port=514/tcp --permanent
success
●確認
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dns ntp
ports: 514/udp 514/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
●ルータの解除
ルータはそれぞれ各自の設定を見直してください。
上記で書いたように、UDP と TCP の 514 番ポートを開けて下さい。
また、指定ができるなら DMZ の syslog を送りたいサーバを指定してください。
指定ができない場合は、DMZ をすべて開けることになると思います。
セキュリティとして問題がある場合は、この作業を戻してログをあきらめて下さい。
★ rsyslog.conf の設定
syslog の設定を行います。
root 権限で処理を進めます。
# cd /etc
# vi rsyslog.conf
● UDP と TCP を使えるようにする
「#### MODULES ####」欄にある module 行と input 行のコメントを外して有効にします。
【変更前】
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
#module(load="imudp") # needs to be done just once
#input(type="imudp" port="514")
# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
#module(load="imtcp") # needs to be done just once
#input(type="imtcp" port="514")
【変更後】
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514")
●取込むキーワードを設定する
ログファイルには形式があります。その形式をサンプル行を分解しながら解説します。
【サンプル行】
Jan 1 05:00:13 hoge.usi.nu ntpclient[3605]: System update time:Mon Jan 1 05:00:13 2024
【分解】
名称 | 命令語 | 内容 |
日時 | timegenerated | Jan 1 05:00:13 |
サーバ名 | hostname | hoge.usi.nu |
タグ | syslogtag | ntpclient[3605]: |
ログ内容 | msg | System update time:Mon Jan 1 05:00:13 2024 |
内容を文章にすると、
1月1日午前5時0分13秒にhoge.usi.nuサーバが時間合わせを行い、
システムの時間を2024年1月1日月曜日午前5時0分13秒に合わせた。
となります。
ログは何も指定をしないと /var/log/messages に記録されます。
膨大なログの中から探すとなると見やすさが無くなり、トラブル検証にも不向きです。
そこで今回は hostname の一部に注目します。ズバリ「ドメイン」です。
syslog を送ってくる先が動的IPアドレスの場合、ドメインは変更ありません。
ただ、固定IPが相手の場合はフルドメインを採用しても良いと思います。
今回は、ログに「usi.nu」があるものは、/var/log/usilog に保存する!! という方針で設計します。
◎プロバイダによっては hostname で決まりを作ることが難しい場合があります。
そういう時は、ログをしばらく見ていると法則のようなものが出るときがあります。
法則がわかればルールを作れますので、不変の文字列を見つけてください。
rsyslog の文法は以下の通りです。
命令語.条件.キーワード
条件は5つあります
条件 | 説明 |
contains | キーワードの値を含む |
isequal | 指定した値と完全に一致する |
startswith | 指定した値で始まる |
regex | 指定した値を正規表現とし、それにマッチする |
eregex | 指定した値を拡張正規表現とし、それにマッチする |
!条件 | 条件の前に「!]を置くとアンマッチの場合反応します |
root 権限でファイルを開きます。
# cd /etc
# vi rsyslog.conf
#### RULES ####
# Buffalo Router VR-S1000
:hostname,contains,"usi.nu" /var/log/router
& stop
今回は、命令語が「hostname」で条件が「contains」つまり、次のキーワードを含む事。
キーワードは「usi.nu」となります。そして、対象ログは「/var/log/router」というファイルに保存する。
言い換えると『hostnameにusi.nuが含まれているログを/var/log/routerに保存する』となります。
最後にある「& stop」はルールがヒットすると、この行で終了。 という意味です。
これが無いと、更に検索は進み最後は何でも受け入れる messages に保存されます。
ログが二重に保存されると、後で解析が大変になるので、ヒットしたログは止めてしまった方が良いと思っています。
★再起動
●設定が終わったら再起動
再起動を実行し、rsyslog.conf を読込ませてログができるか確認します。
# systemctl restart rsyslog.service
#
エラー表示が出なければ、再起動は完了です。
気になる場合はステータスも確認してください。
# systemctl status rsyslog
● rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; preset: >
Active: active (running) since Tue 2024-01-09 14:32:22 JST; 6s ago
Docs: man:rsyslogd(8)
https://www.rsyslog.com/doc/
Main PID: 310214 (rsyslogd)
Tasks: 3 (limit: 11045)
Memory: 1.1M
CPU: 38ms
CGroup: /system.slice/rsyslog.service
mq310214 /usr/sbin/rsyslogd -n
1月 04 12:00:00 hoge.usi.nu systemd[1]: Starting System Logging Service...
1月 04 12:00:00 hoge.usi.nu rsyslogd[310214]: [origin software="rsyslogd" swVer>
1月 04 12:00:00 hoge.usi.nu systemd[1]: Started System Logging Service.
1月 04 12:00:00 hoge.usi.nu rsyslogd[310214]: imjournal: journal files changed,>
loaded欄に「enable」があり、Active欄が「active」の場合は起動していることになります。
★ログローテート
●ログの処理
ログは、どんどん溜まります。1つのファイルにあまり膨大に持つことは好ましくありません。
他のログも、一週間で代替ファイルを変更しています。そして、5世代目は削除されています。
何世代残すかは調整可能ですが、今回はデフォルトのままで処理をしたいと思います。
ログの管理は「logrotate」というプログラムが管理しています。
設定ファイルは「/etc」にあります。
# cd /etc
# ls -ld logrotate*
-rw-r--r-- 1 root root 496 3月 17 2023 logrotate.conf
drwxr-xr-x. 2 root root 4096 1月 5 14:26 logrotate.d
# ls -l logrotate.d/
合計 72
-rw-r--r-- 1 root root 91 4月 1 2021 bootlog
-rw-r--r-- 1 root root 130 10月 14 2019 btmp
-rw-r--r-- 1 root root 160 8月 29 2022 chrony
-rw-r--r-- 1 root root 88 9月 9 2022 dnf
-rw-r--r-- 1 root root 93 12月 13 09:28 firewalld
-rw-r--r-- 1 root root 331 9月 27 19:25 httpd
-rw-r--r--. 1 root root 172 7月 30 2021 iscsiuiolog
-rw-r--r-- 1 root root 162 12月 21 21:38 kvm_stat
-rw-r--r-- 1 root root 69 9月 26 06:32 libreswan
-rw-r--r-- 1 root root 514 11月 8 01:28 named
-rw-r--r-- 1 root root 203 12月 20 16:06 php-fpm
-rw-r--r--. 1 root root 312 3月 26 2022 psacct
-rw-r--r-- 1 root root 243 1月 5 14:20 rsyslog
-rw-r--r--. 1 root root 68 3月 31 2022 sa-update
-rw-r--r-- 1 root root 155 11月 7 23:42 samba
-rw-r--r-- 1 root root 237 12月 13 17:43 sssd
-rw-r--r-- 1 root root 188 9月 27 18:18 vsftpd
-rw-r--r-- 1 root root 145 10月 14 2019 wtmp
見た感じでは、一般的な設定は「rsyslog」に入っていました。
そこで、今回の設定は「rsyslog」内のやり方をコピーする事にします。
中身を確認します。
# cat logrotate.d/rsyslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
missingok
sharedscripts
postrotate
/usr/bin/systemctl -s HUP kill rsyslog.service >/dev/null 2>&1 || true
endscript
}
/var/log にあるよく見るファイルが列記されていて、最後に増やしているようです。
ならば、1行今回のファイルを追記してみます。
追記する内容は
/var/log/router
です。
# vi logrotate.d/rsyslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
/var/log/router <--- 追加
{
missingok
sharedscripts
postrotate
/usr/bin/systemctl -s HUP kill rsyslog.service >/dev/null 2>&1 || true
endscript
}
これで、日曜日の午前0時にファイルを更新してくれるようになります。
logrotate は設定すれば即反映なので再起動は不要です。
★VR-S1000を設定
●syslogを送る設定をします。
「有効」にチェックを入れて、サーバのIPアドレスを入力し「保存」ボタンを押します。
これで、設定は終わりです。うまくいきますよーに
【データ送信確認(その1)】
信号がサーバまできているかどうかはTCPDUMPを使うとわかります。
#tcpdump -s0 -i eth0 -X port 514
TCPの信号で、514ポートにどんな信号が来ているのか表示します。
ここで表示されるとルータからサーバまで信号がきています。
---------------
2014/11/29 初版
2015/03/15 rsyslog.confの変更
2015/04/15 おまけ1を加筆。
送信サーバの制限。TCPプロトコルについて加筆。
2024-01-04 OS・プログラムの更新に伴う全面改訂 初版ページ
Let's PCのTopに戻る
ホームページのTopに戻る