防火墙挡住大部分攻击,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 工作原理
- 日志收集:CrowdSec 的 acquisition 模块从系统日志、Nginx 日志、SSH 日志等收集数据。
- 场景匹配:预装的"场景"(scenarios)定义了各种攻击模式,如 SSH 暴力破解、HTTP 扫描等。
- 行为分析:CrowdSec 分析行为模式(频率、时序、来源),比简单的次数阈值更精准。
- 社区共享:被识别的攻击 IP 会匿名上报到 CrowdSec 中心,其他用户的服务器自动同步这些情报。
- 自动封禁:通过 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
| 对比项 | fail2ban | CrowdSec |
|---|---|---|
| 威胁情报 | 仅本地 | 全球社区共享 |
| 行为分析 | 简单计数 | 多维度行为模型 |
| 误判率 | 较高(纯计数) | 较低(行为分析 + 信誉评分) |
| 资源占用 | 极低 | 略高(需要运行守护进程) |
| 学习成本 | 低 | 中等 |
| 社区生态 | 成熟但封闭 | 活跃,持续更新 |
四、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 中出现未分配的 UUID | UUID 泄露 / 暴力猜测 | 轮换 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
七、实战:完整监控方案搭建
将以上工具组合成一套完整的监控方案:
部署 fail2ban
保护 SSH 和 Nginx,自动封禁暴力破解 IP。这是最基础的防线。
启用 xray 日志
配置 access.log 和 error.log,设置合适的日志级别和轮转策略。
安装 CrowdSec(可选)
部署 CrowdSec 获取社区威胁情报,自动封禁全球已知的攻击 IP。
配置告警脚本
通过 cron 定期检查连接数和磁盘使用率,异常时通知。
定期审计
每周检查一次日志,关注异常 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 重试,检查网络连接 |