UFW的速率限制:设置限制


22

UFW的手册页提到它可以为我设置iptables速率限制:

ufw支持连接速率限制,这对于防止暴力登录攻击很有用。如果IP地址在最近30秒内尝试启动6个或更多连接,则ufw将拒绝连接。有关 详细信息,请参见 http://www.debian-administration.org/articles/187。典型用法是:

     ufw limit ssh/tcp

不幸的是,这是我能找到的所有文档。我想坚持使用UFW,而不要使用更复杂的iptables命令(以使事情“不复杂”)。

我如何使用ufw将端口80上的所有传入(非传出)流量限制为每30秒20个连接?如何禁用端口30000至30005的速率限制?默认情况下是否为所有端口启用速率限制?

Answers:


21

UFW被设计为“简单”,在这种情况下,这意味着您无法控制连接受限速率的细节。如果您想深入研究UFW的Python源,则可以了解如何进行调整。适当的信息是(在我的Ubuntu 10.04系统上)/usr/share/pyshared/ufw/backend_iptables.py

因此,撇开时间问题,这是最后一些有关速射问题的答案。

  1. 假设10.10.10.0/24是您的本地网络,这会将默认限制规则应用于端口80 / tcp输入:

    ufw limit proto tcp from any port 80 to 10.10.10.0/24
    
  2. 和3.速率限制默认情况下未启用。要将其添加到除所需范围之外的每个(目标)端口中,请使用此规则。请注意,规则(即使具有范围)也是原子单位,无法拆分。例如,您不能为任何端口添加规则,然后delete为特定范围添加(不存在)规则以将其删除。limit也不是的可接受参数ufw default

    ufw limit from any to any port 0:29999,30006:65535
    

这是否意味着无法设置速率?
汤姆(Tom)

2
并非没有黑客的源代码,至少对于UFW 0.30pre1-0ubuntu2而言并非如此,这是Ubuntu 10.04的最新版本。从当前资源的情况看,这没有改变。但是,您可以将iptables规则放入/etc/ufw/after.rules(或/etc/ufw/before.rules)中,这些规则也将被使用。有关更多信息,请参见man ufw-framework
bonsaiviking 2012年

@bonsaiviking是否有可能iptable,如果是,则iptable是ufw的后端。
Nullpointer

6

如前一篇文章所述,您可以自定义user.rules。我需要在6秒内达到最多12个连接的smtp连接速率限制。我首先添加了如下所示的规则。注意:这会添加一个限制规则,默认情况下允许30秒内6秒钟

ufw limit smtp

并编辑了/lib/ufw/user.rules(我通过许多其他调整保留了该文件的自定义副本),如下所示...

### tuple ### limit tcp 25 0.0.0.0/0 any 0.0.0.0/0 in
-A ufw-user-input -p tcp --dport 25 -m state --state NEW -m recent --set
-A ufw-user-input -p tcp --dport 25 -m state --state NEW -m recent --update --seconds 6 --hitcount 12 -j ufw-user-limit
-A ufw-user-input -p tcp --dport 25 -j ufw-user-limit-accept

我在/ etc / ufw中找到了user.rules
Otto Kanellis,

5

可以通过ufw规则文件(位于/lib/ufw/user.rules中)更改速率限制。默认情况下,没有为所有端口启用限制。您应该手动添加每个端口或通过编辑user.rules文件。


1

值得指出使用ufw的LIMIT功能可能导致的意外后果。

假设第一个ufw规则在端口22 / tcp上设置了总括限制:

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     LIMIT IN    Anywhere                  
...

假设仍然可以通过以下ufw规则以及最后的默认策略“ deny(incoming)”来过滤在该限制下运行的任何连接。

至少对于UFW 0.35,该假设是错误的。实际上,LIMIT IN逻辑立即接受未由限制条件拒绝的任何输入。

在伪代码中,LIMIT逻辑为

if CONDITION then DENY else ACCEPT

而其他ufw规则似乎具有逻辑性:

if CONDITION then (DENY|ACCEPT) else continue to next rule

我个人发现这是ufw LIMIT的意外行为,只有在系统日志文件中意外地发现许多22号端口登录尝试后,才发现该行为,但由于其他ufw规则过滤,该尝试从未发生过。

行为确认的细节

ufw插入的iptables代码的相关行如下:

-A ufw-user-input -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 6 --name DEFAULT --mask 255.255.255.255 --rsource -j ufw-user-limit
-A ufw-user-input -p tcp -m tcp --dport 22 -j ufw-user-limit-accept
-A ufw-user-limit -m limit --limit 3/min -j LOG --log-prefix "[UFW LIMIT BLOCK] "
-A ufw-user-limit -j REJECT --reject-with icmp-port-unreachable
-A ufw-user-limit-accept -j ACCEPT

上面的清单可以用

iptables -S | grep ufw-user-limit

前两行是连续的ufw-user-input,可以通过

iptables -S | grep ufw-user-input
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.