我正在运行Debian
并iptables
试图限制用户每分钟接受我的网站超过 10 次。
这是我最初的尝试:
# Max connection in seconds
TIME_PERIOD=60
# Max connections per IP
BLOCKCOUNT=10
# default action can be DROP or REJECT
DACTION="DROP"
iptables -I INPUT -p tcp --dport 8443 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 8443 -i eth0 -m state --state NEW -m recent --update --seconds $TIME_PERIOD --hitcount $BLOCKCOUNT -j $DACTION
我也尝试过这个:
iptables -I INPUT -p tcp --syn --dport 8443 -m connlimit --connlimit-above 50 -j REJECT
但似乎没有一个能起到作用。
运行此脚本进行测试:
#!/bin/bash
ip="76.44.126.11"
port="8443"
for i in {1..100}
do
# do nothing just connect and exit
echo "exit" | nc ${ip} ${port};
done
iptables -nvL
当我运行两次时,它只会给我这个:
Chain INPUT (policy DROP 6 packets, 820 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8443 flags:0x17/0x02 #conn src/32 > 50 reject-with icmp-port-unreachable
0 0 DROP tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8443 state NEW recent: UPDATE seconds: 60 hit_count: 10 name: DEFAULT side: source mask: 255.255.255.255
200 12800 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8443
因此它似乎只是允许所有数据包通过......
该怎么办?
更新
我需要--set
先放,所以现在是:
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8443 state NEW recent: SET name: DEFAULT side: source mask: 255.255.255.255
0 0 DROP tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8443 state NEW recent: UPDATE seconds: 60 hit_count: 10 name: DEFAULT side: source mask: 255.255.255.255
100 6400 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8443
但仍然失败。
更新
已删除eth0
,现在是:
Chain INPUT (policy DROP 19 packets, 4244 bytes)
pkts bytes target prot opt in out source destination
0 0 tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8443 state NEW recent: SET name: DEFAULT side: source mask: 255.255.255.255
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8443 state NEW recent: UPDATE seconds: 60 hit_count: 10 name: DEFAULT side: source mask: 255.255.255.255
101 6464 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8443
结果相同,失败。
答案1
您的问题是您使用的iptables -I
是 而不是iptables -A
。这会导致您的规则顺序相反。该选项-I
表示将规则插入链的开头(当未指定规则编号时)。
使用选项的规则--set
应该是第一个,第二个规则应该是当超过定义的限制时丢弃流量的规则。