我在 Ubuntu Server 上使用 iptables。它是 VPS 上的 Web 服务器。
我想知道我是否应该限制数据包的速率。如果是,我应该限制多少速率?我应该全局限制还是每个 IP 地址都限制?
参考
我看到有人提出这样的建议:
# Limit packet traffic on a TCP or UDP port:
iptables -A INPUT -p $proto --destination-port $port --syn -m state --state NEW -m limit --limit $lim/s --limit-burst $lb -j ACCEPT
# Limit established/related packet traffic:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit $lim/s --limit-burst $lb -j ACCEPT
以上,全局速率限制似乎不太有用,至少对于我能想象的情况来说是这样。 有什么情况需要我全局限制速率?
我认为每个 IP 的速率限制通常更好:
# Add the IP to the list:
iptables -A INPUT -p $proto --destination-port $port --syn -m state --state NEW -m recent --set --name RATELIMITED
# Drop if exceeded limit:
iptables -A INPUT -p $proto --destination-port $port --syn -m state --state NEW -m recent --update --seconds $sec --hitcount $hc --rttl --name RATELIMITED -j DROP
# Accept if inside limit:
iptables -A INPUT -p $proto --destination-port $port --syn -m state --state NEW -j ACCEPT
附加问题:远程 IP 可能被欺骗。如何正确限制它们?
为此添加了另一个问题:
https://serverfault.com/questions/340258/how-to-rate-limit-spoofed-ips-with-iptables
目标
我正在尝试减轻一些 D/DoS 攻击和一般滥用的风险。
有关的
如何使用 iptables 限制 SSH 连接的速率?
附言:我刚刚针对 ICMP 打开了一个相关问题,其中包括此协议的速率限制:iptables | ICMP 的类型:哪些(潜在)有害?
答案1
速率限制并非预防措施,而是 DoS 的诱因 - 尤其是上述情况,如果未经身份验证且无状态信息的数据包超过一定速率,数据包将被丢弃。由于每个人都可以在此连接状态下轻松伪造数据包(包括源 IP 地址),因此将出现一种利用速率限制功能的新 DoS 攻击媒介。
速率限制通常仅在以下情况下才有意义:
- 配置中存在可预测的硬连接限制或软连接限制
- 将一般流量的速率限制设置为低于此限制,以便能够建立优先级或管理流量的连接,而不管负载如何
虽然 1. 通常很难确定,甚至不值得费心,但 2. 显然只有在您能够在建立连接时可靠地区分“优先级或管理”流量与其他流量时才会起作用 - 例如,如果它来自不同的网络接口。
在其他情况下,它宁愿降低系统的弹性而不是增强它。
答案2
-m limit 的问题在于,无论源 IP 地址是什么,都会限制所有 TCP 数据包。因此,如果你对 syn 数据包的限制较低,例如
-A INPUT -p tcp --syn -m limit --limit 30/s --limit-burst 30 -j ACCEPT
-A INPUT -p tcp --syn -j DROP
只有一个使用 hping 命令行的客户端可以通过发送尽可能多的带有 SYN 标志的 tcp 数据包来关闭您的服务器,因为限制规则将匹配,并且它会丢弃许多数据包,无论源 IP 地址是什么。限制不会区分好流量和坏流量。它也会关闭好的传入流量。
hping 可能是这样的:
hping thetargetedhostip -p 80 -S -c 1000 -i u20000
最好使用 hashlimit 来限制传入的 tcp 连接每个 IP 地址. 以下规则仅当每秒接收 30 个数据包时才会匹配,从而减少授权数据包的数量每个 IP每秒 15 个数据包。
-A INPUT -p tcp --syn -m hashlimit --hashlimit 15/s --hashlimit-burst 30 --hashlimit-mode srcip --hashlimit-srcmask 32 --hashlimit-name synattack -j ACCEPT
-A INPUT -p tcp --syn -j DROP
事实上,我确信今天被瘫痪的许多服务器并不是因为攻击时资源耗尽而导致的,而是因为限制模块丢弃了所有传入流量。
答案3
我通常将速率限制规则限制在我期望的服务器上:
- 预计流量较低
- 身份验证服务
例如,托管控制面板的登录页面、POP3、IMAP、SSH 等。我通常将 HTTP 服务保持开放,只有出现问题时才会阻止。
您不想丢失良好的网络流量。slashdot 上的链接可能会给您带来大量流量,而且由于全球规则,您可能不会意识到问题。
对于欺骗 IP,无法使用此方法阻止它们,而且通常不必担心,因为这些规则主要侧重于限制已建立的 TCP 连接。对于欺骗 IP,TCP 连接永远无法建立。