我一直在使用这些防火墙规则:
-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 个连接并导致拒绝服务。我已经成功地针对 slowloris 进行了测试。我将限制提高到 50,专门用于防止误报问题(Apache 可能非常耗费连接)。然而,今天早上,我收到了来自我的 Nagios 监视器的电子邮件,我的日志显示了几行“CONNLIMIT”,源 IP 是我的监控系统。
我不知道为什么会发生这种情况。最多,我的监控服务器应该执行 5-10 次检查,也许执行 ping 或 SSH 连接。如果我打开了超过 25 个连接,我会感到震惊,但连续两个周末,我都设法触发了 connlimit 50 并粗鲁地唤醒了自己。
我的防火墙规则是不是出了问题?(也许要添加“新”标志?)Nagios 没有正确关闭连接吗?我甚至不确定如何继续调试这个问题,除非记录线路上的每个数据包,并耐心等待我的手机在某个糟糕的时刻响起。
[编辑:只是为了好玩,这是服务器日志]
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
我们可以看到它正在检查几个端口,并且大约每分钟发出一次检查。
答案1
你可能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 数据包已被选中进入链
- 将连接分配到“SSH”最近队列
- 设置 120 秒的超时时间,并且该时间内最多可建立 5 个新连接,返回不应受到限制的调用链会话(然后调用链允许良好的主机)
- 更新连接列表
- 丢弃数据包
答案2
当触发规则时,您是否在 netstat 中看到来自监视主机的打开的连接?
路由器上的 /proc/net/ip_conntrack 怎么样?
ISTR connlimit 实际上限制了所有符合此规则的连接,这是一条非常通用的规则。由于其他连接通过路由器,该数字是否会上升到 50?
如何添加调试规则来确定实际发生的情况:
-I FORWARD -p tcp --syn -s [MONITOR] -j LOG --log-prefix "MONITOR CONNECT: " --log-level debug