自定义fail2ban规则拦截全网跨境扫描IP

核心答案

通过自定义fail2ban规则,可以针对来自非中国地区的IP进行自动封禁,有效拦截全网跨境扫描对服务器SSH、HTTP等服务的攻击。
本文以Debian/Ubuntu为例,使用MaxMind GeoIP数据库判断IP归属国,编写filter和action配置文件,最后在jail中启用。
全程命令可复制,零基础也能操作,配置完成后可通过fail2ban-client status查看封禁记录。

为什么跨境扫描需要重点防范

大量跨境扫描IP来自海外肉鸡或VPS,它们会持续试探SSH弱口令、Web漏洞等。
仅靠系统自带防火墙手动封禁不现实,而fail2ban结合GeoIP可以自动识别并封禁非中国IP的异常请求,大幅降低人工维护成本。

准备fail2ban运行环境

确保服务器已安装fail2ban和必要依赖(Debian/Ubuntu):

apt update && apt install fail2ban geoip-database geoip-database-extra -y

如果系统没有自带的geoip-database-extra,可以手动下载MaxMind GeoLite2数据库,但注意许可证;
建议直接安装发行版提供的包。
检查fail2ban版本和运行状态:

fail2ban-client --version
systemctl status fail2ban

如果未运行,执行systemctl start fail2ban

编写自定义过滤规则和动作

1. 创建针对SSH服务的国家过滤规则

/etc/fail2ban/filter.d/下新建文件sshd-country.conf

[Definition]
failregex = ^%(__prefix_line)s(?:Authentication failure|Failed password|Connection closed) for .* from  port \d+ ssh2$
ignoreregex =

这条规则匹配SSH登录失败的行,与系统自带sshd filter相同,只是我们后续要通过action来检查IP国家。

2. 编写Action调用GeoIP查国家

/etc/fail2ban/action.d/下新建iptables-country.conf

[Definition]
actionban = ipset add fail2ban-  2>/dev/null || true
             -I  1 -p  --dport  -m set --match-set fail2ban- src -j DROP 2>/dev/null || true
actionunban = ipset del fail2ban-  2>/dev/null || true
               -D  -p  --dport  -m set --match-set fail2ban- src -j DROP 2>/dev/null || true
[Init]
chain = INPUT
name = default
port = ssh
protocol = tcp

这个动作使用ipset集合高效管理封禁IP。
我们还需要在actionban之前在自定义脚本中判断国家。

3. 集成国家判断到动作(以禁止非中国IP为例)

更直接的方式是在filter阶段利用fail2ban的geoiplookup命令。
但零基础推荐使用现成的社区方案:安装fail2ban-geoip插件(部分系统有),或者直接用下面这个已打磨好的配置。

实际生产中,可以修改actionban为一段bash脚本:

actionban = if [ $(geoiplookup  | grep -c "Country: CN") -eq 0 ]; then ipset add fail2ban-  && iptables规则... ; fi

为了简化演示,我们假设你已经通过其他方式(如ipset列表)确定了“跨境扫描IP”,本规则直接封装这些IP。

配置Jail启用自定义规则

编辑/etc/fail2ban/jail.local(如不存在则新建),添加以下内容:

[sshd-country]
enabled = true
port    = ssh
filter  = sshd-country
logpath = %(sshd_log)s
maxretry = 3
bantime = 86400
action  = iptables-country[name=SSH, port=ssh, protocol=tcp]

如果是针对HTTP服务,复制一份修改port和filter即可。

生效与验证

重启fail2ban使配置生效:

systemctl restart fail2ban

查看状态:

fail2ban-client status sshd-country

显示Currently banned: 0
尝试从境外IP进行SSH登录失败3次,再用fail2ban-client status sshd-country查看封禁数,应变为1。
同时检查iptables规则:

iptables -L -n | grep fail2ban

应看到有DROP规则。

常见问题与排错

Q1:自定义规则没有生效,封禁数为0?
A:检查日志路径是否正确(/var/log/auth.log),并确保filter正则匹配当前日志格式。可手动测试:fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd-country.conf

Q2:如何更新GeoIP数据库以识别最新国家归属?
A:发行版自带的geoip-database-extra不会自动更新,建议每月手动从MaxMind官网下载GeoLite2-Country.mmdb,并替换系统数据库。具体路径可通过geoiplookup 8.8.8.8查看。

Q3:误封了国内正常IP怎么办?
A:使用fail2ban-client set sshd-country unbanip 立即解封。另外可以在actionban中加入白名单检查,或使用ignoreregex过滤境内地址。

Q4:能否针对多个端口(如SSH + HTTP)共用一套规则?
A:可以创建多个jail实例,每个实例使用不同的action端口参数,但filter可以复用同一个sshd-country。注意每个实例名称唯一(如sshd-country、http-country)。

如果你正在配置自定义fail2ban规则拦截全网跨境扫描IP,建议先从SSH服务开始测试,确认生效后再扩展到其他服务。
遇到异常时优先检查/var/log/fail2ban.log中的报错,大部分问题都能在那里找到线索。
实际部署时,还可以将actionban中的iptables替换为firewalld或nftables,语法略有不同。
云服务器厂商(如泽御云)通常默认开启基础防护,配合fail2ban规则能进一步提升独服或云主机的安全性。

分享到:
上一篇
容器隔离多站点彻底解决跨境平台关联风控
下一篇
Nginx升级仅保留TLS1.2/1.3兼容浏览器
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意