Iptables
配置iptables的誤區
可以以這種方式創建 iptables 邏輯嗎?
- 接受 ssh,http,https
- 如果這樣的 ip 已經連接,則丟棄連接(每個 ip / 1 秒只有 1 個連接)。
- 如果每個 ip / 1 秒有超過 50 個連接,則放入黑名單(我猜是 ipset)
- 每小時清理一次黑名單。
如果您發布一些準備使用的配置,我會很高興。現在我試圖使 connlimit 50conn/1 秒,但我看到數千個連接。
我假設限制(您在 2. 和 3. 中提到)適用於允許的 ssh/http/https 連接。
此外,我假設您想對源 IP 應用限制,而不考慮目標埠(即,如果我的 IP 由於 SSH 嘗試而被禁止,那麼它也被禁止用於 HTTP/HTTPS 流量)。
在這種情況下,您需要:
# flush all rules iptables -F # delete all user-defined chains iptables -X # set default policies iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP # allow packets from already estabilished connections iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m state --state INVALID -j DROP # limit connection to SSH to 1 per IP iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 1 --connlimit-mask 32 -j REJECT --reject-with tcp-reset # dtto for http iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 1 --connlimit-mask 32 -j REJECT --reject-with tcp-reset # dtto for https iptables -A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 1 --connlimit-mask 32 -j REJECT --reject-with tcp-reset # create new chain called "my-limited-chain" iptables -N my-limited-chain # set limits (allow 50 connections, erase failed attempts at a speed 50 attempts per hour), accept satisfactory traffic iptables -A my-limited-chain -m limit --limit 50/hour --limit-burst 50 -j ACCEPT # drop traffic over the limits iptables -A my-limited-chain -j DROP # redirect new SSH/HTTP/HTTPS connections to my-limited-chain iptables -A INPUT -p tcp --dport 22,80,443 -m state --state NEW -j my-limited-chain
注意:_
- 將 HTTP 和 HTTPS 流量限制為僅 1 個連接可能會導致性能下降,因為大多數 HTTP/S 客戶端都使用多個連接來加速多個元素網頁的載入。
- 這個片段完全忽略了 IPv6。如果您嘗試為 IPv6 分叉此解決方案,請注意
--connlimit-mask
,因為在 IPv6 中,有些機器可以有 1 個 IPv6 地址(--connlimit-mask 128
),而有些機器可以(並且應該)有多達 2^64 個 IPv6 地址(--connlimit-mask 64
)。- 有了這個確切的規則,被“50/h”限制禁止將禁止我建立新的連接,但它不會關閉我已經建立的連接