將 iptables 限制連線功能做 log

當我們運用 iptables 限制同一IP單位時間連線數時,無法得知有那些IP被DROP掉,這時可利用iptables增加一個chain來做log,並將它獨立到其他的LOG檔,而非/var/log/messages。
在/etc/sysconfig/iptables中修改設定,新建立一個chain,再將log及DROP的規則放到這個chain裡,只要事件觸發套用這個chain即可:

建立新的chain:
-N LOG_AND_DROP
-A LOG_AND_DROP -j LOG --log-prefix "iptables DROP: " --log-level 7
-A LOG_AND_DROP -j DROP

再將相關的rule套用這個chain:
-A INPUT -p tcp --dport 22 -m recent --rcheck --seconds 600 --hitcount 5 --name SSH_LOG --rsource -j LOG_AND_DROP
-A INPUT -p tcp --dport 22 -m recent --set --name SSH_LOG --rsource
-A INPUT -p tcp --dport 22 -j ACCEPT

在CentOS 6.3中可在 /etc/rsyslog.d/ 中建立一個新的 conf 檔/etc/rsyslog.d/iptables.conf:
:msg,contains,"iptables DROP: " /var/log/iptables.log
& ~

它即會將LOG_AND_DROP的事件記錄到 /var/log/iptables.log 中。

CentOS 6.3及較早的版本,可直接在 /etc/rsyslog.conf 或 /etc/syslog.conf 中加入log的設定檔:
kern.=7    /var/log/iptables.log

重新啟動syslogd(或rsyslogd)及iptables後,即會開始將log記錄到/var/log/iptables.log中:
#service syslogd restart
#service iptables restart

在iptables.log就可以看到相關的記錄:
Jan 30 04:51:30 hostname kernel: iptables DROP: IN=eth0 OUT= MAC=00:15:5d:43:b9:02:ff:34:96:20:c4:a4:28:00 SRC=118.174.1.133 DST=xxx.xxx.xxx.xxx LEN=60 TOS=0x00 PREC=0x00 TTL=50 ID=4358 DF PROTO=TCP SPT=51329 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0

如果要加入 logrotate,則可在 /etc/logrotate.d/syslog 中,加入 /var/log/iptables.log ,讓它一併做logrotate:
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
/var/log/iptables.log
{
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript

}

設定好後,即可定時將記錄檔一併做rotate,再加上compress的選項更可節省空間。