在Debian系统中,使用ufw(Uncomplicated Firewall)配置速率限制是防御端口扫描最有效的手段之一。核心做法是通过ufw的limit规则,对特定端口设置连接频率上限,比如每30秒最多允许6个新连接,超过的直接丢弃。这样即使攻击者用工具对你的服务器做全端口扫描,每个端口触发限速后就会被阻断,扫描效率大幅降低,同时正常用户的访问完全不受影响。下面我会从原理、配置步骤、进阶策略到日志监控,把这套方案讲透。
为什么速率限制能防端口扫描
端口扫描的本质是短时间内向目标服务器的大量端口发送探测包。常见的扫描工具如nmap、masscan,每秒可以发出数千甚至上万个探测请求。如果你的防火墙对每个端口都开放且没有任何限制,扫描器几分钟就能把你所有端口摸清楚。而速率限制的逻辑是:设定一个时间窗口内允许的最大连接数,超出就静默丢弃。这意味着扫描器每探测一个端口,触发限速后就要等一段时间才能继续,整个扫描过程会被拖慢几十倍甚至上百倍,很多扫描工具会因此放弃或者被你的IDS/IPS捕获。
Debian上ufw的基础安装与启用
Debian 10/11/12默认已经预装ufw,如果没有可以直接安装。先检查ufw是否存在:
which ufw ufw version
如果没装,执行:
sudo apt update sudo apt install ufw -y
启用ufw之前,务必先设置默认策略,否则可能把自己锁在外面:
sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw enable
这三条命令的含义是:拒绝所有入站连接、允许所有出站连接、开启防火墙。开启后,你需要显式放行必要的端口,比如SSH和HTTP:
sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp
配置速率限制规则的核心语法
ufw的limit规则格式如下:
sudo ufw limit [端口]/[协议]
默认参数是每30秒最多6个连接。如果你想自定义,需要直接编辑ufw的配置文件。默认的limit规则定义在/etc/ufw/before.rules中,你会看到类似这样的内容:
# limit SSH -A ufw-before-input -p tcp --dport 22 -m limit --limit 3/min -j ACCEPT
这里的--limit 3/min表示每分钟3个连接。你可以根据需要修改这个值。更精细的做法是在/etc/ufw/before6.rules(IPv6)和/etc/ufw/before.rules(IPv4)中添加自定义规则。
针对常见服务端口配置速率限制
以下是针对Debian服务器上常见服务的速率限制配置方案。假设你的服务器只开放SSH(22)、HTTP(80)、HTTPS(443)三个端口,其余全部拒绝。
首先,对SSH端口做严格限速,防止暴力破解:
sudo ufw limit 22/tcp
这会对22端口应用默认的30秒6个连接限制。如果你觉得太松,可以手动编辑规则:
sudo nano /etc/ufw/before.rules
在文件中找到或添加:
-A ufw-before-input -p tcp --dport 22 -m limit --limit 2/min --limit-burst 3 -j ACCEPT
这里--limit 2/min表示每分钟最多2个新连接,--limit-burst 3表示允许短时间内突发3个连接(用于正常的多次登录尝试)。这个配置对暴力破解非常有效,攻击者每分钟只能试2次密码。
对Web服务端口(80和443)也加上速率限制,防止HTTP洪水和慢速扫描:
sudo ufw limit 80/tcp sudo ufw limit 443/tcp
Web服务的限速可以稍微宽松一些,因为正常用户访问量可能较大。如果你想自定义Web端口的限制,同样编辑before.rules:
-A ufw-before-input -p tcp --dport 80 -m limit --limit 10/min --limit-burst 15 -j ACCEPT -A ufw-before-input -p tcp --dport 443 -m limit --limit 10/min --limit-burst 15 -j ACCEPT
对所有未明确放行的端口应用默认限速策略
很多人只对开放的端口做限速,但忽略了一个关键点:攻击者扫描的是那些你没有开放的端口。ufw默认策略是deny incoming,这意味着未放行的端口本来就会被拒绝。但"拒绝"和"限速后拒绝"效果不同。限速后拒绝会让扫描器以为端口在线但有防护,从而消耗扫描器的时间和资源;而直接拒绝则让扫描器快速跳过。
如果你想对所有入站流量做一个全局的速率限制(在默认deny之前加一层限速),可以这样做。编辑/etc/ufw/before.rules,在*filter部分的开头添加:
-A ufw-before-input -p tcp -m limit --limit 5/min --limit-burst 10 -j DROP
这条规则会对所有TCP入站流量先做限速,超过5个/分钟的直接丢弃。注意这条规则要放在你的ACCEPT规则之前,否则先被ACCEPT的端口就不会被限制了。规则顺序在ufw中非常重要,先匹配的先执行。
使用ufw应用配置文件做更精细的控制
ufw支持应用级别的配置文件,存放在/etc/ufw/applications.d/目录下。你可以创建自定义应用配置,把速率限制写进去,管理起来更清晰。例如创建一个SSH限速的应用配置:
sudo nano /etc/ufw/applications.d/ssh-limited
写入以下内容:
[ssh-limited] title=SSH with rate limiting description=Secure Shell with connection rate limiting ports=22/tcp [ssh-limited-ipv6] title=SSH with rate limiting (IPv6) description=Secure Shell with connection rate limiting (IPv6) ports=22/tcp
然后用这个应用名来启用规则:
sudo ufw allow ssh-limited
不过要注意,这种方式的限速参数还是需要在before.rules里定义。应用配置更多是为了组织和可读性,实际的限速逻辑仍依赖iptables规则。
查看和验证已配置的速率限制规则
配置完成后,用以下命令查看当前所有规则:
sudo ufw status verbose
你会看到类似这样的输出:
Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) To Action From -- ------ ---- 22/tcp LIMIT IN Anywhere 80/tcp LIMIT IN Anywhere 443/tcp LIMIT IN Anywhere 22/tcp (v6) LIMIT IN Anywhere (v6)
看到"LIMIT IN"就说明速率限制已经生效。如果想看底层iptables规则,可以执行:
sudo iptables -L -n -v | grep limit
这会显示所有带limit模块的规则及其命中计数,方便你确认规则是否在正常工作。
配合fail2ban实现动态封禁
ufw的速率限制是静态的、固定阈值的防护。如果想要更智能的防护,可以配合fail2ban使用。fail2ban会监控日志文件,当检测到某个IP在短时间内多次触发限速或登录失败,就自动在iptables中添加规则封禁该IP。安装和配置如下:
sudo apt install fail2ban -y sudo systemctl enable fail2ban sudo systemctl start fail2ban
fail2ban默认自带ufw的action配置,在/etc/fail2ban/action.d/ufw.conf中。你可以创建自定义jail来针对SSH暴力破解:
sudo nano /etc/fail2ban/jail.local
[sshd] enabled = true port = 22 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600 action = ufw
这里maxretry=3表示3次失败就封禁,bantime=3600表示封禁1小时。fail2ban和ufw速率限制配合使用,形成双层防护:ufw先做基础限速,fail2ban再做动态封禁,安全性大幅提升。
监控和日志分析
速率限制生效后,被丢弃的包会记录在系统日志中。你可以通过以下方式监控:
sudo tail -f /var/log/syslog | grep UFW
或者查看iptables的丢弃计数:
sudo iptables -L ufw-before-input -n -v
关注pkts和bytes列的增长速度。如果某个端口的丢弃包数量在短时间内暴增,说明有人在针对性扫描或攻击你的服务器。你可以据此调整限速阈值,或者用fail2ban自动封禁高频攻击源。
另外,建议开启ufw的日志功能,方便事后审计:
sudo ufw logging on
日志级别可以设为low、medium、high,生产环境建议用medium或high。
常见误区和注意事项
第一,不要对所有端口都设置相同的限速值。SSH应该最严,Web服务可以稍松,数据库端口(如3306、5432)如果不对外暴露就不需要单独限速,因为默认deny已经挡住了。第二,限速规则的顺序至关重要,ACCEPT规则必须在LIMIT规则之前,否则限速不会对已放行的端口生效。第三,修改before.rules后需要重启ufw才能生效:
sudo ufw disable sudo ufw enable
第四,如果你使用的是云服务器,还需要在云平台的安全组里做对应配置,ufw只是系统层面的防火墙,网络层面的防护同样不可少。第五,速率限制不能替代其他安全措施,它只是纵深防御体系中的一环,定期更新系统、使用强密码、禁用root登录等基础操作同样重要。
总结
在Debian上用ufw配置速率限制防端口扫描,本质上是用最小的配置成本获得显著的安全收益。核心步骤就是:安装启用ufw、设置默认拒绝策略、对关键端口添加limit规则、按需调整限速参数、配合fail2ban做动态封禁、持续监控日志。这套方案不需要额外安装复杂的安全软件,系统自带工具就能搞定,适合从个人VPS到企业服务器的各种场景。记住,安全不是一次性的配置,而是持续的运营,定期检查规则、分析日志、根据威胁情报调整策略,才能真正把端口扫描和暴力破解挡在门外。
