fail2ban 的 ignoreip 白名单不支持正则表达式,仅接受明确 ip、cidr 网段或可解析主机名,空格分隔;正则仅用于 filter 文件匹配日志,ignoreip 是匹配前的静态豁免检查。

Fail2Ban 的白名单(ignoreip)不支持正则表达式匹配,它只接受明确的 IP 地址、CIDR 网段或主机名(需能被系统解析为 IP),且各条目之间用空格分隔。所谓“白名单正则过滤”是一个常见误解——Fail2Ban 在 ignoreip 字段里不做任何模式匹配,也不解析正则。
真正用到正则的地方,是 filter 规则文件(如 /etc/fail2ban/filter.d/sshd.conf)中定义日志行匹配逻辑的部分,那里才靠正则识别“谁该被 ban”。而 ignoreip 是在匹配完成、计数触发前的最后一道豁免检查:只要来源 IP 属于 ignoreip 列表中的任一网段或地址,就直接跳过后续所有判断,永不封禁。
所以,要“精确匹配信任网段”,关键不是写正则,而是正确书写 CIDR 表达式并确保覆盖所有可信入口。
✅ 正确写法:用标准 CIDR 表示信任网段
ignoreip 支持以下格式(空格分隔):
- 单个 IPv4 地址:
192.168.1.100 - IPv4 网段(CIDR):
192.168.1.0/24 - IPv6 地址:
::1 - IPv6 网段:
2001:db8::/32 - 主机名(需
gethostbyname可解析):my-office.example.com
示例配置(写在 [DEFAULT] 或具体 jail 下):
ignoreip = 127.0.0.1/8 ::1 192.168.0.0/16 10.10.50.0/24 203.0.113.42
⚠️ 注意:
-
/8、/16、/24必须准确反映你实际使用的内网划分(比如 Docker 默认桥接网段常为172.17.0.0/16,不是192.168.0.0/16); - 不要写
192.168.*.*或192\.168\..*—— 这些会被当作无效字符串忽略,Fail2Ban 启动时会报 warning; - 多个网段之间只能用空格,不能用逗号、分号或换行。
❌ 常见错误与后果
错写成正则:
ignoreip = ^192\.168\.1\.
→ Fail2Ban 无法识别,该行被跳过,等效于没加白名单;掩码过大或过小:写
192.168.1.0/24却实际使用192.168.10.5
→ 该办公 IP 仍会被误封;混用 IPv4 和 IPv6 格式错误:
ignoreip = 127.0.0.1 ::1/128
→::1/128是合法的,但::1/64就不对(::1是单个地址,不应带/64);依赖未解析的主机名:
ignoreip = vpn-gateway
→ 若 DNS 故障或/etc/hosts未配,Fail2Ban 启动失败或白名单失效。
? 验证白名单是否生效
-
查看当前生效的 ignoreip(含继承关系):
sudo fail2ban-client get sshd ignoreip
-
模拟一次本机 SSH 失败登录(如输错密码),再查状态:
sudo fail2ban-client status sshd
输出中
IP list不应出现127.0.0.1或你配置的内网 IP。 -
手动测试某 IP 是否被忽略:
sudo fail2ban-client set sshd unbanip 192.168.1.100 2>/dev/null || echo "already ignored"
如果返回 “already ignored” 或无报错,说明该 IP 当前处于白名单逻辑中。
? 进阶建议:动态白名单(非正则,但更灵活)
如果你的办公出口 IP 是动态的(如家庭宽带),又不想频繁改配置,可:
- 使用域名(如
ignoreip = my-office.dyndns.org),并确保服务器能定期解析(配合fail2ban的backend = systemd+journalctl日志源时更稳定); - 结合外部脚本定时更新
/etc/fail2ban/jail.d/whitelist.local并重载:echo "[DEFAULT]" | sudo tee /etc/fail2ban/jail.d/whitelist.local echo "ignoreip = $(curl -s https://api.myip.com | jq -r '.ip')/32" | sudo tee -a /etc/fail2ban/jail.d/whitelist.local sudo systemctl reload fail2ban
但注意:这种方式需确保 API 可靠,且避免因网络问题导致白名单清空。
不复杂但容易忽略:白名单靠的是精确网段声明,不是模式匹配。写对 CIDR,比琢磨正则管用十倍。











