どのくらい需要があるのかわかりませんが、うまくいったので結果を書き留めておきます。
やりたい事
FW の内側(つまりLAN内)に設置されている syslog 収集サーバで、WAN 側にあるサーバのログをリアルタイムに取得する。
やり方の概要
LAN 内にある syslog サーバから、収集したいサーバへ対して ssh 接続をおこない、ssh の持つリモートフォワード機能を使って経路を暗号化し、WAN 側にあるサーバのログをリアルタイムに syslog サーバへ転送します。
この方法を使うと、LAN 内のサーバから対象となるサーバへセッションを張るので、FW やルータ等でインバウンドのフィルター等を設定する必要がありません。
また、ssh 自体の通信は TCP なので ssh のセッションが生きている限りパケットの取りこぼしは原則発生しません。
ただし、TCP では何らかの原因で通信が切れてしまった場合、再接続しない限り通信は復活しません。この点、UDP で通信しているとタイムアウトまで待つ必要がなく、すぐに通信が回復するので運用的には楽だったりします。
※例えば、IP電話機とかで TLS を使って IP-PBX と接続していると、当然 TCP で通信することになり、IP-PBX が再起動したりすると、IP電話機側で TCP もしくはハートビートのタイムアウト後に再接続処理が走らないと(もしくはIP電話機をマニュアルで再起動とか)通信が復旧しません。
今回は、こんな感じで設定しました。
ssh -nN -R 20514:fuga.it-tutor.jp:10514 hoge.lonnie.cloud
fuga.it-tutor.jp が LAN 内にあるログ収集サーバで、hoge.lonnie.cloud が WAN 側にあってログを収集されるサーバとなります。
ポート番号については、hoge.lonnie.cloud の20514ポートと、fuga.it-tutor.jp の10514ポートが ssh のリモートフォワーディングで接続されます。
つまり、hoge.lonnie.cloud で 20514 ポートへパケットを放り込むと、fuga.it-tutor.jp の 10514 ポートにそのパケットがひょっこり出てくる…という感じです。
具体的な設定方法1
hoge.lonnie.cloud 収集されるサーバ(WAN側に設置されている)
/etc/rsyslog.conf に、
*.* @@127.0.0.1:20514
を追加します。
実際には、この辺に書き込んでおくと良いと思います。
###############
#### RULES ####
###############
*.* @@127.0.0.1:20514
#
# First some standard log files. Log by facility.
#
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
#cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
これは『rsyslog で扱う全てのログを、127.0.0.1 (つまり自分自身)の20514ポートへ転送する』という設定になります。
設定後は、rsyslog を再起動してください。
具体的な設定方法2
fuga.it-tutor.jp ログ収集サーバ(LAN内に設置されている)
/etc/rsyslog.conf に、
$ModLoad imtcp $InputTCPMaxSessions 500 $InputTCPServerRun 10514 :hostname, isequal, "hoge" -/var/log/hoge.log :hostname, isequal, "hoge" stop
上記の設定で、10514 番ポートに着信したパケットを rsyslog で取り込みます。外部から来たログ情報なので、ホスト名が記載されているので、この例では hoge というホスト名のログは、/var/log/hoge.log に記録するように設定しました。
こちらも、rsyslog.conf の設定変更がおわりましたら、rsyslog の再起動を忘れずに!
※ここで設定した hoge.log は、新しいログファイルなので、/etc/logrotate.d/rsyslog の設定にも hoge.log を追加するのを忘れないように…
次に肝心の ssh のリモートフォワーディングの設定ですが、この設定はシステムの起動時に自動実行される事と、仮に ssh の接続が切れてしまっても再接続が自動的に行われる必要があります。Jessie からは systemd がデフォルトなので、今迄のような init.d への設定とはやり方が違います。調べてみると、/etc/systemd/system に設定ファイルを置くのがお作法のようなので、そこに rsyslog-rssh.service というファイルを新規に作成します。
上記設定ファイルについては、こちらを参考にしました。
Raspbian jessieでSystemdを使った自動起動(@yosi-q さん、感謝!!)
[Unit] にある After は、指定されたサービスが立ち上がってから、このサービスを起動するという意味なので、ssh が使える様になったら起動ということで、After = ssh.service と設定しました。
また、RestartSec については『ssh のセッションが切れてから30秒待ってサービスを再起動する』としました。これで、接続先のサーバが reboot した場合にも対応できると思います。
※デフォルトの設定は 100msec で再起動なので、ちょっと短かすぎます。
この設定ファイルを /etc/systemd/system に置いてから、
# systemctl list-unit-files --type=service
を実行すると、
rsyslog-rssh.service disable
と表示されますので、
# systemctl enable rsyslog-rssh.service
これで、システム起動時に自動起動するようになります。
システムを reboot して、ps aux を実行すると、
root 643 0.0 0.2 46500 5592 ? Ss 14:22 0:00 /usr/bin/ssh -nN -R 20514:fuga.it-tutor.jp:10514 hoge.lonnie.cloud
のように表示されれば、ssh のリモートフォワーディングが実行されています。
tail -f /var/log/hoge.log
で、ちゃんとログが流れてくるか確認してください。
ご注意
設定方法は割愛しますが、LAN内の syslog サーバから、ログを収集するWAN側のサーバにたいして、問題無く ssh 接続出来る事が前提です。公開鍵を使った ssh 接続が必須なので、その点、ご留意ください。
Nagios でログファイルを監視
nagios でログファイルをチェックする場合、check_log というプラグインがあるのですが、そのプラグインを使うだけではうまく動作しません。
理由はファイルのパーミッションで、nagios は一般ユーザで動作しているので、/var/log にあるファイルを読む事ができません。
/etc/nagios-plugins/config/log.cfg を見ると、check_log は sudo で起動しているのがわかります。
つまり、sudores の設定に check_log で root 所有のファイルが読めるようにすれば問題が解決します。
具体的には、/etc/sudoers.d/ に、nagios というファイルを新規に作成します。
Defaults:nagios !requiretty nagios ALL=NOPASSWD:/usr/lib/nagios/plugins/check_log
!requiretty を付けないと、TTY からの入力を要求されますので、ご注意を!
また、標準のプラグインである check_log を入替える場合には、その入替えたプログラム名を指定してください。
これで、nagios がログファイルを読めるようになるので、正常に動作すると思います。
参考にしたサイト
動作環境
debian 8 jessie
kernel 3.16.0-7-amd64
openssh-client 6.7p1-5+deb8u7 amd64
rsyslog 8.4.2-1+deb8u2 amd64