【syslog入門 第10回】syslogのトラブルシュート ― 切り分けの手順、loggerとtcpdump、Windowsから確かめる、受信側の関所、UDPの欠損とレート制限、時刻・文字化け・ディスク

syslog入門 第10回 syslogのトラブルシュート SYSLOG サーバー

「新しく入れたスイッチのログだけ、ログサーバーに届きません」
「障害で一番ログが欲しい時間帯に限って、ログが抜けています」

ログが届かない原因は、送信側・経路・受信側のどこにでもあり得ます。やみくもに設定を見直すより、1か所で見て、範囲を半分に絞るほうが早く着きます。

第10回では、第1回〜第9回の知識を使って、syslogのトラブルの切り分けをまとめます。最後に連載の早見表も載せます。


切り分けの手順

段階確認することLinuxWindows
0 症状を固めるどの送信元が・全部か一部か・常にか時々か・いつから受信側のファイルを送信元で grep送信元のイベントを Get-WinEvent で確認
1 送信側で出ているかログの生成、転送の設定、送信側のファイアウォール、レート制限logger -n サーバー -P 514 -T “test”、rsyslogd -N1、journalctl -u rsyslogeventcreate でテストのイベント、wecutil gr 購読名(WEF)
2 経路で届いているか受信側の NIC にパケットが来るか、途中の FW・NAT・送信元 IP受信側で tcpdump -i any -nn port 514Test-NetConnection サーバー -Port 6514(TCP のみ)、pktmon
3 受信側で受け取っているか待ち受け、firewalld、SELinux、UDP の受信エラーss -ulnp、firewall-cmd –list-all、nstat -az UdpRcvbufErrorsGet-NetUDPEndpoint -LocalPort 514、netstat -s -p udp
4 保存され、見つかるか振り分け先、ホスト名、時刻、文字コード、ディスクdf -h /var/log、受信時刻と機器の時刻の比較Get-WinEvent -ListLog ForwardedEvents
送信元(アプリからrsyslog・journald)、経路(拠点のFW・NAT・ルーター)、受信サーバー(NIC、カーネルのfirewalld・SELinux・受信バッファー、rsyslogの待ち受け・フィルター、ファイル・検索基盤)の流れで、受信側のNICでtcpdumpで見えるかを確かめ、来なければ①送信側と②経路を、来れば③受信側と④保存を調べることと、NICで1回見るだけで疑う範囲が絞れることを示す図

まず受信側でtcpdumpを取り、届いていれば受信側(段階3・4)、届いていなければ送信側か経路(段階1・2)と、真ん中から二分すると早く絞り込めます。調べるときは、送信元のIPアドレスと時刻(UTC)を必ず控えます。

ポイント
受信側のNICで1回見るだけで、疑う範囲が「送信側・経路」か「受信側」かに絞れる。


送信側と経路を確かめる:loggerとtcpdump

# 受信側(192.0.2.10)で先に起動しておく
$ sudo tcpdump -i any -nn port 514
# 送信側(192.0.2.31)からテストのメッセージを送る
$ logger -n 192.0.2.10 -P 514 -d -t test "syslog test via UDP"   # UDP
$ logger -n 192.0.2.10 -P 514 -T -t test "syslog test via TCP"   # TCP
logger: failed to connect to 192.0.2.10 port 514                 # TCP は失敗が分かる
# 受信側の表示(UDP が届き、待ち受けがない場合)
10:23:45.123456 ens192 In  IP 192.0.2.31.51234 > 192.0.2.10.514: SYSLOG user.notice, length: 51
10:23:45.123506 ens192 Out IP 192.0.2.10 > 192.0.2.31: ICMP 192.0.2.10 udp port 514 unreachable, length 87
送信側192.0.2.31でlogger -dのUDPは届かなくても成功で終わり、-TのTCPはlogger: failed to connectと失敗が表示され、受信側192.0.2.10のtcpdumpでIn IP 192.0.2.31.51234 > 192.0.2.10.514: SYSLOGの行があれば経路は通っていて、Out ICMP … port 514 unreachableが返れば届いたが受信側が待ち受けていないことと、loggerの終了コードは当てにならず届いたかの答えは受信側のtcpdumpにあることを示す図
  • UDPは送りっぱなし。logger -dは相手がいなくても成功で終わるため、届いたかは受信側のtcpdumpで確かめる。-d・-Tを付けないとUDPを先に試すので、方式は明示する
  • -Tだけではポートがsyslog-conn(601)になるため、-P 514を付ける(第3回)。TLS(6514)はloggerでは試せないので、openssl s_client -connect サーバー:6514で証明書まで確かめる
  • Inの行があれば経路は通っている。続けてICMP … port 514 unreachableが返るなら、届いているのに受信側が待ち受けていない(後の節)。中身は-A、FacilityとSeverityは-vで見られる

