iptables 限制每个 IP 每分钟的请求数

iptables 限制每个 IP 每分钟的请求数

我正在运行Debianiptables试图限制用户每分钟接受我的网站超过 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应该是第一个,第二个规则应该是当超过定义的限制时丢弃流量的规则。

相关内容