我应该使用iptables对数据包进行速率限制吗?


8

我在Ubuntu服务器上使用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连接的速率?

PS:我刚刚为ICMP打开了一个相关的问题,它包括此协议的速率限制:iptables | ICMP的类型:哪些有害(潜在)?

Answers:


6

速率限制不是预防措施,而是对DoS的邀请-特别是在上面介绍的形式中,如果超过了没有状态信息的未认证数据包的特定速率,数据包将被丢弃。由于每个人都可以在此连接状态下伪造数据包(包括源IP地址)而无需付出更多努力,因此将产生一个利用您的速率限制工具的新DoS攻击向量。

通常,只有在您拥有

  1. 配置中可预测的硬连接或软连接限制
  2. 将一般流量的速率限制设置为低于此限制,以便无论负载如何均可建立优先级或管理流量的连接

尽管1.通常很难确定甚至困扰,但2.仅在您能够在连接建立时可靠地将“优先级或管理”流量与其余流量区分开时(例如,如果它是通过不同的网络接口来传输的),则显然只能工作。

在其他情况下,它宁愿降低系统的弹性,也不愿增加系统的弹性。


嗨syneticon-dj。我理解并同意,配置错误的防火墙是进行DoS攻击的另一种工具。感谢您的注意!
ML-- 2011年

当防御合法流量时,按ip或按ip端口速率限制似乎也很有意义,该合法流量对于服务器而言过于庞大,但其始发者不太可能利用您提到的问题,例如,Bingbot或Facebook机器人。

3

-m限制的问题是无论源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限制每个IP地址的传入TCP连接。仅当每秒接收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

实际上,我深信,今天被关闭的许多服务器并不会因为攻击期间资源不足而被淘汰,而是因为限制模块会丢弃所有传入流量。


1

我通常将速率限制规则限制为我希望拥有的服务器:

  • 预期流量少
  • 认证服务

例如,托管控制面板的登录页面,POP3,IMAP,SSH等。我通常将HTTP服务保持打开状态,并且仅在出现问题时才阻止。

您不想丢弃良好的网络流量。slashdot上的链接可以向您发送大量流量,并且使用全局规则,您可能没有意识到问题。

对于欺骗性IP,无法使用此方法将其阻止,并且通常不必担心,因为这些规则主要集中在限制已建立的TCP连接上。如果使用欺骗IP,则永远无法建立TCP连接。


您好jeffatrackaid,感谢您的回答!我也倾向于(全局地)限制这些类型的服务(SSH等)的速率。关于HTTP流量,这就是为什么我不打算应用全局限制。在这个问题中,我希望看到是否存在某些情况下每个IP的限制会很有趣。关于欺骗性的IP(我对此提出了一个单独的问题),尽管无法建立连接,但有可能使用SYN泛洪来进行DoS。我仍然对如何缓解这种情况感兴趣。
ML-- 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.