您的位置主页 > 服务器

IPtables日志管理

Iptables的手册中提到LOG target这个target是专门用来记录数据包有关信息的。这些信息可能是非法的,那就可以用来除错。LOG会返回包的有关细节,如IP头的大部分和其他有趣的信息。这个功能是通过内核的日志工具完成的,一般是syslogd。返回的信息可用dmesg阅读,或者可以直接查看syslogd的日志文件,也可以用其他的什么程序来看。LOG对调试规则有很大的帮助,你可以看到包去了哪里、经过了什么规则的处理,什么样的规则处理什么样的包,等等。下面我们来实现如何通过内核的日志工具管理IPtables日志。

一、配置syslogd的配置文件/etc/syslog.conf

syslogd默认把日志信息输出到/var/log/messages文件。 下面向大家介绍如何建立一个新的IPtables日志文件/var/log/iptables。 修改syslogd的配置文件/etc/syslog.conf,告诉syslogd IPtables使用哪个记录等级。记录等级的详细信息可以查看文件syslog.conf,一般来说有以下几种,它们的级别依次是:debug,info,notice,warning,warn,err,error,crit,alert, emerg,panic。其中,error和err、warn和warning、panic和emerg分别是同义词,也就是说作用完全一样的。注意这三种级别是不被赞成使用的(因为信息量太大)。信息级别说明了被记录信息所反映的问题的严重程度。
IPtables的所有LOG信息可以通过内核的功能被记录。

首先在文件syslog.conf里添加如下内容

# Iptables logging
kern.debug /var/log/iptables

然后再指定iptables的LOG规则使用级别debug(例如:iptables -I INPUT 1 -j LOG --log-prefix '[IPTABLES DROP LOGS]:' --log-level debug),就可以把所有的信息存入文件/var/log/iptables内。

最后重新启动syslog服务或重启计算机。
我用的是FC6,用service syslog restart命令可以很方便地启动syslog服务。

二、使用IPtables滚动日志

所有的日志文件都会随着时间的推移和访问次数的增加而迅速增长, 因此必须对日志文件进行定期清理以免造成磁盘空间的不必要的浪费。FC6下有一个专门的日志滚动处理程序logrotate,logrotate能够自动完成日志的压缩、备份、删除工作,系统默认把logrotate加入到系统每天执行的计划任务中,这样就省得管理员自己去处理了。

首先查看并确定logrotate的配置文件/etc/logrotate.conf内容如下:

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}

# system-specific logs may be also be configured here.

然后在syslog的滚动日志配置文件/etc/logrotate.d/syslog里面添加IPtables的日志文件/var/log/iptables,详细内容如下:

/var/log/iptables /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

最后安排logrotate每天执行一次,确定文件/etc/cron.daily/logrotate内容如下:

#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0