防火墙挡住大部分攻击,SSH 加固堵住暴力破解入口,但总有漏网之鱼。日志审计的价值在于:当攻击发生时,你能看到它。本文覆盖三层防线——自动封禁(fail2ban)、社区威胁情报(CrowdSec)、代理日志分析(xray)——让你从被动防御升级到主动检测。

一、日志审计的三层防线

防线工具能力适合谁
第一层fail2ban基于日志规则自动封禁 IP所有 VPS 用户
第二层CrowdSec社区共享威胁情报 + 行为分析追求更智能防护的用户
第三层xray 日志分析分析代理协议层的异常连接代理节点运维人员

三层可以独立使用,也可以叠加。fail2ban 是基础,CrowdSec 是进阶,xray 日志是代理专属。

二、fail2ban 深度配置

SSH 加固那篇已经介绍了 fail2ban 的基本安装和 SSH jail 配置。这里补充进阶用法。

2.1 多服务 jail 配置

fail2ban 不仅能保护 SSH,还能保护 Nginx、代理服务等:

# /etc/fail2ban/jail.local

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
banaction = iptables-multiport

[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400

[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5

[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 86400

2.2 自定义 filter

你可以创建自定义 filter 来匹配特定的攻击模式:

# /etc/fail2ban/filter.d/proxy-scan.conf
# 匹配对代理端口的扫描行为

[Definition]
failregex = ^.*连接到.*.*$
            ^.*Connection refused.*.*$
ignoreregex =

2.3 fail2ban 管理命令速查

命令用途
fail2ban-client status查看所有启用的 jail
fail2ban-client status sshd查看 SSH jail 详情(封禁 IP 列表、计数)
fail2ban-client set sshd banip 1.2.3.4手动封禁 IP
fail2ban-client set sshd unbanip 1.2.3.4手动解封 IP
fail2ban-client get sshd banned查看当前被封禁的 IP 数量
fail2ban-client reload重新加载配置(修改 jail.local 后执行)

2.4 邮件告警

# 在 jail.local 中配置邮件通知
[DEFAULT]
destemail = 你的邮箱@example.com
sender = fail2ban@你的域名.com
mta = sendmail
action = %(action_mwl)s

三、CrowdSec:社区驱动的威胁情报

CrowdSec 是 fail2ban 的现代替代品。核心区别在于:CrowdSec 不仅分析本地日志,还与全球社区共享威胁情报。当某个 IP 在全球多个服务器上被识别为攻击者时,所有部署了 CrowdSec 的服务器会自动封禁该 IP。

3.1 安装 CrowdSec

# Debian / Ubuntu
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | bash
apt install crowdsec crowdsec-firewall-bouncer-iptables -y

# CentOS / RHEL
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.rpm.sh | bash
yum install crowdsec crowdsec-firewall-bouncer

3.2 工作原理

  1. 日志收集:CrowdSec 的 acquisition 模块从系统日志、Nginx 日志、SSH 日志等收集数据。
  2. 场景匹配:预装的"场景"(scenarios)定义了各种攻击模式,如 SSH 暴力破解、HTTP 扫描等。
  3. 行为分析:CrowdSec 分析行为模式(频率、时序、来源),比简单的次数阈值更精准。
  4. 社区共享:被识别的攻击 IP 会匿名上报到 CrowdSec 中心,其他用户的服务器自动同步这些情报。
  5. 自动封禁:通过 firewall-bouncer 模块将决策下发到 iptables/nftables。

3.3 安装检测场景

# 查看已安装的场景
cscli scenarios list

# 安装常用的场景集合
cscli collections install crowdsecurity/linux
cscli collections install crowdsecurity/sshd
cscli collections install crowdsecurity/nginx
cscli collections install crowdsecurity/base-http-scenarios

# 查看安装结果
cscli collections list

3.4 日常管理

# 查看整体状态
systemctl status crowdsec

# 查看被决策(封禁)的 IP
cscli decisions list

# 手动封禁 IP
cscli decisions add --ip 1.2.3.4 --duration 24h --reason "手动封禁"

# 手动解封
cscli decisions delete --ip 1.2.3.4

# 查看警报
cscli alerts list

# 更新场景和情报
cscli hub update
cscli hub upgrade

3.5 CrowdSec vs fail2ban

对比项fail2banCrowdSec
威胁情报仅本地全球社区共享
行为分析简单计数多维度行为模型
误判率较高(纯计数)较低(行为分析 + 信誉评分)
资源占用极低略高(需要运行守护进程)
学习成本中等
社区生态成熟但封闭活跃,持续更新
💡 选哪个?
如果你已经有 fail2ban 在跑,不需要急着换。新部署的 VPS 可以直接上 CrowdSec。两者也可以同时运行——fail2ban 保护 SSH,CrowdSec 保护 Web 服务。

四、xray 日志分析

xray 代理服务端的日志记录了所有连接信息,是分析异常行为的第一手数据。

4.1 启用 xray 日志

{
  "log": {
    "loglevel": "warning",
    "access": "/var/log/xray/access.log",
    "error": "/var/log/xray/error.log"
  }
}
⚠️ 日志级别选择
loglevel 设为 warning 可以平衡信息量和磁盘占用。设为 info 会记录所有连接,日志量可能很大。debug 仅在排查问题时临时使用。

4.2 分析 access.log

access.log 记录了每次连接的基本信息:

# 查看最近的连接记录
tail -50 /var/log/xray/access.log

# 统计连接数最多的 IP(Top 20)
awk '{print $1}' /var/log/xray/access.log | sort | uniq -c | sort -rn | head -20

# 统计各用户(UUID)的连接数
awk '{print $3}' /var/log/xray/access.log | sort | uniq -c | sort -rn

# 查看特定时间段的连接
grep "2026/07/14" /var/log/xray/access.log | tail -30

4.3 分析 error.log

error.log 记录了连接失败和异常情况:

# 查看最近的错误
tail -50 /var/log/xray/error.log

# 常见错误类型
grep "failed" /var/log/xray/error.log | awk -F'failed' '{print $2}' | sort | uniq -c | sort -rn

# 查看连接超时
grep "timeout" /var/log/xray/error.log | tail -20

# 查看 TLS 握手失败
grep "tls" /var/log/xray/error.log | tail -20

4.4 异常模式识别

以下模式可能意味着你的节点被扫描或攻击:

异常模式特征可能原因应对措施
同一 IP 大量短连接短时间内来自同一 IP 的数百次连接尝试端口扫描 / 协议探测fail2ban/CrowdSec 自动封禁
频繁的 TLS 握手失败error.log 中大量 TLS 错误主动探测 / 协议指纹识别检查 Reality 配置是否正确
非预期的 UUID 连接access.log 中出现未分配的 UUIDUUID 泄露 / 暴力猜测轮换 UUID,检查日志中是否有规律
流量突增某用户流量异常高于平时账号被盗用 / 被滥用检查该用户的连接模式,必要时禁用
深夜大量连接凌晨 2-5 点出现连接高峰自动化攻击脚本配合 fail2ban 限制凌晨连接频率

五、流量异常监控

除了分析日志,还可以通过实时监控发现异常。

5.1 带宽监控

# 安装 iftop(实时带宽监控)
apt install iftop -y

# 监控指定网卡的实时流量
iftop -i eth0

# 安装 nload(更简洁的流量监控)
apt install nload -y
nload eth0

5.2 连接数监控

# 查看当前所有 TCP 连接
ss -tunap | grep xray | wc -l

# 按 IP 统计连接数
ss -tunap | grep xray | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10

# 实时监控(每 5 秒刷新)
watch -n 5 "ss -tunap | grep xray | wc -l"

5.3 简单的告警脚本

写一个 cron 脚本,当连接数超过阈值时发送通知:

#!/bin/bash
# /usr/local/bin/check-xray-connections.sh
# 检查 xray 连接数是否异常

THRESHOLD=500
CURRENT=$(ss -tunap | grep xray | wc -l)

if [ "$CURRENT" -gt "$THRESHOLD" ]; then
    echo "$(date): xray 连接数异常: $CURRENT (阈值: $THRESHOLD)" >> /var/log/xray-alert.log
    # 如需邮件通知,安装 mailutils 后取消下行注释
    # echo "xray 连接数异常: $CURRENT" | mail -s "xray Alert" 你的邮箱@example.com
fi

# 添加到 crontab(每 5 分钟检查一次)
# */5 * * * * /usr/local/bin/check-xray-connections.sh

六、日志轮转与存储

代理日志增长很快,需要配置日志轮转防止磁盘写满。

6.1 logrotate 配置

# /etc/logrotate.d/xray
/var/log/xray/*.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    create 0640 root root
    sharedscripts
    postrotate
        systemctl reload xray > /dev/null 2>&1 || true
    endscript
}

6.2 手动清理

# 查看日志文件大小
du -sh /var/log/xray/*

# 清空 access.log(不删除文件,xray 继续写入)
> /var/log/xray/access.log

# 删除 7 天前的日志
find /var/log/xray/ -name "*.log.*" -mtime +7 -delete

6.3 磁盘监控

# 检查磁盘使用率
df -h

# 查看哪些日志占用最多空间
du -sh /var/log/* | sort -rh | head -10

七、实战:完整监控方案搭建

将以上工具组合成一套完整的监控方案:

1

部署 fail2ban

保护 SSH 和 Nginx,自动封禁暴力破解 IP。这是最基础的防线。

2

启用 xray 日志

配置 access.log 和 error.log,设置合适的日志级别和轮转策略。

3

安装 CrowdSec(可选)

部署 CrowdSec 获取社区威胁情报,自动封禁全球已知的攻击 IP。

4

配置告警脚本

通过 cron 定期检查连接数和磁盘使用率,异常时通知。

5

定期审计

每周检查一次日志,关注异常 IP、流量突增、非工作时间连接。

💡 自动化 vs 人工审计
自动工具(fail2ban、CrowdSec、告警脚本)处理 90% 的情况。剩下 10% 需要人工判断——比如一个正常用户换了 IP 被误封,或者流量突增是因为正常的业务高峰。定期人工审计是最后一道防线。

八、常见问题排查

现象可能原因解决方案
fail2ban 封禁了正常用户阈值设置过低 / 用户频繁重试fail2ban-client set sshd unbanip IP,调高 maxretry
CrowdSec 未封禁任何 IP场景未安装 / 日志路径配置错误cscli scenarios list 检查,cscli acquisition list 检查日志路径
xray 日志为空日志路径不存在 / 权限不足创建目录 mkdir -p /var/log/xray,检查 xray 配置中的日志路径
日志写满磁盘未配置日志轮转 / 日志级别过高配置 logrotate,将 loglevel 改为 warning
连接数突然飙升被扫描 / 节点被公开分享检查 access.log 中的来源 IP,封禁异常 IP
CrowdSec 更新失败网络问题 / API 限速cscli hub update 重试,检查网络连接