跳到主内容

使用 Fail2ban 防御 CC 攻击(Nginx Proxy Manager 实战教程)

CC(Challenge Collapsar)攻击本质上就是大量“看起来正常”的 HTTP 请求,短时间内把服务器带宽、CPU、连接数打满。相比 DDoS 的流量洪水,CC 更隐蔽,也更常见,尤其是 VPS 和小型网站。这篇文章用 **Fail2ban + Nginx Proxy Manager 日志分析 + iptables**,实现一套轻量级自动封禁方案。

GSProber · 主机测评编辑112 阅读
CC(Challenge Collapsar)攻击本质上就是大量“看起来正常”的 HTTP 请求,短时间内把服务器带宽…

安装 Fail2ban

在 Debian / Ubuntu 上安装并启动 Fail2ban

Bash
sudo apt update
sudo apt install -y fail2ban

sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban --no-pager

安装完成后,Fail2ban 会在后台运行,并且默认自带 SSH 防护(sshd jail)。


🔍 创建 Nginx Proxy Manager 日志过滤器

Fail2ban 的核心就是“读日志 + 正则匹配 + 封 IP”。

我们先创建一个专门解析 Nginx Proxy Manager 日志的 filter。

Bash
vi /etc/fail2ban/filter.d/nginx-proxy-manager.conf

写入内容:

INI
[Definition]

# Nginx Proxy Manager 日志过滤器
# 日志格式: [时间] - 状态码 - 方法 协议 域名 "路径" [Client IP]

# 匹配客户端 IP(关键)
failregex = \[Client <HOST>\]

# 忽略规则(可选)
ignoreregex =

# 时间格式
datepattern = ^\[%d/%b/%Y:%H:%M:%S %z\]

👉 核心点:

  • <HOST> = Fail2ban 自动识别 IP
  • failregex 决定“什么行为算攻击

🚨 创建 Jail 规则(核心防御逻辑)

接下来定义 cc 防御规则。

Bash
vi /etc/fail2ban/jail.d/nginx-proxy-manager.conf

写入:

INI
[nginx-proxy-manager]

enabled = true
filter = nginx-proxy-manager

# NPM 日志路径(按实际修改)
logpath = proxy-host-15_access.log

backend = pyinotify

# 1分钟内最多请求数
maxretry = 1000

# 统计时间窗口(60秒)
findtime = 60

# 封禁时间(72小时)
bantime = 259200

# 使用自定义 iptables 动作
action = npm-iptables

# 白名单 IP
ignoreip = 127.0.0.1/8 ::1
           192.168.0.0/16
           10.0.0.0/8

🔥 创建 iptables 封禁动作

Fail2ban 默认也支持 iptables,但这里我们自定义更直观。

Bash
vi /etc/fail2ban/action.d/npm-iptables.conf

写入:

INI
[Definition]

actionstart =
actionstop =
actioncheck =

# 封禁 IP
actionban = iptables -I INPUT 1 -s <ip> -j DROP
            iptables -I FORWARD 1 -s <ip> -j DROP

# 解封 IP
actionunban = iptables -D INPUT -s <ip> -j DROP
              iptables -D FORWARD -s <ip> -j DROP

[Init]

👉 逻辑说明:

  • DROP = 直接丢弃请求(不返回任何响应)
  • INPUT / FORWARD 双链封锁更彻底

🧪 测试 Fail2ban 配置

1️⃣ 测试过滤器是否生效

Bash
sudo fail2ban-regex proxy-host-15_access.log /etc/fail2ban/filter.d/nginx-proxy-manager.conf

如果匹配成功,会看到:

  • matched lines
  • detected IP

2️⃣ 检查 jail 配置

Bash
sudo fail2ban-client -d

查看所有 jail:

Bash
sudo fail2ban-client status

🚀 启动 Fail2ban

Bash
sudo systemctl restart fail2ban

sudo systemctl status fail2ban

🛠 常用管理命令

🔒 手动封 IP

Bash
sudo fail2ban-client set nginx-proxy-manager banip 1.2.3.4

🔓 手动解封 IP

Bash
sudo fail2ban-client set nginx-proxy-manager unbanip 1.2.3.4

📋 查看封禁列表

Bash
sudo fail2ban-client status nginx-proxy-manager

🔄 重新加载配置

Bash
sudo fail2ban-client reload

📊 监控与日志分析

查看 Fail2ban 日志

Bash
sudo tail -f /var/log/fail2ban.log

查看封禁记录

Bash
sudo grep "Ban" /var/log/fail2ban.log | tail -20

查看解封记录

Bash
sudo grep "Unban" /var/log/fail2ban.log | tail -20

📡 查看 iptables 防火墙规则

Bash
sudo iptables -L INPUT -n -v --line-numbers
sudo iptables -L FORWARD -n -v --line-numbers

📘 Nginx Access 日志分析(cc 攻击排查)

🔥 统计访问最频繁 IP

Bash
cat access.log | awk '{print $12}' | sort | uniq -c | sort -nr | more

🔥 查看某 IP 访问路径

Bash
cat access.log | grep '75.221.79.53' | awk '{print $10}' | sort | uniq -c | sort -nr

🔥 SQL 注入扫描行为

Bash
cat access.log | awk '/select/{print $1}' | sort | uniq -c | sort -nr

cat access.log | awk '/\/and\//||/\+and\+/||/%20and%20and/{print $1}' | sort -nr

cat access.log | awk '/sleep/{print $1}' | sort -nr

🧠 cc 攻击防御思路总结

Fail2ban 的核心逻辑就是:

