Linux
iptables 並限制每 IP 每分鐘的請求數
我正在跑步
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
結果一樣,失敗。
您的問題是您使用
iptables -I
的是iptables -A
. 這會導致您的規則處於相反的順序。該選項-I
表示在鏈的頭部插入規則(當沒有指定規則編號時)。使用
--set
選項的規則應該是第一個,第二個規則應該是超過定義限制時丟棄流量的規則。