Linux

iptables 並限制每 IP 每分鐘的請求數

  • December 3, 2018

我正在跑步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

結果一樣,失敗。

您的問題是您使用iptables -I的是iptables -A. 這會導致您的規則處於相反的順序。該選項-I表示在鏈的頭部插入規則(當沒有指定規則編號時)。

使用--set選項的規則應該是第一個,第二個規則應該是超過定義限制時丟棄流量的規則。

引用自:https://serverfault.com/questions/942631