在 RHEL 7 主机上工作,配置 rsyslog 以从数百个 IP 的各种设备(路由器、交换机、设备等)收集 udp/tcp 事件。使用以下配置开始。
问题:rsyslog 中是否有方法可以调用“fromhost-ip”使用的外部 IP 地址表,这样我就不必列出每个单独的 IP 的数十行或更多行,而是更新列表?由于 IP 不在同一范围内(许多甚至不在同一 CIDR 块中),我无法使用“startswith”,也不知道 rsyslog 是否识别 CIDR 表示法或子网掩码。
$ModLoad imudp
$UDPServerRun 514
#
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
#
$template networking,"/var/log/splunk/networking/%FROMHOST-IP%/%FROMHOST- IP%_%$now%.log"
$template firewall,"/var/log/splunk/firewall/%FROMHOST-IP%/%FROMHOST-IP%_%$now%.log"
$template security,"/var/log/splunk/security/%FROMHOST-IP%/%FROMHOST-IP%_%$now%.log"
$template infrastructure,"/var/log/splunk/infrastructure/%FROMHOST-IP%/%FROMHOST-IP%_%$now%.log"
$template linux,"/var/log/splunk/linux/%FROMHOST-IP%/%FROMHOST-IP%_%$now%.log"
$template uncategorized,"/var/log/splunk/uncategorized/%FROMHOST-IP%/%FROMHOST-IP%_%$now%.log"
#
if $msg contains "%ASA-" then ?firewall
if $fromhost-ip == [ "172.31.4.3","172.31.4.2" ] then ?firewall
& ~
if $fromhost-ip == [ '172.31.4.211', '172.31.4.212', '172.31.4.213' ] then ?networking
& ~
if $fromhost-ip == [ '172.31.4.200','172.31.4.201','172.31.4.203' ] then ?security
& ~
if $fromhost-ip == [ '172.31.4.241','172.31.4.242','172.31.4.243' ] then ?infrastructure
& ~
if $fromhost-ip == [ '172.31.4.250','172.31.4.251','172.31.4.253' ] then ?linux
& ~
if $fromhost-ip != '127.0.0.1' then ?uncategorized
& ~
答案1
我不知道你在 Rhel7 中安装了哪个版本的 rsyslog,也不知道这个功能什么时候可用,但你也许可以使用 RainerScript表。
您必须提供一个文件,比如说mytable.json
包含一个包含所需键和值的 json 格式的表,例如:
{ "version" : 1,
"nomatch" : "uncategorized",
"type" : "string",
"table" : [
{"index" : "172.31.4.211", "value" : "networking" },
{"index" : "127.0.0.1", "value" : "linux" },
]}
显然,最好使用小型 awk 脚本从更易于编辑的地址和类别列表中生成它。
您可以使用 将此表加载到配置文件中lookup_table()
。然后只需使用变量$.myclass
而不是所有类别来提供一个通用模板,然后通过lookup()
表中的 来设置该变量。例如,
lookup_table(name="myipmap" file="mytable.json" reloadOnHUP="on")
$template all,"/var/log/splunk/%$.myclass%/%FROMHOST-IP%/%FROMHOST-IP%_%$now%.log"
set $.myclass = lookup("myipmap", $fromhost-ip);
action(type="omfile" dynaFile="all")