rsyslog需显式加载imudp/omfwd模块并配置UDP/TCP输出(如@@192.168.1.100:514),否则远程日志静默失败;journald不支持原生远程推送,须通过ForwardToSyslog=yes转发至rsyslog;排查按“本机发出→网络连通→远端监听”三步走。

rsyslog 怎么配 remote syslog server
默认 rsyslog 不会发日志到远程,必须显式启用 UDP/TCP 输出模块并配置目标地址。不加载模块直接写 *.* @192.168.1.100:514 会静默失败,日志照常写本地,但一条也不出去。
- 先确认模块已加载:
sudo rsyslogd -N1检查输出里有没有imudp或omfwd;没加载就加module(load="imudp")和module(load="omfwd")到/etc/rsyslog.conf开头 - UDP 更轻量但不可靠,TCP 有重传和连接管理,生产环境优先用
@@192.168.1.100:514(双 @ 表示 TCP) - 目标端口不一定是 514:很多 SIEM 或自建接收端监听在 5140、1514 等非特权端口,配错端口时
netstat -tuln | grep :514会发现根本没连上 - 防火墙要放行:Ubuntu 的
ufw默认拦 UDP 514,CentOS 的firewalld需firewall-cmd --add-port=514/udp --permanent
systemd-journald 能不能直接推日志到远程
不能原生推送。journald 只支持本地转发给 rsyslog 或 syslog-ng,再由它们转出。想用 journald 做远程传输,必须搭一层中转。
- 启用 journald 的 syslog 转发:
sudo systemctl edit systemd-journald,加[Journal]段落,设ForwardToSyslog=yes,然后sudo systemctl restart systemd-journald - 注意:
ForwardToSyslog=yes后,journald 会把所有日志塞进/dev/log,rsyslog 必须监听这个 socket(默认已开imuxsock模块),否则日志就丢进黑洞 - 如果只想要部分服务日志上送,别动全局转发,改用
journalctl -u nginx | logger -t nginx-remote这类临时管道——但别放 cron 里跑,容易堆积阻塞
日志发过去后对方收不到,怎么快速定位
不是配置写错就是链路断在中间,优先查三处:本机发没发出、网络通不通、远端收不收。
- 本机是否发出:用
tcpdump -i any port 514抓包,看到UDP或TCP包飞向目标 IP,说明 rsyslog 已生效;没包就回头检查模块和规则语法 - 网络是否通:不用
ping(ICMP 不代表 UDP/TCP 通),改用nc -zv 192.168.1.100 514测 TCP 连通性,UDP 用nc -u -zv 192.168.1.100 514(部分 nc 版本不支持 -u 测 UDP) - 远端是否监听:登录接收服务器,运行
ss -tuln | grep ':514',看有没有0.0.0.0:514或[::]:514;若只有127.0.0.1:514,说明只监听本地回环,收不到外网日志
rsyslog 远程传输要不要加密
明文走网络等于把认证凭证、用户行为、错误堆栈全广播出去。内网短距离可妥协,只要跨 VLAN、走公网或合规审计,必须加密。
- rsyslog 原生支持 TLS,但配置比普通转发复杂得多:需要 CA 证书、服务端证书、客户端证书(可选)、
gtls模块,且远端接收端也得是支持 TLS 的 syslog 服务(如 rsyslog +imtcp+StreamDriver.Name="gtls") - 更现实的替代方案是走 SSH 隧道:
autossh -M 0 -f -N -L 5140:/dev/log user@remote-syslog-server,然后本地 rsyslog 改发到127.0.0.1:5140;省去证书管理,但单点故障风险高 - 别用
logger命令手动发:它只走本地/dev/log,不经过 rsyslog 配置,加密、过滤、格式化全失效
配置远程日志最常卡在模块没加载、端口被拦、远端没监听这三点。调通前先关掉所有“高级需求”,用最简 UDP + <em>.</em> @ip:port 验证通路,再逐步加 TLS、过滤、模板。否则一上来就堆参数,连哪行报错都找不到。

















