iptables connlimit意外触发

我一直在使用这些防火墙规则:

-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 

要么:

  • 只有SSH数据包已经被select进入链中
  • 分配连接到“SSH”最近的队列
  • 设置一个120秒的超时时间,最多五个新的连接,返回不应该被限制的调用链会话(调用链,然后允许好主机)
  • 更新连接列表
  • 丢包

当规则被触发时,你看到netstat中的监视器主机打开连接吗?

那么在路由器上的/ proc / net / ip_conntrack呢?

ISTR的限制实际上限制了这个规则的所有连接,这是一个非常普遍的规则。 由于其他连接通过路由器,数字是否增加到了50?

如何添加debugging规则来确定实际发生的事情:

 -I FORWARD -p tcp --syn -s [MONITOR] -j LOG --log-prefix "MONITOR CONNECT: " --log-level debug