如何配置/etc/syslog.conf
文件以便将日志信息保存iptables
在特定文件中。
我想单独保存这些信息,这样我就可以轻松快速地提取我想要的内容。
答案1
系统日志
查看 的手册页iptables
。它显示了一个名为的目标,LOG
它可以做你想做的事情。
例子
将日志记录级别设置为
LOG
4。# DROP everything and Log it iptables -A INPUT -j LOG --log-level 4 iptables -A INPUT -j DROP
配置
syslog.conf
将这些消息写入单独的文件。# /etc/syslog.conf kern.warning /var/log/iptables.log
重新启动 syslogd。
Debian/Ubuntu
$ sudo /etc/init.d/sysklogd restart
Fedora/CentOS/RHEL
$ sudo /etc/init.d/syslog restart
笔记:这种记录方法称为固定优先级。它们可以是数字或名称 (1,2,3,4,..) 或 (DEBUG, WARN, INFO, 等等)。
系统日志
如果您偶然使用rsyslog
,您可以创建一个基于属性的过滤器,如下所示:
# /etc/rsyslog.conf
:msg, contains, "NETFILTER" /var/log/iptables.log
:msg, contains, "NETFILTER" ~
然后将这个开关添加到您要记录的 iptables 规则中:
–log-prefix NETFILTER
作为替代方案,您还可以使用此类属性过滤器记录消息:
:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
:msg, regex, "^\[ *[0-9]*\.[0-9]*\] iptables: " -/var/log/iptables.log
& ~
笔记:第二种方法不需要对iptables
.
参考
答案2
这假设您的防火墙已经生成日志,就像任何正常的防火墙一样。对于某些示例,它需要可识别的消息,例如 slm 示例中的“NETFILTER”。
在 rsyslog.d 中创建一个文件
vim /etc/rsyslog.d/10-firewall.conf
这在 CentOS 7 中有效。除了寻找 IN 和 OUT 之外,我不知道如何验证它是否来自防火墙...... CentOS 很奇怪。除非下一个版本不起作用,否则不要使用它。
# into separate file and stop their further processing
if ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
这适用于 CentOS 7 并检查消息内容(将“Shorewall”替换为 -j LOG 规则消息中的任何内容):
# into separate file and stop their further processing
if ($msg contains 'Shorewall') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
这适用于其他系统(Ubuntu、Debian、openSUSE)。这是最好的方法。不搜索消息中的字符串:
# into separate file and stop their further processing
if ($syslogfacility-text == 'kern') and \\
($msg contains 'IN=' and $msg contains 'OUT=') \\
then -/var/log/firewall
& ~
这是默认的 openSUSE 机器所具有的(我认为每个发行版都应该具有但缺少)(区别似乎只是“stop”而不是“& ~”;并非所有系统都支持这两种语法):
if ($syslogfacility-text == 'kern') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
stop
}
对于上述所有内容,也不要忘记 logrotate.d 文件:
vim /etc/logrotate.d/firewall
包含:
/var/log/firewall {
rotate 7
size 500k
postrotate
# before using this, run the command yourself to make sure
# it is right... the daemon name may vary
/usr/bin/killall -HUP rsyslogd
endscript
}