家用住宅主机Linux fail2ban自定义规则拦截跨境扫

家用住宅Linux主机暴露在公网后,每天都会收到大量跨境扫描,既占带宽又增加被攻击的可能。
本文面向零基础用户,一步步教你用fail2ban的自定义规则自动识别并封锁来自境外的扫描行为,保护你的小服务器。

核心思路

fail2ban本身不区分IP地域,但通过搭配geoip模块或第三方IP库,我们可以编写一个自定义filter,匹配日志中来自特定国家/地区的请求,然后触发action(比如iptables规则)封禁IP。
下面用最常见的配置方案——利用xt_recent配合CIDR黑名单,但更推荐使用ipsetgeoiplookup
本文采用简单且适合家用的方案:先记录频繁扫描的IP,再通过IP归属地判断是否跨境,然后封禁。

环境准备

  • 操作系统:Ubuntu 20.04+ / Debian 11+(其他发行版类似)
  • 已安装fail2ban(若未安装:sudo apt install fail2ban -y
  • 确认fail2ban服务运行:sudo systemctl status fail2ban
  • 准备一个用于收集扫描日志的jail(例如针对SSH),确保日志路径正确

自定义filter:识别高频访问尝试

fail2ban默认的sshd规则主要防暴力破解,但无法直接判断“来自境外”。
我们可以创建一个filter,匹配短时间内多次尝试连接的IP(比如1分钟内5次),然后交给action处理。
这一步是通用拦截的基础。

  1. 新建filter文件:

sudo vi /etc/fail2ban/filter.d/crossfire.conf

  1. 填入以下内容(以ssh为例,可复用):
[Definition]
failregex = ^.*Failed password for .* from  port \d+ ssh2$
            ^.*Connection closed by authenticating user .*  port \d+\]
ignoreregex =

这个正则匹配SSH登录失败和连接关闭的记录。
如果你想针对Nginx、Apache等其他服务,需要调整failregex。

创建jail并关联action

fail2ban的action负责执行封禁。
这里我们使用iptables封禁,并配合持久化(可选)。
注意不要直接使用iptables-reject,因为家用环境可能希望更温和地丢弃。

  1. /etc/fail2ban/jail.local中新增jail定义(如果没有则创建):
[crossfire]
enabled  = true
filter   = crossfire
logpath  = /var/log/auth.log
maxretry = 5
findtime = 60   # 一分钟内
duration = 86400 # 封一天
action   = iptables[name=crossfire, port=all, protocol=all]

注意:action使用了默认的iptables封禁所有端口。
家用场景下无需区分端口,直接封IP即可。

利用GeoIP判断是否跨境(进阶)

上述配置已能拦截高频扫描,但不区分地域。
如果你希望只拦截境外IP,可借助geoiplookup在action中做二次判断。
下面给出一个简易方案(需安装geoip-bin):

  1. 安装geoip-bin:sudo apt install geoip-bin -y
  2. 编写一个自定义action脚本,在封禁前检查IP归属地,如果是国内则放行(或跳过)。
  3. 但考虑到零基础用户,建议先使用通用高频拦截,再手动检查日志中的IP地域,逐步优化。

避坑指南

  • 不要直接修改jail.conf,应使用jail.localjail.d/下的配置文件,否则升级会被覆盖。
  • filter正则需匹配实际日志格式。不同系统的SSH日志略有不同(Ubuntu vs CentOS),建议先用fail2ban-regex测试:

sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/crossfire.conf

  • iptables策略冲突:如果同时配置了UFW或firewalld,需要确认fail2ban的iptables规则生效。
  • 小心误封自己:调试时建议将maxretry设大(如10),并先添加自己的IP到白名单:

sudo fail2ban-client set crossfire addignoreip 你的IP

效果验证

  1. 重启fail2ban:sudo systemctl restart fail2ban
  2. 查看当前被禁IP列表:sudo fail2ban-client status crossfire
  3. 观察日志:sudo tail -f /var/log/fail2ban.log
  4. 模拟测试:从另一台机器尝试多次错误SSH登录,看是否被拦截。
  5. 检查iptables:sudo iptables -L -n | grep fail2ban 应出现对应链及规则。

高频问题解答

Q:为什么我的fail2ban不生效?
A:先确认fail2ban服务运行,再检查日志路径是否正确,filter正则是否匹配。使用fail2ban-client status 查看状态。

Q:如何查看被拦IP来自哪个国家?
A:使用geoiplookup 223.xxx.xxx.xxx 查询。

Q:能自动封禁所有境外IP吗?
A:可以,但需要配置黑名单API或使用geoiplookup脚本,可能误封正常访问。建议先采用高频拦截策略,再逐步精确。

Q:封禁后如何解封?
A:sudo fail2ban-client set crossfire unbanip 被封IP

如果你正在处理家用住宅主机Linux fail2ban自定义规则拦截跨境扫描,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。

分享到:
上一篇
外贸站宝塔面板网站防关联容器隔离多站点部署实操指南
下一篇
外贸站宝塔面板网站服务器TLS协议升级兼容浏览器
1
系统公告

机房迁移升级通知

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