![使用 RSYSLOG 将剩余的网络流量发送到特定文件](https://linux22.com/image/779905/%E4%BD%BF%E7%94%A8%20RSYSLOG%20%E5%B0%86%E5%89%A9%E4%BD%99%E7%9A%84%E7%BD%91%E7%BB%9C%E6%B5%81%E9%87%8F%E5%8F%91%E9%80%81%E5%88%B0%E7%89%B9%E5%AE%9A%E6%96%87%E4%BB%B6.png)
我正在尝试将来自多个客户端的多个设备的日志集中在我的 RSYSLOG 服务器上。
我的服务器在 Debian 11 上运行,带有 RSYSLOG v8.2102
目前的配置非常简单:我只是在 /etc/rsyslog.conf 中允许 UDP 和 TCP 连接,并在 UFW 中打开端口 514。
在 /etc/rsyslog.d/ 中,我为每个设备添加了一条规则。例如,为了匹配 Fortinet,我在 /etc/rsyslog.d/10-Fortinet-SiteName-ClientName.conf 中添加了此规则:
if $msg contains 'devid="FGT_SerialNumber"' then /ClientsLogs/ClientName/SiteName/Fortinet.log
& stop
它按预期工作。
我想发送所有剩余网络流量在另一个文件中,/var/log/syslog 帮助我识别诸如缺少设备配置之类的问题,并防止 /var/log/syslog 增长(防火墙日志非常冗长!)
我尝试使用 $fromhost-ip 进行过滤,但没有成功:
if not $fromhost-ip == '127.0.0.1' then /ClientsLogs/Undefined.log
& stop
我确信它一定很简单但我无法让它工作!
答案1
根据您自己的回答,您不能将其用作'`hostname`'
字符串并期望它变成,例如,'abc'
其中abc
是您的本地主机名。您只能以两种形式使用反引号:`echo $VARNAME`
对于某些环境变量或`cat filename`
对于某些文件名。
这就是为什么您的if
陈述与所有输入相匹配。
但是,有一个预定义的系统属性$myhostname
应该保存主机名,尽管我不确定它是否是完全限定的域名。您必须将它与额外的$
前缀一起使用:
... and $fromhost != $$myhostname then ...
答案2
我找到了这个解决方案,但它破坏了 /var/log/syslog 的正常记录 :-(
/etc/rsyslog.d/99-Undefined.conf 的内容
if $fromhost != '127.0.0.1' and $fromhost != 'localhost' and $fromhost != '`hostname`' then /ClientsLogs/Undefined.log
& stop