我一直在使用这些防火墙规则:
-I FORWARD -p tcp --syn -m connlimit --connlimit-above 50 -j REJECT -I FORWARD -p tcp --syn -m connlimit --connlimit-above 50 -j LOG --log-prefix "CONNLIMIT: " --log-level debug
这似乎很简单:防止有人打开超过50个连接并导致拒绝服务。 我已经成功地对慢狮进行了testing。 为了防止误报(Apache可能非常需要连接),我将限制设置为50,但是,今天早上,我从Nagios监视器收到一封电子邮件,我的日志显示了几行“CONNLIMIT”源IP是我的监控系统。
我不知道为什么会这样。 我的监控服务器至多应该执行5-10次检查,可能是ping或SSH连接。 如果我打开了25个以上的决定,但是连续2个周末我都会感到震惊,我已经设法触发connlimit 50并粗暴地唤醒自己。
我的防火墙规则有什么问题吗? (也许添加'新'标志?)是Nagios不正确地closures它的连接? 我甚至不知道如何在没有logging每一个数据包的情况下继续debugging这个问题,耐心地等待我的手机在一个非常糟糕的时刻熄灭。
[编辑:只是为了好玩,这里是服务器日志]
Oct 9 11:33:22 adapt kernel: [1888526.442640] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=60 TOS=0x00 PREC=0x00 TTL=54 ID=2076 DF PROTO=TCP SPT=46536 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0 Oct 9 11:34:22 adapt kernel: [1888586.443869] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=60 TOS=0x00 PREC=0x00 TTL=54 ID=43048 DF PROTO=TCP SPT=57931 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0 Oct 9 11:35:42 adapt kernel: [1888667.011376] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=64 TOS=0x00 PREC=0x00 TTL=54 ID=19161 DF PROTO=TCP SPT=63669 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0 Oct 9 11:35:48 adapt kernel: [1888673.093663] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=64 TOS=0x00 PREC=0x00 TTL=54 ID=48302 DF PROTO=TCP SPT=63673 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0 Oct 9 11:35:53 adapt kernel: [1888678.361267] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=64 TOS=0x00 PREC=0x00 TTL=54 ID=11711 DF PROTO=TCP SPT=63677 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0 Oct 9 11:36:04 adapt kernel: [1888688.517868] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=60 TOS=0x00 PREC=0x00 TTL=54 ID=6316 DF PROTO=TCP SPT=44206 DPT=443 WINDOW=5840 RES=0x00 SYN URGP=0 Oct 9 11:36:21 adapt kernel: [1888705.382273] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=64 TOS=0x00 PREC=0x00 TTL=54 ID=29613 DF PROTO=TCP SPT=63697 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0 Oct 9 11:36:49 adapt kernel: [1888733.467511] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=60 TOS=0x00 PREC=0x00 TTL=54 ID=52433 DF PROTO=TCP SPT=40930 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0 Oct 9 11:37:04 adapt kernel: [1888748.574700] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=60 TOS=0x00 PREC=0x00 TTL=54 ID=26329 DF PROTO=TCP SPT=44223 DPT=443 WINDOW=5840 RES=0x00 SYN URGP=0
我们可以看到它正在检查几个端口,每分钟发一次检查。
你可能想要recent没有connlimit 。
以下是一个限制SSH连接的主机示例:
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -j SSH_Brute_Force iptables -A SSH_Brute_Force -m recent --set --name SSH --rsource iptables -A SSH_Brute_Force -m recent ! --update --seconds 120 --hitcount 5 --name SSH --rsource -j RETURN iptables -A SSH_Brute_Force -m recent --update --name SSH --rsource iptables -A SSH_Brute_Force -p tcp -j DROP
要么:
当规则被触发时,你看到netstat中的监视器主机打开连接吗?
那么在路由器上的/ proc / net / ip_conntrack呢?
ISTR的限制实际上限制了这个规则的所有连接,这是一个非常普遍的规则。 由于其他连接通过路由器,数字是否增加到了50?
如何添加debugging规则来确定实际发生的事情:
-I FORWARD -p tcp --syn -s [MONITOR] -j LOG --log-prefix "MONITOR CONNECT: " --log-level debug