rsyslog配合stunnel实现日志加密传输的本质是分工协作:rsyslog负责日志收发与格式处理,stunnel负责建立tls加密隧道;服务端需同时运行stunnel(监听如4514)和rsyslog(监听本地6514),通过loopback互通;客户端配置为. @@logserver-ip:4514;rsyslog_forwardformat,无需gtls模块或证书验证;证书须cn匹配、权限600、pem合并,selinux需放行;验证需逐层测试openssl连接、本地端口监听及tcpdump抓包确认明文日志送达。

用 Rsyslog 配合 Stunnel 实现日志加密传输,本质是“分工协作”:Rsyslog 负责日志收发和格式处理,Stunnel 负责在底层建立 TLS 加密隧道。这种方式不依赖 rsyslog-gnutls 模块,兼容性更好,配置逻辑也更清晰。
服务端(日志接收方)部署要点
服务端需同时运行 Stunnel(监听加密端口)和 Rsyslog(监听本地明文端口),两者通过 loopback 连通。
- Stunnel 监听一个非特权端口(如 4514),接受外部 TLS 连接,并将解密后的日志转发给本地的 Rsyslog(如 127.0.0.1:6514)
- Rsyslog 只需启用 TCP 输入模块,绑定到本地高编号端口(如 6514),无需加载任何 TLS 模块或证书
- 确保 Stunnel 的证书私钥权限为 600,证书路径在
/etc/stunnel/stunnel.conf中正确指定:cert = /etc/ssl/certs/stunnel.pemkey = /etc/ssl/private/stunnel.pem - 防火墙放行 Stunnel 监听端口(如 4514),不开放 6514 或 514 给外网
客户端(日志发送方)关键配置
客户端只需把日志发给 Stunnel 服务端的加密地址,其余由 Stunnel 处理。
- 在客户端 Rsyslog 配置中(如
/etc/rsyslog.d/50-remote.conf),写入:*.* @@logserver-ip:4514;RSYSLOG_ForwardFormat
注意用 @@(TCP)且端口是 Stunnel 的监听端口,不是 Rsyslog 原生端口 - 无需在客户端配置 CA 文件、gtls 模块或证书验证——Stunnel 默认信任服务端证书,若需双向认证,才需额外配 client cert
- 建议添加队列参数防丢日志:
$ActionQueueFileName fwdq<br>$ActionQueueMaxDiskSpace 1g<br>$ActionQueueSaveOnShutdown on
证书与安全加固细节
证书是整个链路可信的基础,不能跳过验证步骤。
- 使用 OpenSSL 生成自签名证书时,CN 必须匹配服务端实际域名或 IP(如 CN=logs.example.com),否则客户端连接会因证书不匹配被拒绝
- Stunnel 证书文件应合并为单个 PEM:
cat stunnel.crt stunnel.key > /etc/ssl/certs/stunnel.pem - 检查 SELinux 状态(RHEL/CentOS):
若启用,需确认 stunnel 允许绑定网络端口:setsebool -P stunnel_connect_any 1;也可临时设为 permissive 模式快速排障 - 验证连通性:在客户端执行
openssl s_client -connect logserver-ip:4514 -quiet,成功返回 SSL 握手信息即表示隧道就绪
验证与排错核心方法
不要只看服务是否启动,要逐层确认数据流是否真正贯通。
- 先停掉 Rsyslog,仅启 Stunnel,用
openssl s_client测试能否连上并看到 “Verify return code: 0 (ok)” - 再启 Rsyslog,用
ss -tlnp | grep :6514确认它确实在监听本地端口 - 在服务端用
tcpdump -i lo port 6514 -A抓包,确认 Stunnel 解密后确实有明文 syslog 数据送达 - 最后从客户端发测试日志:
logger "test encrypted log from $(hostname)",检查服务端对应日志文件是否收到