Windowsから確かめる

PS> Test-NetConnection logsv01.corp.example.jp -Port 6514
ComputerName     : logsv01.corp.example.jp
RemoteAddress    : 192.0.2.10
RemotePort       : 6514
InterfaceAlias   : Ethernet
SourceAddress    : 192.0.2.41
TcpTestSucceeded : True
PS> $u = [System.Net.Sockets.UdpClient]::new()          # UDP は「送るだけ」なら標準でできる
PS> $b = [Text.Encoding]::UTF8.GetBytes('<14>1 - pc01 test - - - syslog test from Windows')
PS> $u.Send($b, $b.Length, 'logsv01.corp.example.jp', 514); $u.Close()
48
PS> eventcreate /T INFORMATION /ID 999 /L APPLICATION /SO SyslogTest /D "forward test"
Windows PC 192.0.2.41からlogsv01 192.0.2.10へ、TCP 6514はTest-NetConnectionでSYN→SYN/ACKが返ればTrue(TLSの証明書は検証しない)、UDP 514はUdpClient.Sendで送ったバイト数(48)が返るだけで届いたかは分からずtcpdumpで到着を確認し、eventcreateでイベントログに書いてWEF・NXLog経由の転送を試せることと、Windows標準の道具ではUDPが届いたかは受信側でしか確かめられないことを示す図
  • つながらないときは、先頭に「警告: TCP connect to 192.0.2.10:6514 failed」と出て、TcpTestSucceededがFalseになる。このときは ping も試され、PingSucceeded(ICMPの結果で、TCPの可否とは別)が加わる。Windows Server 2016 では、つながったときもPingSucceededが表示される
  • Test-NetConnection -PortはTCPの接続だけを試す。TCP 514・6514の接続の可否は分かるが、UDP 514が届くかは確かめられず、TLSの証明書の検証もしない
  • UdpClientのSendの戻り値は送ったバイト数だけで、届いたかは受信側のtcpdumpで確かめる
  • eventcreate(管理者)はイベントログに書くので、WEFやNXLog経由の転送を試せる(第6回)
  • Windowsでパケットを見るなら、標準のpktmon(filter add -p 514 → start -c → stop → etl2txt PktMon.etl)を使う

受信側を確かめる:待ち受け・ファイアウォール・SELinux

冒頭の「新しいスイッチのログだけ届かない」で、tcpdumpには見えるのにファイルに無い場合は、ここを疑います。

確認することLinux(RHEL)Windows(受信側の場合)見るところ
待ち受けているかss -ulnp ‘sport = :514’、ss -tlnpGet-NetUDPEndpoint -LocalPort 514rsyslogd が 0.0.0.0 か、特定の IP だけか
設定が読めているかrsyslogd -N1、journalctl -u rsyslogサービスとアプリのイベントログimudp・imtcp の読み込み、TLS 用のパッケージ(rsyslog-gnutls 等)
ファイアウォールfirewall-cmd –list-all、–add-service=syslog(UDP 514)、–add-service=syslog-tls(6514)、–add-port=514/tcpGet-NetFirewallPortFilter -Protocol UDP | Where-Object LocalPort -eq 514 | Get-NetFirewallRule許可したポートと実際の受信の方式が合っているか
SELinuxsemanage port -l | grep syslog、ausearch -m AVC -ts recent、semanage port -a -t syslogd_port_t -p tcp 30514—既定にないポートで受けるときは追加が必要
受け取った後ルールセット・フィルター・$AllowedSender、振り分け先のファイルwecutil gr 購読名(WEF)送信元 IP やホスト名の条件で捨てていないか
届いたパケットをNIC(tcpdumpはここで見る、FWより手前)、firewalld(syslog=UDP 514、syslog-tls=TCP 6514、TCP 514は別に許可)、SELinux(syslogd_port_tのポートだけ受ける、30514などは追加)、rsyslog(imudp・imtcpの待ち受け、ルールセット・$AllowedSender)、/var/log/remote/(振り分け先のファイル、UbuntuはAppArmorの許可も)の順に通り、ここで止まるとtcpdumpには見えるのに保存されないので、3つの関所を手前から順に確かめることを示す図

