如何拆分rsyslog接收的Sophos XGS4300合并防火墙日志?
Sophos XGS4300日志拼接问题解决方法
为什么防火墙会发送拼接后的日志?
这是Sophos XGS系列的默认优化策略,目的是在高日志量场景下减少网络连接次数、降低带宽开销。防火墙会将多条日志聚合成一个syslog消息发送,默认的分隔符是#000<30>(其中#000是ASCII空字符,<30>是syslog优先级标识)。
你可以直接在防火墙端解决这个问题:登录Sophos XGS Web管理界面,进入系统 > 日志设置 > 日志转发,找到对应的syslog服务器配置项,调整「批量大小」为1,或者禁用「日志聚合」功能,这样防火墙会每条日志单独发送,无需在rsyslog中处理拆分。
rsyslog端日志拆分方案
如果无法修改防火墙配置,可在rsyslog中通过以下配置实现拆分(需rsyslog 8.30及以上版本,支持split函数):
修改后的rsyslog配置文件
$DebugFile /var/log/rsyslog.debug $DebugLevel 2 $EscapeControlCharactersOnReceive off # 关键:关闭控制字符转义,才能识别ASCII空字符 module(load="mmnormalize") global( DefaultNetstreamDriver="gtls" DefaultNetstreamDriverCAFile="/etc/rsyslog.d/keys/ca/sophos-default.pem" DefaultNetstreamDriverCertFile="/etc/rsyslog.d/keys/bundle.pem" DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/keys/server-key.pem" ) # 加载TLS TCP监听模块 module( load="imtcp" StreamDriver.Name="gtls" StreamDriver.Mode="1" StreamDriver.Authmode="x509/certvalid" ) # 启动6514端口监听 input( type="imtcp" port="6514" ) # 处理Sophos拼接日志 if ($inputname == "imtcp") then { # 移除msg开头的rsyslog自动添加的前缀(时间、主机等) set $msg = $msg:R,ERE,1,FIELD:^[^>]+>(.*)$; # 用分隔符#000<30>拆分日志条目 set $logEntries = split($msg, "#000<30>"); # 遍历每个拆分后的日志条目 foreach $entry in $logEntries do { # 跳过空条目 if $entry != "" then { # 将单条日志写入文件(可替换为转发到SIEM的action) action(type="omfile" file="/var/log/rsyslog/sophos-split.log" template="RSYSLOG_SyslogProtocol23Format") # 示例:转发到SIEM服务器(根据实际情况修改) # action(type="omtcp" target="siem.example.com" port="514" template="RSYSLOG_SyslogProtocol23Format") } } stop # 终止原始拼接日志的后续处理 }
配置说明
$EscapeControlCharactersOnReceive off:关闭控制字符转义,确保rsyslog能正确识别日志中的ASCII空字符#000。- 前缀移除:通过正则去掉rsyslog自动添加的时间、主机等前缀,只保留Sophos的原始日志内容。
- 拆分与循环:使用
split函数将拼接日志拆分为数组,再通过foreach循环处理每条日志,过滤空条目后写入文件或转发到SIEM。
内容的提问来源于stack exchange,提问作者Matthias Bitsch
相关产品推荐
相关产品推荐

