第一部分:Fail2Ban 的安装与卸载
1. 安装 Fail2Ban
在终端输入以下命令:
sudo apt update
sudo apt install fail2ban -y
安装完成后,服务会自动启动。你可以通过 sudo systemctl status fail2ban 查看其状态。
2. 彻底卸载 Fail2Ban
如果你不再需要它,可以执行以下命令:
# 停止并删除程序
sudo apt remove --purge fail2ban -y
# 清理残留的配置文件
sudo rm -rf /etc/fail2ban
sudo rm -rf /var/lib/fail2ban
第二部分:核心配置步奏
Fail2Ban 的工作需要两个文件:过滤器 (Filter) 告诉它抓什么,监狱 (Jail) 告诉它封多久。
1. 创建过滤器(定义恶意行为)
直接运行这条命令,它会自动创建并写入规则:
sudo tee /etc/fail2ban/filter.d/adguard-home.conf <<EOF
[Definition]
# 匹配 AdGuard 日志中查询 A, TXT 或 ANY 记录的客户端 IP
failregex = ^.* \[dns\] .* client <HOST>:\d+ - query: .* (A|TXT|ANY) IN
ignoreregex =
EOF
原理:
该规则会寻找日志中疯狂请求解析的行为。
2. 创建监狱(设定封禁策略)
针对你担心的“刷抖音误杀”和“慢速攻击”,我们设定一个平衡参数:
findtime (60秒):统计 1 分钟内的行为。
maxretry (30次):1 分钟内解析超过 30 个新域名才封禁(兼容高频上网)。
bantime (10天):一旦抓到,封锁 10 天。
直接运行以下命令写入:
sudo tee /etc/fail2ban/jail.d/adguard.local <<EOF
[adguard-home]
enabled = true
filter = adguard-home
port = 53
protocol = udp
logpath = /opt/AdGuardHome/AdGuardHome.log
maxretry = 30
findtime = 60
bantime = 864000
EOF
3. 激活配置
每次修改完文件,必须重启才能生效:
sudo systemctl restart fail2ban
第三部分:日常管理与查询
配置完成后,你需要学会如何查看“战果”以及如何自救。
1. 查询监狱状态(看抓了多少人)
sudo fail2ban-client status adguard-home
Currently banned: 当前被关在大牢里的 IP 数量。
Total banned: 历史总计封禁人数。
2. 解封 IP(如果自己被误杀了)
如果你发现自己无法连接 DNS,说明你的 IP 触发了规则。请切换到手机流量连接服务器执行:
# 解封特定 IP
sudo fail2ban-client set adguard-home unbanip 你的公网IP
# 或者直接释放所有被封的 IP
sudo fail2ban-client unban --all
3. 实时盯着“抓捕现场”
想亲眼看到系统正在干活,可以运行:
sudo tail -f /var/log/fail2ban.log
第四部分:小白避坑指南
文件后缀名:/etc/fail2ban/jail.d/ 目录下的配置文件必须以 .local 结尾。
日志路径:请确保你的 AdGuard Home 日志路径确实是 /opt/AdGuardHome/AdGuardHome.log。如果路径不对,Fail2Ban 会启动失败。
白名单保护:为了永远不封锁你自己,建议在 jail.local 中加入 ignoreip = 127.0.0.1/8 你的家庭固定IP。
性能压力:Fail2Ban 在内核层拦截(iptables),比在 AdGuard 软件里拦截更省 CPU,也不会增加服务器负担。
建议下一步操作: 你可以先运行 sudo fail2ban-client status adguard-home 看看现在是否有 IP 被捕获。如果攻击依然很猛且带宽占用高,我们可以进一步将 maxretry 调小。
只看被禁的ip总数,不看具体的ip sudo fail2ban-client status adguard-home | grep "Currently banned"
# 查看国外封禁情况(预计这里的人数会增长较快)
sudo fail2ban-client status adguard-foreign
# 查看国内封禁情况(预计这里大部分时间应该是 0)
sudo fail2ban-client status adguard-domestic
sudo tee /etc/fail2ban/jail.d/adguard.local <<EOF
[adguard-foreign]
enabled = true
filter = adguard-json
port = 53
protocol = udp
logpath = /opt/AdGuardHome/data/querylog.json
findtime = 180
maxretry = 50
ignorecommand = /usr/sbin/ipset test cn_ip <ip>
bantime = 8640000
banaction = iptables-ipset-proto4
[adguard-domestic]
enabled = true
filter = adguard-json
port = 53
protocol = udp
logpath = /opt/AdGuardHome/data/querylog.json
findtime = 300
maxretry = 1000
bantime = 3600
banaction = iptables-ipset-proto4
EOF
中国i段的执行地址 /usr/local/bin/update-cn-ipset.sh
中国ip段的存放地址 /var/lib/ipset/cn.zone
以后你只需要输入 fstats 就能一次性看全两个监狱的战况了。
查看国外监狱 (严格模式) 的 IP 列表:
sudo ipset list f2b-adguard-foreign | less
查看国内监狱 (宽松模式) 的 IP 列表:
sudo ipset list f2b-adguard-domestic | less
只统计当前到底封了多少个 IP (不看具体数字):
# 统计国外监狱封禁总数
sudo ipset list f2b-adguard-foreign | grep -c '^[0-9]'
检查某个特定 IP 是否在黑名单中: 如果你怀疑某个 IP 被封了,直接查它:
sudo ipset test f2b-adguard-foreign 1.2.3.4
释放所有被封禁的国外ip
sudo ipset flush f2b-adguard-foreign
云南聚优阁