tcpdumpは、ファイアウォールより手前でパケットを見ます。tcpdumpに見えるのにrsyslogに届かないときは、受信側のファイアウォール・SELinux・待ち受けを疑います(第4回の3つの関門)。UbuntuはrsyslogをAppArmorで制限しており、既定外の保存先には/etc/apparmor.d/rsyslog.d/で許可が要ります。


ときどき抜ける:UDPの欠損とレート制限

冒頭の「一番欲しい時間帯に限って抜ける」の、2つの原因です。

$ nstat -az UdpInErrors UdpRcvbufErrors            # 受信側:増え続けるならバッファーのあふれ
UdpInErrors                     211657             0.0
UdpRcvbufErrors                 211657             0.0
$ ss -uanm 'sport = :514'                           # d がこのソケットで捨てた数
UNCONN 0      0      0.0.0.0:514      0.0.0.0:*
	 skmem:(r0,rb212992,t0,tb212992,f0,w0,o0,bl0,d1532)
$ grep 'rate-limiting' /var/log/messages            # 送信元(RHEL)
... imjournal: 11538 messages lost due to rate-limiting (20000 allowed within 600 seconds)
$ journalctl -b | grep Suppressed
... systemd-journald[612]: Suppressed 4210 messages from myapp.service
PS> netstat -s -p udp        # Windows:UDP の受信エラーの増え方を見る
送信元のサーバーの中では、アプリのログがjournald(30秒に10000件)とimjournal(600秒に20000件)のレート制限を超えると捨てられて件数だけがSuppressed・rate-limitingとして記録され、受信サーバーでは大量のUDPがカーネルの受信バッファーからあふれて黙って捨てられUdpRcvbufErrorsやssのdが増えることと、対策としてRcvBufSizeを大きく、受信を分散、重要なログはTCP+キューにすることと、抜けは2か所でどちらもカウンターを見ないと気づけないことを示す図
  • UDPの欠損:受信側の処理が追いつかないと、カーネルの受信バッファーがあふれ、パケットは黙って捨てられる。送信側にも受信側のrsyslogにもエラーは出ない。カウンターで確かめ、imudpのRcvBufSize、受信の分散、重要なログはTCPとキューへの切り替えで対処する
  • レート制限:送信元のサーバーの中でも捨てられる。journaldは既定でサービスごとに30秒に10000件、RHELのrsyslogが使うimjournalは600秒に20000件を超えた分を捨て、件数だけを記録する(第5回)

障害や攻撃の最中はログが急増するので、一番欲しい時間帯ほど抜けやすいのです。


時刻・文字化け・ディスク

