ufw与fail2ban联动可实现防火墙层面自动封禁恶意ip:fail2ban实时分析日志触发阈值后,调用ufw动态插入drop规则,1小时后自动解封,无需人工干预。

直接在防火墙层面动态拒绝非法IP,核心是让规则能自动识别并响应异常行为,而不是靠人工一条条加封禁。关键不在“怎么加一条规则”,而在于“规则如何自动更新”。下面分几种主流场景讲清楚。
Linux服务器用UFW + Fail2ban自动封IP
适合Web服务(如Nginx/Apache)遭暴力破解、高频扫描的场景。Fail2ban会实时分析日志,触发后自动调用UFW封禁IP。
- 安装并启用UFW:运行sudo ufw enable,默认已设为拒绝入站、允许出站
- 安装Fail2ban:sudo apt install fail2ban(Ubuntu/Debian)或sudo yum install fail2ban(CentOS)
- 配置监控规则:编辑/etc/fail2ban/jail.local,添加类似内容:
[nginx-bad-request]
enabled = true
filter = nginx-bad-request
logpath = /var/log/nginx/access.log
maxretry = 3
bantime = 1h
banaction = ufw - 重启服务:sudo systemctl restart fail2ban
此后,同一IP在1小时内触发3次400/404等异常请求,就会被UFW自动加入DROP规则,且1小时后自动解封。
Windows服务器用高级安全防火墙+脚本批量封禁
适合已有可疑IP列表(如SIEM告警导出、蜜罐捕获),需快速批量封堵,又不想装第三方软件。
- 准备IP列表文本文件blocked_ips.txt,每行一个IP(支持192.168.1.100或192.168.1.0/24)
- 用PowerShell执行批量封禁(管理员权限运行):
Get-Content blocked_ips.txt | ForEach-Object { New-NetFirewallRule -DisplayName "Block $_" -Direction Inbound -RemoteAddress $_ -Action Block -Profile Any -Enabled True } - 后续删规则也很简单:
Get-NetFirewallRule -DisplayName "Block *" | Remove-NetFirewallRule
注意:规则作用域选Any,确保在域/专用/公用网络下均生效;避免用“所有端口”规则,优先走默认拒绝策略+显式放行白名单更安全。
云平台(AWS/Azure/GCP)用网络ACL或安全组联动WAF
不建议直接在实例级防火墙封IP——云环境里,流量最先经过的是网络层ACL或WAF,效率更高、更前置。
- AWS:在VPC中配置网络ACL(Network ACL),添加入站规则,协议选All,源IP填恶意段,动作选Deny,规则号设得比允许规则小(如100 vs 200)以保证优先匹配
- Azure:用网络安全组(NSG)+ Azure Firewall策略,或直接集成Azure WAF,在“自定义规则”中设置Match variable: RemoteAddr,条件为Contains或IPMatch,动作设为Block
- GCP:用VPC防火墙规则配合Cloud Armor安全策略,后者支持基于IP地理位置、ASN、前缀列表的动态阻断,还能对接Pub/Sub实现实时封禁同步
这类配置可结合SIEM(如Splunk、Elastic Security)告警自动触发,通过云API调用完成闭环,真正实现“检测→决策→执行”秒级响应。
通用原则:让动态封禁真正生效的3个细节
很多规则写了却没效果,问题常出在底层逻辑上:
- 规则顺序决定成败:防火墙按序匹配,必须确保拒绝规则排在允许规则之前;UFW里用sudo ufw status numbered查编号,用sudo ufw insert 1 deny from x.x.x.x插到最前
- 作用域别写错:封攻击者IP,规则类型必须是入站(Inbound);若误配成出站,只会拦自己往外连,对攻击者毫无影响
- 别忽略IPv6:现代系统默认启IPv6,若只封了IPv4的192.168.1.100,攻击者可能换2001:db8::1继续打。UFW要开sudo ufw enable后自动管v6;Windows防火墙需单独建IPv6规则











