Fail2ban进阶实战:香港服务器自定义规则防CC攻击/扫描器/暴力破解完整配置

Fail2ban进阶实战:香港服务器自定义规则防CC攻击/扫描器/暴力破解完整配置

默认安装的 Fail2ban 只保护 SSH(防止密码暴力破解),但服务器面临的威胁远不止于此:Web 扫描器持续探测漏洞、CC 攻击用正常 HTTP 请求耗尽资源、API 接口被暴力破解凭证……本文在香港服务器上构建一套多维度的 Fail2ban 防御体系,针对每种攻击模式编写精准的拦截规则。


一、Fail2ban 工作原理

<code">
日志文件(Nginx access.log / auth.log / 自定义日志)
    │ 实时监控
    ▼
Filter(正则表达式过滤器,提取攻击特征)
    │ 匹配到攻击行为
    ▼
Jail(监狱配置,定义触发阈值和封禁时长)
    │ 达到阈值(如10次/分钟)
    ▼
Action(动作,如 iptables DROP / 发送告警)
    │
封禁攻击 IP(防火墙直接丢弃该 IP 的数据包)

二、安装与基础配置

<code"># 安装
apt update && apt install -y fail2ban

# 创建本地配置(覆盖默认配置,升级时不会被覆盖)
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# /etc/fail2ban/jail.local 全局配置
[DEFAULT]
# 白名单(本机 IP 和可信 IP 永远不被封)
ignoreip = 127.0.0.1/8 ::1 你的办公室IP/32

# 默认封禁时长(可被各 jail 覆盖)
bantime  = 3600      # 1小时
findtime = 600       # 10分钟内
maxretry = 5         # 触发次数

# 封禁方式(iptables-multiport 比 iptables 效率更高)
banaction = iptables-multiport
banaction_allports = iptables-allports

# 日志级别
loglevel = INFO
logtarget = /var/log/fail2ban.log

systemctl enable --now fail2ban

三、防 SSH 暴力破解(增强版)

<code"># /etc/fail2ban/jail.d/sshd-custom.conf
[sshd]
enabled  = true
port     = 2222          # 与实际 SSH 端口一致
logpath  = /var/log/auth.log
backend  = systemd       # Ubuntu 22.04 用 systemd

# 比默认更严格的策略
maxretry = 3             # 3次失败
findtime = 300           # 5分钟内
bantime  = 86400         # 封禁24小时

# 累犯加重(需要 fail2ban >= 0.10)
bantime.increment = true
bantime.factor    = 2    # 每次封禁时间翻倍
bantime.maxtime   = 604800  # 最长封禁7天

四、防 Nginx CC 攻击(自定义 Filter)

<code"># /etc/fail2ban/filter.d/nginx-cc.conf
[Definition]
# 匹配 Nginx 访问日志中的请求
# 日志格式:IP - - [时间] "方法 路径 协议" 状态码 字节
failregex = ^ -.*"(GET|POST|HEAD) .*HTTP.*" (200|301|302|404|429) .*$

# 排除静态资源(图片/CSS/JS 不计入请求频率)
ignoreregex = ^ -.*"(GET|HEAD) .*\.(css|js|jpg|jpeg|png|gif|webp|ico|woff2) HTTP.*$
<code"># /etc/fail2ban/jail.d/nginx-cc.conf
[nginx-cc]
enabled  = true
port     = http,https
logpath  = /var/log/nginx/access.log
filter   = nginx-cc
backend  = auto

# CC 攻击通常是高频请求,设置严格阈值
maxretry = 200           # 10分钟内超过200次请求
findtime = 600           # 10分钟窗口
bantime  = 7200          # 封禁2小时

# 累犯加重
bantime.increment = true
bantime.factor    = 3

五、防 Web 扫描器(特征识别)

<code"># /etc/fail2ban/filter.d/nginx-scanner.conf
[Definition]
# 匹配常见扫描器的请求特征:
# 1. 扫描敏感路径(wp-admin/phpinfo/.env 等)
# 2. 扫描器 User-Agent
# 3. 大量 404 请求

failregex = ^ -.*"(GET|POST) /(wp-admin|phpinfo|\.env|\.git|admin|login\.php|shell|config|backup|database) HTTP.*$
            ^ -.*"(GET|POST) .*\.(php|asp|aspx|jsp|cgi) HTTP.*" 404 .*$
            ^ -.*(sqlmap|nikto|masscan|nmap|zgrab|nuclei|dirbuster|hydra|havij) .*$