症状主な原因確認対処
時刻が数分〜9時間ずれる、探しても見つからない送信元の時計のずれ、JST と UTC の混在、年やタイムゾーンのない RFC 3164 の時刻受信時刻 %timegenerated% と機器の時刻 %timereported% を並べて出力、chronyc tracking、w32tm /query /status全台を NTP で同期(連載「NTP入門」第7回)、オフセット付きの RFC 3339 で記録
日本語が化けるShift_JIS(CP932)で送る機器やアプリ。syslog には Shift_JIS などの文字コードを伝える仕組みがない(RFC 5424 の BOM は UTF-8 の印だけ)iconv -f CP932 -t UTF-8 ファイル、Get-Content ファイル -Encoding Default(日本語版の Windows PowerShell 5.1 は CP932)送信側を UTF-8 に。できなければ受信後に変換
タブが #011 になる受信時の制御文字のエスケープ(既定で有効)ログの中の #011必要なら parser.escapeControlCharacterTab=”off”
書き込みが止まるディスクの枯渇df -h /var/log、du -sh /var/log/remote/*、Get-Volumelogrotate と容量の監視、保存先を分ける(第7回)
消しても空かないローテーション後も古いファイルを開いたままlsof +L1(df と du の差)postrotate で rsyslog に HUP を送る
送信側のディスクが減る転送先の停止でディスクキューが溜まるdu -sh /var/lib/rsyslog(Ubuntu は /var/spool/rsyslog)queue.maxDiskSpace で上限を決め、転送先を監視
①時刻がずれて見つからない例として%timereported%が10:23(機器・JST、TZなし)、%timegenerated%が01:23Z(受信・UTC)で9時間ずれ、②日本語が化ける例としてSJISの82 A0 82 A2がU+FFFD(置換文字)の並びになりiconv -f CP932 -t UTF-8で「あい」に戻り、③ディスクが空かない例として/var/logの使用率100%で削除済みでも開いたまま(lsof +L1)のファイルをHUPで解放することと、3つともログは届いているのに見つからない・読めない・書けない型の障害であることを示す図

Windowsで集める側(WEC)は、Get-WinEvent -ListLog ForwardedEvents | Select-Object LogMode, MaximumSizeInBytes, FileSize, IsLogFullで、ログが満杯になり上書きや停止をしていないかを見ます。


原因と確認コマンドの対応表

原因見える症状LinuxWindows
送信側の設定・送信側の FW1台だけまったく届かないlogger -n サーバー -P 514 -T “test”、rsyslogd -N1、ESXi は esxcli network firewall ruleset list -r syslogeventcreate、wecutil gr 購読名
経路の FW・送信元 IP の変化拠点や機器の種類ごとに届かない受信側で tcpdump -i any -nn port 514Test-NetConnection -Port(TCP のみ)、pktmon
待ち受けていないICMP の port unreachable が返るss -ulnp、ss -tlnpGet-NetUDPEndpoint、Get-NetTCPConnection -State Listen
firewalld・SELinuxtcpdump に見えるのに保存されないfirewall-cmd –list-all、semanage port -l、ausearch -m AVCGet-NetFirewallPortFilter から Get-NetFirewallRule
UDP の受信バッファーのあふれ混雑する時間だけ抜けるnstat -az UdpRcvbufErrors、ss -uanmnetstat -s -p udp
レート制限・配信の遅れ大量に出た日だけ抜ける、遅れて届くgrep rate-limiting /var/log/messages、journalctl -b | grep Suppressedwecutil gs 購読名(配信の最適化)
時刻・タイムゾーン時刻がずれる、見つからないchronyc tracking、%timegenerated% と %timereported%w32tm /query /status、Get-TimeZone
文字化け・ディスク化ける、書き込みが止まるiconv -f CP932 -t UTF-8、df -h、lsof +L1Get-Content -Encoding Default、Get-WinEvent -ListLog ForwardedEvents

連載の早見表

困ったときに戻る場所を、連載全体でまとめておきます。

回テーマ押さえること使う場面
第1回ログの目的障害調査・セキュリティ・監査、壊れる・消される前に集める、規制と保存期間要件の整理(第11回の問2)
第2回syslog の基本Facility と Severity(PRI)、RFC 3164 と 5424、UDP・TCP・TLS(6514)・RELP の違い方式の選択(問1・問2)
第3回Linux のログjournald と rsyslog の関係、logger、logrotate送信側の確認(問4)
第4回〜第5回rsyslog の実践RainerScript、omfwd とディスクキュー、フィルター、TLS、RELP、レート制限転送の設計(問1・問2)
第6回Windows・機器イベントログと WEF、監査ポリシー、NW 機器・ESXi の syslog収集の方式(問1)
第7回集約基盤の設計中継と冗長、容量(EPS × 大きさ × 日数)、保存期間、改ざん防止、UTC、構造化ログ容量と保存(問1・問2)
第8回〜第9回分析・SIEM、クラウド検索基盤と監視・アラート、CloudWatch Logs・CloudTrail・S3一元的な検索(問3)
第10回トラブルシュート送信側 → 経路 → 受信側の順、tcpdump・logger、UDP の欠損、レート制限障害対応(問4)

どの回も、「このログは、誰が、何で運び、どこに、いつまで残るか」を意識すると理解しやすくなります。

振り返りと持ち帰り

  1. ログは「届いたか確かめられる形」で運ぶ。UDPは抜ける前提で、重要なログはTCPとディスクキュー、暗号化はTLS、受け取りの確認まで要るならRELP。届かないときは送信側 → 経路 → 受信側の順に確かめる
  2. 時刻・形式・文字コードをそろえてから集める。全台をNTPで同期し、オフセット付きのRFC 3339(できればUTC)とUTF-8で記録し、送信元の名前もそろえる
  3. 容量・保存期間・改ざん防止を最初に設計する。EPS × 1件の大きさ × 日数で見積もり、検索用と保管用を分け、WORMとハッシュで証跡を守る

参考資料

  • RFC:3164(BSD syslog、Informational)、5424(syslogプロトコル)、5425(TLS)、5426(UDP)、5427(Facility・SeverityのMIB定義)、5848(署名)、6012(DTLS)、6587(TCP、Historic)、9662(TLS・DTLSの暗号スイートの更新)、3339(日時の書式)
  • 公式ドキュメント:rsyslogのドキュメント(docs.rsyslog.com)、Red Hat「Configuring a remote logging solution」(RHEL 9・10)、journald.conf(5)・logger(1)のman、Microsoft Learn(Windowsイベント転送、Test-NetConnection、Pktmon)、Broadcom TechDocs(ESXiのsyslog)、AWS(CloudWatch Logs、CloudTrail、S3 Object Lock)、PCI SSC(PCI DSS v4.0.1)

考えてみよう

  1. 新しく入れたネットワーク機器のログだけが届きません。最初にどこで何を実行しますか。その結果で、次に調べる場所はどう変わりますか。
  2. 受信側のtcpdumpには届いているのに、/var/log/remote/にファイルができません。何をどの順に確かめますか。
  3. 毎朝9時台だけ、ログの件数が少なく見えます。どんな原因が考えられ、どのカウンターを見ますか。

ヒント:この記事の切り分けの図、受信側の関所の図、UDPの欠損とレート制限の図が手がかりです。まずは自分のサーバーでlogger -n 集約サーバー -P 514 -T "test"を送り、受信側のtcpdumpとファイルで到着を確かめてみてください。


まとめ

  • 切り分けは受信側のtcpdumpで二分する。見えなければ送信側・経路、見えれば受信側
  • logger -d(UDP)は届かなくても成功。TCPは-T -P 514、TLSはopenssl s_client
  • WindowsのTest-NetConnectionはTCPだけ。UDPは受信側で、パケットはpktmonで
  • tcpdumpに見えるのに保存されないなら、firewalld・SELinux・待ち受け・フィルター
  • ときどき抜けるのはUDPの受信バッファーとレート制限。どちらもカウンターを見る
  • 「届いているのに見つからない」は時刻・文字コード・ディスク

次回はいよいよ最終回。これまでの知識を使って、ログ管理を要件から設計する演習に取り組みます。


連載「syslog入門」全11回

全回の目次と、読む順番・目的別の読み方は、syslog入門の入口のページにまとめています。

  1. ログとは・なぜ集めるか
  2. syslogの基本
  3. Linuxのログの仕組み
  4. rsyslog 前編
  5. rsyslog 後編
  6. Windows・ネットワーク機器のログ
  7. ログ集約基盤の設計
  8. 分析と監視・SIEM
  9. クラウドのログ
  10. syslogのトラブルシュート(この記事)
  11. ログ管理の設計演習
seichan

プロフィール詳細は「プロフィール」をご覧ください。
AWS Certified Solutions Architect – Professional (https://www.credly.com/badges/fd8feb88-6f1f-42ff-a94b-445bb6661cb8/public_url)
Nutanix Certified Professional - Multicloud Infrastructure 6 (https://www.credly.com/badges/5c081bef-a425-42e4-809c-85138e676630/public_url)
Palo Alto Networks System Engineer (PSE) - Hardware Firewall Professional (https://www.credly.com/badges/69dc3880-4a51-47eb-8843-47ba6ea7d013/public_url)

seichanをフォローする
SYSLOG サーバー
シェアする
seichanをフォローする

コメント

タイトルとURLをコピーしました