家用住宅主机Linux fail2ban自定义规则拦截跨境扫
家用住宅Linux主机暴露在公网后,每天都会收到大量跨境扫描,既占带宽又增加被攻击的可能。
本文面向零基础用户,一步步教你用fail2ban的自定义规则自动识别并封锁来自境外的扫描行为,保护你的小服务器。
核心思路
fail2ban本身不区分IP地域,但通过搭配geoip模块或第三方IP库,我们可以编写一个自定义filter,匹配日志中来自特定国家/地区的请求,然后触发action(比如iptables规则)封禁IP。
下面用最常见的配置方案——利用xt_recent配合CIDR黑名单,但更推荐使用ipset或geoiplookup。
本文采用简单且适合家用的方案:先记录频繁扫描的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处理。
这一步是通用拦截的基础。
- 新建filter文件:
sudo vi /etc/fail2ban/filter.d/crossfire.conf
- 填入以下内容(以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,因为家用环境可能希望更温和地丢弃。
- 在
/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):
- 安装geoip-bin:
sudo apt install geoip-bin -y - 编写一个自定义action脚本,在封禁前检查IP归属地,如果是国内则放行(或跳过)。
- 但考虑到零基础用户,建议先使用通用高频拦截,再手动检查日志中的IP地域,逐步优化。
避坑指南
- 不要直接修改
jail.conf,应使用jail.local或jail.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
效果验证
- 重启fail2ban:
sudo systemctl restart fail2ban - 查看当前被禁IP列表:
sudo fail2ban-client status crossfire - 观察日志:
sudo tail -f /var/log/fail2ban.log - 模拟测试:从另一台机器尝试多次错误SSH登录,看是否被拦截。
- 检查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自定义规则拦截跨境扫描,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。