ignoreregex =
<code"># /etc/fail2ban/jail.d/nginx-scanner.conf
[nginx-scanner]
enabled  = true
port     = http,https
logpath  = /var/log/nginx/access.log
filter   = nginx-scanner
backend  = auto

# 扫描器一经发现立即封禁
maxretry = 3             # 只需3次命中
findtime = 300           # 5分钟内
bantime  = 604800        # 封禁7天(扫描器不需要客气)

六、防 API 暴力破解(自定义登录接口)

<code"># /etc/fail2ban/filter.d/api-brute.conf
[Definition]
# 匹配登录接口返回 401/403 的请求
# 适用于 FastAPI/Express 等框架的登录接口
failregex = ^ -.*"POST /api/(v\d+/)?(auth/login|login|token|signin) HTTP.*" (401|403) .*$

ignoreregex =
<code"># /etc/fail2ban/jail.d/api-brute.conf
[api-brute]
enabled  = true
port     = http,https
logpath  = /var/log/nginx/access.log
filter   = api-brute
backend  = auto

maxretry = 10            # 10次失败
findtime = 300           # 5分钟内
bantime  = 3600          # 封禁1小时

七、飞书实时告警(Action 配置)

<code"># /etc/fail2ban/action.d/feishu-notify.conf
[Definition]
actionban   = curl -s -X POST "https://open.feishu.cn/open-apis/bot/v2/hook/your_webhook" \
              -H "Content-Type: application/json" \
              -d "{\"msg_type\":\"text\",\"content\":{\"text\":\"🚫 Fail2ban封禁\n服务器:$(hostname)\n规则:\n被封IP:\n失败次数:\n封禁时长:秒\n时间:$(date '+%Y-%m-%d %H:%M:%S')\"}}"

actionunban = curl -s -X POST "https://open.feishu.cn/open-apis/bot/v2/hook/your_webhook" \
              -H "Content-Type: application/json" \
              -d "{\"msg_type\":\"text\",\"content\":{\"text\":\"✅ Fail2ban解封\nIP:\n规则:\"}}"

[Init]
name = default
<code"># 在 jail.local 的 [DEFAULT] 中全局启用飞书告警
[DEFAULT]
action = %(action_)s
         feishu-notify[name=%(__name__)s]

# 或者只在特定 jail 中启用
# /etc/fail2ban/jail.d/nginx-scanner.conf 中追加:
# action = %(banaction)s[name=%(__name__)s, port="%(port)s"]
#          feishu-notify[name=%(__name__)s]

八、常用管理命令

<code"># 查看所有 jail 状态
fail2ban-client status

# 查看特定 jail 的被封 IP 列表
fail2ban-client status nginx-cc

# 手动解封 IP(误封时)
fail2ban-client set nginx-cc unbanip 1.2.3.4

# 手动封禁 IP(立即生效)
fail2ban-client set nginx-scanner banip 1.2.3.4

# 测试 Filter 是否正确匹配日志
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-cc.conf

# 查看 fail2ban 日志
tail -f /var/log/fail2ban.log | grep -E "Ban|Unban|Found"

# 查看当前所有封禁(iptables 规则)
iptables -L f2b-nginx-cc -n --line-numbers

九、IP 黑名单持久化

<code"># 将重复攻击的 IP 永久加入黑名单
cat > /usr/local/bin/f2b-permanent-ban.sh << 'EOF' #!/bin/bash # 查找过去30天内被封禁超过5次的 IP,加入永久黑名单 BLACKLIST="/etc/fail2ban/ip-blacklist.conf" grep "Ban " /var/log/fail2ban.log | \ awk '{print $NF}' | \ sort | uniq -c | sort -rn | \ awk '$1>=5{print $2}' \
  > /tmp/frequent-attackers.txt

while read ip; do
    if ! grep -q "$ip" "$BLACKLIST"; then
        echo "$ip" >> "$BLACKLIST"
        iptables -I INPUT -s "$ip" -j DROP
        echo "永久封禁: $ip"
    fi
done < /tmp/frequent-attackers.txt EOF chmod +x /usr/local/bin/f2b-permanent-ban.sh echo "0 6 * * * root /usr/local/bin/f2b-permanent-ban.sh" >> /etc/crontab

十、总结

Fail2ban 的核心价值在于主动防御:不等攻击者成功就预先封禁可疑 IP。本文实现了四层防御:SSH 暴力破解防护、Nginx CC 攻击封禁、Web 扫描器识别封禁、API 凭证暴力破解防护。配合飞书实时告警,运维人员能在攻击发生的第一时间感知并介入,是香港服务器安全体系不可或缺的一环。

Telegram