Skip to content

Ubuntu 24.04LTS の rsyslog でリモート機器の Syslog メッセージを受信する

Ubuntu 24.04LTS はデフォルトで rsyslog サービスが動作していますが、514/UDP や 514/TCP を Listen しておらず、リモート機器から送信された Syslog メッセージは受信しません。 そこで今回は以下の方針で rsyslog を設定する方法をメモしておきます。

  1. 受信した Syslog メッセージはリモート機器毎に異なるファイルへ保存する
  2. ログファイルは /var/log/rsyslog 配下に作成する
  3. リモート機器には 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 アドレス) が代入されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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 サービスを再起動します。

systemctl restart rsyslog.service

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 サーバ側を確認するとログファイルが作成されていることが分かります。

# ls /var/log/rsyslog/
10.0.0.101.log  10.0.0.102.log  10.0.0.103.log

ログローテーションの設定

ログローテーションさせるには例えば以下のように設定します。 設定後は logrotate -d /etc/logrotate.conf でドライランを実行して実行内容を確認しておきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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 を利用する為、ポートを変更していない場合は明示的にポート指定を行う必要はありません。

タグを指定する場合

タグを指定する場合、クライアント側では以下のように実行します。

logger -t "TAG" "MESSAGE" -i -n 10.0.0.1

サーバ側では以下のように記録されました。

# cat /var/log/rsyslog/10.0.0.99.log
2024-08-11T08:08:44.084948+09:00 10.0.0.99 TAG[948] MESSAGE

タグを指定しない場合

タグを指定していない場合、クライアント側では以下のように実行します。

logger "MESSAGE" -i -n 10.0.0.1

サーバ側では以下のように記録されました。 タグ部分には「実行したユーザ名」が含まれるようです。

# cat /var/log/rsyslog/10.0.0.99.log
2024-08-11T08:13:02.350590+09:00 10.0.0.99 root[1007] MESSAGE

参考

/etc/rsyslog.conf

 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
# /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 コマンドのヘルプ

 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
# 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).