配置 iptables 的误解

配置 iptables 的误解

可以通过这种方式创建 iptables 逻辑吗?

  1. 接受 ssh、http、https
  2. 如果该 IP 已连接,则断开连接(每 IP/秒仅限 1 个连接)。
  3. 如果每 ip / 1 秒的连接数超过 50 个,则将其列入黑名单(我猜是 ipset)
  4. 每小时清理黑名单。

如果您发布一些现成的配置,我会很高兴。现在我试图将连接限制设置为每秒 50 个连接,但我看到数千个连接。

答案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/小时”限制禁止将禁止我建立新的连接,但不会关闭我已经建立的连接

相关内容