使用 UFW 进行速率限制:设置限制

使用 UFW 进行速率限制:设置限制

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 的速率限制?所有端口的速率限制是否默认启用?

答案1

UFW 的设计初衷是“简单”,在这种情况下,这意味着您无法控制连接速率限制的细节。如果您想深入了解 UFW 的 Python 源代码,您可以了解如何对其进行调整。相关信息(在我的 Ubuntu 10.04 系统上)位于/usr/share/pyshared/ufw/backend_iptables.py

因此,先把时间问题放在一边,下面是对您最后提出的快速问题的回答。

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

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

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

答案2

正如上一篇文章中提到的,您可以自定义 user.rules。我需要将 smtp 连接速率限制为 6 秒内最多 12 个连接。我首先添加了一条规则,如下所示。注意:这会添加一条限制规则,默认允许 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

答案3

可以在 UFW 规则文件上更改速率限制/lib/ufw/user.rules

默认情况下,所有端口均未启用限制。您应该手动或通过编辑user.rules文件来添加每个端口。

答案4

值得指出的是,使用 ufw 的 LIMIT 功能可能会产生意想不到的后果。

假设对端口 22/tcp 设置全面限制作为第一条 ufw 规则:

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

假设任何在限制下运行的连接仍然可以通过遵循 ufw 规则进行过滤,最后通过默认策略“拒绝(传入)”进行过滤。

至少对于 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

相关内容