“谁在短时间内请求太多 → 直接封 IP”

适用于:

  • VPS 小网站
  • Nginx / Proxy Manager
  • API 服务
  • WordPress / Node.js 站点

⚔️ 进阶优化建议

如果你想更强一点,可以加:

✔ 限流(Nginx)

Nginx
limit_req_zone $binary_remote_addr zone=cc:10m rate=10r/s;

✔ Cloudflare WAF

  • JS Challenge
  • Rate Limit Rules

Fail2ban + Cloudflare API(高级)

自动封 IP 到 Cloudflare 层


🧪 简易端口扫描脚本(辅助防护)

Python
import socket
import termcolor

def scan(target, ports):
    print('\nStarting Scan For ' + str(target))
    for port in range(1, ports):
        scan_port(target, port)

def scan_port(ipaddress, port):
    try:
        sock = socket.socket()
        sock.connect((ipaddress, port))
        print("[+] Port Opened " + str(port))
        sock.close()
    except:
        pass

targets = input("Enter Targets (split by ,): ")
ports = int(input("Scan Port Range: "))

if ',' in targets:
    for ip_addr in targets.split(','):
        scan(ip_addr.strip(), ports)
else:
    scan(targets, ports)

📌 结论

Fail2ban 并不是“防一切攻击”的工具,但在 VPS 场景里,它是:

💡 成本最低、效果最直接的 cc 防御方案之一

配合 Nginx + Cloudflare 使用,可以覆盖 80% 常见小流量攻击

教程GsDesk 是一款基于 Cloudflare Workers 与 VPS 自托管 的开源远程桌面项目,支持 WebR…

Cloudflare Workers 免费搭建开源远程桌面完整教程:无需 VPS,支持 WebRTC P2P、D1、KV、R2、浏览器远程控制、Windows 客户端和文件传输

GsDesk 是一款基于 Cloudflare Workers 与 VPS 自托管 的开源远程桌面项目,支持 WebRTC P2P 直连,服务端仅负责 API、身份认证和 WebSocket 信令,不中转桌面视频流,大幅降低服务器带宽成本。项目支持 Cloudflare 免费套餐 部署,也可以使用 Docker 在 VPS 上自托管,内置 Windows 客户端、浏览器控制端、手机远程控制,支持 8 位设备 ID、OTP 一次性密码、永久密码、Ed25519 设备认证、JWT 身份验证、文件传输、剪贴板同步、自动重连 等完整功能。

307 阅读

教程如果你一直想拥有一个属于自己的网盘,但又不想买 VPS、维护数据库或者折腾复杂环境,那么这个基于 Cloudflare…

CloudDisk:基于 Cloudflare Workers 的免费个人网盘,无需 VPS、MySQL,支持 R2+D1+KV 一键部署

如果你一直想拥有一个属于自己的网盘,但又不想买 VPS、维护数据库或者折腾复杂环境,那么这个基于 Cloudflare Workers 的开源项目 CloudDisk 值得看看。整个系统运行在 Cloudflare 免费套餐上,文件存储使用 R2,数据库使用 D1,会话数据使用 KV,不需要 MySQL,也不需要服务器。支持多用户登录、文件夹管理、分享链接、在线预览、Office 文档查看、文本在线编辑、大文件断点续传、协作者权限管理等功能。无论是个人备份、开发者存放代码文件、团队共享资料,还是搭建自己的私有网盘,都可以直接部署到 Cloudflare,一键完成,几乎零维护成本,非常适合独立开发者、个人站长和轻量团队使用。

284 阅读

教程很多朋友在使用 Linux 服务器或者 VPS 时,经常会遇到 DNS 污染、解析慢、域名无法访问等问题。其实只需要安…

Linux 开启 DNS over HTTPS(DoH)教程:使用 Cloudflared + systemd 实现加密 DNS,防污染、防劫持

很多朋友在使用 Linux 服务器或者 VPS 时,经常会遇到 DNS 污染、解析慢、域名无法访问等问题。其实只需要安装 Cloudflare 官方的 cloudflared,并配合 systemd 自启动,就能让整个系统通过 DNS over HTTPS(DoH)进行加密解析。

229 阅读

常见问题

用 Fail2ban 防御 CC 攻击的核心思路是什么?

核心逻辑是"谁在短时间内请求太多,就直接封 IP",具体做法是让 Fail2ban 读取 Nginx Proxy Manager 的访问日志,用正则匹配客户端 IP,超过设定的请求阈值后自动调用 iptables 封禁该 IP。

jail 配置里 maxretry、findtime、bantime 这几个参数分别代表什么?

在文中的示例配置里,findtime = 60 表示 60 秒的统计窗口,maxretry = 1000 表示该窗口内最多允许 1000 次请求,超过后触发封禁,bantime = 259200 表示封禁时长为 72 小时(259200 秒)。

怎么手动封禁或解封一个 IP?

手动封禁执行 sudo fail2ban-client set nginx-proxy-manager banip 1.2.3.4;手动解封执行 sudo fail2ban-client set nginx-proxy-manager unbanip 1.2.3.4;查看当前封禁列表用 sudo fail2ban-client status nginx-proxy-manager

除了 Fail2ban,还有哪些方式可以加强 CC 防护?

可以在 Nginx 层加限流规则,例如 limit_req_zone $binary_remote_addr zone=cc:10m rate=10r/s;;也可以配合 Cloudflare 的 JS Challenge 和 Rate Limit Rules,或者用 Fail2ban 联动 Cloudflare API 把封禁同步到 Cloudflare 层。

评价与回复

无需登录;审核通过后公开显示。