自定义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规则能进一步提升独服或云主机的安全性。