在日常运维、安全审计和 SOC 日志分析场景中,经常需要把多台 Linux 服务器的系统日志统一发送到一台日志服务器集中保存。这样可以避免逐台登录服务器查看日志,也方便后续对接 SIEM、Wazuh、ELK、日志审计平台等系统。本文介绍如何使用 Linux 常见的 rsyslog 实现日志集中收集,包括:
rsyslog 的主配置文件通常是 /etc/rsyslog.conf,额外配置一般放在 /etc/rsyslog.d/*.conf 目录中。官方文档也说明,rsyslog 可以通过 imtcp 模块接收 TCP Syslog,通过 imudp 模块接收 UDP Syslog,并通过内置的 omfwd 模块将日志转发到远端服务器。
一、架构说明
本文示例架构如下:
Linux Client 1 ─┐
Linux Client 2 ─┼── TCP/UDP 514 ──> Syslog Server
Linux Client 3 ─┘ /var/log/remote/<客户端IP>/<日期>.log
示例 IP:
Syslog Server:192.168.1.100
Linux Client:192.168.1.101、192.168.1.102
推荐使用 TCP 方式转发日志,原因是 TCP 比 UDP 更可靠,适合生产环境。UDP 配置简单,但在网络异常、流量较大或链路不稳定时可能丢日志。
二、服务端配置:Syslog Server
以下操作在日志服务器 192.168.1.100 上执行。
1. 安装 rsyslog
Debian / Ubuntu:
sudo apt update
sudo apt install -y rsyslog
CentOS / RHEL / Rocky Linux / AlmaLinux:
sudo yum install -y rsyslog
或:
sudo dnf install -y rsyslog
启动并设置开机自启:
sudo systemctl enable --now rsyslog
查看服务状态:
sudo systemctl status rsyslog
2. 创建服务端远程日志配置
新建配置文件:
sudovim /etc/rsyslog.d/10-syslog-server.conf
写入以下内容:
# ==============================
# rsyslog Syslog Server 配置
# 同时支持 TCP 和 UDP 514
# ==============================
# 启用 UDP 接收
module(load="imudp")
input(type="imudp" port="514" ruleset="remote")
# 启用 TCP 接收
module(load="imtcp")
input(type="imtcp" port="514" ruleset="remote")
# 远程日志保存路径模板
# 按客户端 IP 和日期分目录保存
template(
name="RemoteLogs"
type="string"
string="/var/log/remote/%fromhost-ip%/%$YEAR%-%$MONTH%-%$DAY%.log"
)
# 远程日志处理规则
ruleset(name="remote") {
action(
type="omfile"
dynaFile="RemoteLogs"
createDirs="on"
dirCreateMode="0755"
fileCreateMode="0640"
)
# 防止远程日志继续进入本机其他日志规则,避免重复写入
stop
}
保存退出。
这里的保存路径示例:
/var/log/remote/192.168.1.101/2026-07-01.log
/var/log/remote/192.168.1.102/2026-07-01.log
3. 检查 rsyslog 配置语法
执行:
sudo rsyslogd -N1
如果看到类似下面的内容,说明配置语法正常:
rsyslogd: version ..., config validation run...
rsyslogd: End of config validation run. Bye.
如果有报错,需要根据提示检查配置文件格式、括号、引号等。
4. 重启 rsyslog
sudo systemctl restart rsyslog
确认 514 端口已经监听:
sudo ss -lntup | grep514
sudo ss -lnuap | grep514
正常情况下可以看到类似:
tcp LISTEN 0 ... 0.0.0.0:514
udp UNCONN 0 ... 0.0.0.0:514
5. 配置防火墙
如果服务端开启了防火墙,需要放行 514 端口。
Ubuntu / Debian 使用 ufw
放行 TCP:
sudo ufw allow 514/tcp
放行 UDP:
sudo ufw allow 514/udp
查看规则:
sudo ufw status
CentOS / RHEL / Rocky Linux / AlmaLinux 使用 firewalld
放行 TCP:
sudo firewall-cmd --permanent--add-port=514/tcp
放行 UDP:
sudo firewall-cmd --permanent--add-port=514/udp
重新加载防火墙:
sudo firewall-cmd --reload
查看规则:
sudo firewall-cmd --list-ports
rsyslog 官方文档也提醒,启用 UDP 接收时通常需要同步调整防火墙规则,部分环境还可能涉及 SELinux 策略。
三、客户端配置:Linux Client
以下操作在需要发送日志的客户端服务器上执行。
假设 Syslog Server 地址为:
192.168.1.100
1. 安装并启动 rsyslog
Debian / Ubuntu:
sudo apt update
sudo apt install -y rsyslog
CentOS / RHEL / Rocky Linux / AlmaLinux:
sudo yum install -y rsyslog
或:
sudo dnf install -y rsyslog
启动并设置开机自启:
sudo systemctl enable --now rsyslog
2. 配置客户端通过 TCP 转发日志
推荐生产环境使用 TCP。
新建客户端转发配置文件:
sudovim /etc/rsyslog.d/90-forward-to-syslog-server.conf
写入:
# ==============================
# rsyslog Client 日志转发配置
# 使用 TCP 发送到 Syslog Server
# ==============================
*.* action(
type="omfwd"
target="192.168.1.100"
port="514"
protocol="tcp"
# 远端不可用时持续重试
action.resumeRetryCount="-1"
# 开启队列,避免网络短暂异常时日志直接丢失
queue.type="LinkedList"
queue.size="10000"
)
保存退出。
说明:
*.* 表示转发所有 facility 和所有 level 的日志
target 指定 Syslog Server 地址
port 指定端口,默认 Syslog 常用 514
protocol 指定协议,推荐 tcp
omfwd 是 rsyslog 用于远程转发日志的输出模块,官方文档说明它支持 UDP、TCP 和 TLS 等方式,且该模块是内置模块,通常不需要额外加载。
3. 可选:使用 UDP 转发日志
如果只想使用 UDP,可以将客户端配置改为:
# 使用 UDP 发送日志到 Syslog Server
*.* action(
type="omfwd"
target="192.168.1.100"
port="514"
protocol="udp"
)
也可以使用传统简写方式:
*.* @192.168.1.100:514
如果使用 TCP,传统简写方式是两个 @:
*.* @@192.168.1.100:514
说明:
@ 表示 UDP
@@ 表示 TCP
生产环境建议使用前面的 action(type="omfwd" ...) 写法,可读性更好,也方便后续扩展队列、重试、TLS 等参数。
4. 检查客户端配置语法
sudo rsyslogd -N1
确认无报错后重启 rsyslog:
sudo systemctl restart rsyslog
查看服务状态:
sudo systemctl status rsyslog
四、测试日志发送
1. 在客户端发送测试日志
TCP 测试:
logger -T-n192.168.1.100 -P514"test tcp syslog from client"
UDP 测试:
logger -d-n192.168.1.100 -P514"test udp syslog from client"
也可以直接写入本机 syslog,由 rsyslog 自动转发:
logger "hello from $(hostname)"
2. 在服务端查看日志
在 Syslog Server 上查看远程日志目录:
sudols-R /var/log/remote/
查看某个客户端日志:
sudo tail -f /var/log/remote/192.168.1.101/$(date +%F).log
如果能看到客户端发送的内容,说明配置成功。
示例日志:
2026-07-01T10:20:30+08:00 client01 root: hello from client01
五、常见排障方法
1. 服务端没有监听 514 端口
检查配置文件:
sudo rsyslogd -N1
检查服务状态:
sudo systemctl status rsyslog
检查监听端口:
sudo ss -lntup | grep514
sudo ss -lnuap | grep514
如果没有监听,重点检查:
module(load="imtcp")
input(type="imtcp" port="514")
module(load="imudp")
input(type="imudp" port="514")
2. 客户端发送后服务端收不到
在客户端测试网络连通性:
TCP:
nc-vz192.168.1.100 514
UDP:
nc-vzu192.168.1.100 514
检查防火墙:
sudo ufw status
或:
sudo firewall-cmd --list-ports
检查服务端是否有日志写入:
sudofind /var/log/remote/ -type f -mtime-1
查看 rsyslog 服务日志:
sudo journalctl -u rsyslog -xe
3. 配置文件修改后不生效
每次修改配置后,都建议执行:
sudo rsyslogd -N1
sudo systemctl restart rsyslog
确认配置文件后缀必须是 .conf,并且放在:
/etc/rsyslog.d/
4. 日志目录没有自动创建
检查服务端配置中是否包含:
createDirs="on"
同时检查 /var/log/remote 的权限:
sudomkdir-p /var/log/remote
sudochown root:root /var/log/remote
sudochmod755 /var/log/remote
重启 rsyslog:
sudo systemctl restart rsyslog
六、配置日志轮转
远程日志集中保存后,日志量会逐渐增大,建议配置 logrotate 定期压缩和清理。
新建配置文件:
sudovim /etc/logrotate.d/remote-syslog
写入:
/var/log/remote/*/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 root root
sharedscripts
postrotate
/usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
endscript
}说明:
daily 每天轮转
rotate 30 保留 30 天
compress 压缩旧日志
missingok 文件不存在不报错
notifempty 空文件不轮转
手动测试 logrotate:
sudo logrotate -d /etc/logrotate.d/remote-syslog
如果确认没问题,可以强制执行一次:
sudo logrotate -f /etc/logrotate.d/remote-syslog
七、生产环境安全建议
1. 优先使用 TCP
生产环境建议使用 TCP 转发日志。UDP 虽然简单,但不保证可靠传输,网络抖动时可能丢日志。
2. 限制来源 IP
Syslog Server 不建议向公网开放 514 端口,只允许指定客户端服务器访问。
firewalld 示例:
sudo firewall-cmd --permanent--add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="514" accept'
sudo firewall-cmd --reload
ufw 示例:
sudo ufw allow from 192.168.1.0/24 to any port 514 proto tcp
3. 使用内网或 VPN 传输
如果日志跨公网传输,建议走专线、VPN、WireGuard、IPsec,或配置 rsyslog TLS 加密。
4. 不要只依赖客户端本地日志
集中日志服务器的价值在于:即使客户端服务器被入侵、日志被删除,日志服务器上仍然可能保留攻击痕迹。
5. 日志服务器单独加固
建议对 Syslog Server 做以下加固:
限制 SSH 登录来源
开启磁盘监控
配置日志轮转
定期备份关键日志
接入 SIEM / Wazuh / ELK
配置时间同步 NTP
八、完整配置汇总
Syslog Server 配置
文件:
/etc/rsyslog.d/10-syslog-server.conf
内容:
module(load="imudp")
input(type="imudp" port="514" ruleset="remote")
module(load="imtcp")
input(type="imtcp" port="514" ruleset="remote")
template(
name="RemoteLogs"
type="string"
string="/var/log/remote/%fromhost-ip%/%$YEAR%-%$MONTH%-%$DAY%.log"
)
ruleset(name="remote") {
action(
type="omfile"
dynaFile="RemoteLogs"
createDirs="on"
dirCreateMode="0755"
fileCreateMode="0640"
)
stop
}
重启服务:
sudo rsyslogd -N1
sudo systemctl restart rsyslog
Client 配置
文件:
/etc/rsyslog.d/90-forward-to-syslog-server.conf
内容:
*.* action(
type="omfwd"
target="192.168.1.100"
port="514"
protocol="tcp"
action.resumeRetryCount="-1"
queue.type="LinkedList"
queue.size="10000"
)
重启服务:
sudo rsyslogd -N1
sudo systemctl restart rsyslog
测试:
logger "hello from $(hostname)"
服务端查看:
sudo tail -f /var/log/remote/*/$(date +%F).log
九、总结
通过 rsyslog 可以快速搭建一套轻量级 Linux 日志集中收集系统。整体流程可以概括为:
服务端启用 imtcp / imudp 接收日志
客户端使用 omfwd 转发日志
服务端按客户端 IP 和日期保存日志
通过 logger 测试日志链路
通过 logrotate 做日志轮转
对于生产环境,建议优先使用 TCP,并限制 Syslog Server 的访问来源。如果日志需要跨公网传输,应进一步配置 VPN 或 TLS 加密,避免日志在传输过程中泄露。
参考资料:rsyslog 官方配置文档、imtcp / imudp / omfwd 模块文档,以及 Red Hat 远程日志配置文档。