Ubuntu 24.04LTS の rsyslog でリモート機器の Syslog メッセージを受信する
Ubuntu 24.04LTS はデフォルトで rsyslog サービスが動作していますが、514/UDP や 514/TCP を Listen しておらず、リモート機器から送信された Syslog メッセージは受信しません。 そこで今回は以下の方針で rsyslog を設定する方法をメモしておきます。
- 受信した Syslog メッセージはリモート機器毎に異なるファイルへ保存する
- ログファイルは
/var/log/rsyslog配下に作成する - リモート機器には Cisco IOS-XE 機器を使う
検証環境¶
| 対象 | バージョン |
|---|---|
| Ubuntu | 24.04LTS |
| rsyslog | 8.2312.0 |
| IOS-XE | 17.12.1 |
rsyslog サーバの設定¶
rsyslog の設定ファイルは /etc/rsyslog.conf ですが、このファイルから /etc/rsyslog.d/ ディレクトリ配下の .conf ファイルが読み込まれます ($IncludeConfig /etc/rsyslog.d/*.conf)。 Syslog メッセージを受信出来るようにするには 514/UDP を受信するように imudp モジュールを有効化します。 但し、デフォルトではローカルホスト (127.0.0.1 または localhost) からのメッセージもロギングしてしまう為、これらは除外します。
Syslog メッセージを保存するファイル名は $template で指定します。 %hostname% には Syslog メッセージを送信したノードのホスト名 (名前解決出来ない場合は IP アドレス) が代入されます。
cat << 'EOF' > /etc/rsyslog.d/99-remote.conf
module(load="imudp")
input(type="imudp" port="514")
if $fromhost-ip == '127.0.0.1' or $fromhost-ip == 'localhost' then {
stop
}
$template ClinetMessage,"/var/log/rsyslog/%hostname%.log"
*.* -?ClinetMessage
EOF
設定ファイルの作成が完了したら変更を反映する為に rsyslog サービスを再起動します。
IOS-XE 側の設定¶
IOS-XE 機器側はログのタイムスタンプをローカルの時刻 (JST) へ変更しておきます。 また必要であればローカルのログ用バッファサイズを調整 (拡張) しておきます。
service timestamps debug datetime msec localtime
service timestamps log datetime msec localtime
!
clock timezone JST 9 0
!
logging buffered 131072 debugging
Syslog サーバへログ送信する設定例は以下の通りです。
vrf を利用しない場合¶
logging facility local7
logging trap informational
logging source-interface GigabitEthernet0/0
logging host 10.0.0.1 transport udp port 514
vrf を利用する場合¶
logging facility local7
logging trap informational
logging source-interface GigabitEthernet0/0 vrf management
logging host 10.0.0.1 vrf management transport udp port 514
尚、vrf 指定されているインターフェイスへ logging source-interface を指定する際に「vrf を省略して設定」しようとすると以下のエラーになりました。
IOX-XE# configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
IOX-XE(config)# logging source-interface GigabitEthernet0/0
Interface GigabitEthernet0/0's vrf management does not match with cfg vrf
rsyslog サーバ側での確認¶
IOS-XE 側から Syslog メッセージを送信後に rsyslog サーバ側を確認するとログファイルが作成されていることが分かります。
ログローテーションの設定¶
ログローテーションさせるには例えば以下のように設定します。 設定後は logrotate -d /etc/logrotate.conf でドライランを実行して実行内容を確認しておきます。
cat << 'EOF' > /etc/logrotate.d/remote
/var/log/rsyslog/*.log
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
EOF
Linux から Syslog メッセージを送信する¶
「IOS-XE からの Syslog メッセージを rsyslog サーバ側で受信出来ない」などの場合は Linux → Linux へ Syslog メッセージを送信して切り分けを行います。 このようなトラブルシューティングを行うには Linux の logger コマンドを利用することが出来ます。 logger コマンドは以下のように利用します。 尚、logger コマンドはデフォルトで 514/UDP を利用する為、ポートを変更していない場合は明示的にポート指定を行う必要はありません。
タグを指定する場合¶
タグを指定する場合、クライアント側では以下のように実行します。
サーバ側では以下のように記録されました。
タグを指定しない場合¶
タグを指定していない場合、クライアント側では以下のように実行します。
サーバ側では以下のように記録されました。 タグ部分には「実行したユーザ名」が含まれるようです。
参考¶
/etc/rsyslog.conf¶
# /etc/rsyslog.conf configuration file for rsyslog
#
# For more information install rsyslog-doc and see
# /usr/share/doc/rsyslog-doc/html/configuration/index.html
#
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf
#################
#### MODULES ####
#################
module(load="imuxsock") # provides support for local system logging
#module(load="immark") # provides --MARK-- message capability
# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")
# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")
# provides kernel logging support and enable non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on")
###########################
#### GLOBAL DIRECTIVES ####
###########################
# Filter duplicated messages
$RepeatedMsgReduction on
#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog
#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog
#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
logger コマンドのヘルプ¶
# logger --help
Usage:
logger [options] [<message>]
Enter messages into the system log.
Options:
-i log the logger command's PID
--id[=<id>] log the given <id>, or otherwise the PID
-f, --file <file> log the contents of this file
-e, --skip-empty do not log empty lines when processing files
--no-act do everything except the write the log
-p, --priority <prio> mark given message with this priority
--octet-count use rfc6587 octet counting
--prio-prefix look for a prefix on every line read from stdin
-s, --stderr output message to standard error as well
-S, --size <size> maximum size for a single message
-t, --tag <tag> mark every line with this tag
-n, --server <name> write to this remote syslog server
-P, --port <port> use this port for UDP or TCP connection
-T, --tcp use TCP only
-d, --udp use UDP only
--rfc3164 use the obsolete BSD syslog protocol
--rfc5424[=<snip>] use the syslog protocol (the default for remote);
<snip> can be notime, or notq, and/or nohost
--sd-id <id> rfc5424 structured data ID
--sd-param <data> rfc5424 structured data name=value
--msgid <msgid> set rfc5424 message id field
-u, --socket <socket> write to this Unix socket
--socket-errors[=<on|off|auto>]
print connection errors when using Unix sockets
--journald[=<file>] write journald entry
-h, --help display this help
-V, --version display version
For more details see logger(1).