Iptables

配置iptables的誤區

  • August 21, 2019

可以以這種方式創建 iptables 邏輯嗎?

  1. 接受 ssh,http,https
  2. 如果這樣的 ip 已經連接,則丟棄連接(每個 ip / 1 秒只有 1 個連接)。
  3. 如果每個 ip / 1 秒有超過 50 個連接,則放入黑名單(我猜是 ipset)
  4. 每小時清理一次黑名單。

如果您發布一些準備使用的配置,我會很高興。現在我試圖使 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”限制禁止將禁止我建立新的連接,但它不會關閉我已經建立的連接

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