多层流量过滤:ipset、自动封禁与 CrowdSec 提升服务器安全
基于 ipset 的过滤系统结合可疑 IP 自动封禁和 CrowdSec,将垃圾流量从 12% 降至 0.3% 以下。封禁在 Linux 内核层(L3/L4)执行,早于 nginx 和 PHP-FPM 处理请求。这大大减轻了生产环境 Bitrix 站点的服务器负载,此前针对 .env、wp-login.php 和 config.php 的扫描曾导致失败率飙升至 99%。
核心优势:封禁过程完全透明、IP 列表原子级更新,以及模块化设计,便于项目定制快速调整。
相较外部 WAF 和 CDN 的优势
外部 WAF 和 CDN 适合全球大规模应用,但对于低流量本地部署,自建过滤系统更实用。
自建的主要理由:
- 完全掌控:精确查看哪些 IP 被封、依据何种规则、封禁时长。
- 应用前封堵:垃圾流量不浪费 nginx/PHP 资源。
- 高度灵活:轻松添加 Bitrix 专属规则,如 .env 或 .git。
- 简洁高效:无额外层级膨胀技术栈。
分析基于 HTTP 日志(L7),但数据包丢弃通过 iptables + ipset 在内核层完成。
三层防御架构
系统分层逐步过滤。
第一层:地理封禁。 无关国家的数据包立即丢弃,无需 HTTP 解析。
第二层:可疑 IP 自动封禁。 地理过滤后,扫描 wp-login.php、shell.php、.env 等模式,违规者封禁 2 小时。
第三层:CrowdSec。 防护器将全球黑名单注入 ipset,并设置 TTL。
模块化设计允许独立开关各层,最大限度降低误杀。
ipset:可扩展性基石
传统 iptables 处理数千 IP 规则时,进行 O(n) 线性扫描,高负载下性能崩盘。
ipset 采用 hash:ip 或 hash:net 实现 O(1) 查找:
-m set --match-set blocked_ips src
列表更新通过临时集合和交换实现原子操作,无中断:
ipset create "${country}_temp" hash:net 2>/dev/null || ipset flush "${country}_temp"
if [[ -s "$temp_file" ]]; then
while read network; do
ipset add "${country}_temp" "$network"
done < "$temp_file"
ipset swap "${country}_temp" "$country"
fi
ipset destroy "${country}_temp"
即使批量刷新列表,防护也牢不可破。
基于模式的扫描检测
auto-block-suspicious.sh 脚本尾随日志,锁定可疑请求:
- wp-login.php(即使在 Bitrix 上)。
- shell.php、shoha.php。
- .env、.git、.aws/credentials。
IP 自动封禁 2 小时。例如,200+ 次 /wp-login.php 攻击在 20–30 秒内化解,负载瞬间恢复正常。
封禁统计:
- 中国:8,802 个 IP。
- 可疑:10 个 IP(如 4.193.97.168、195.178.110.109)。
CrowdSec 集成
CrowdSec 防护器填充 crowdsec_blacklist ipset 并设置 TTL:
- 自动同步全球签名。
- 超时自动过期。
CrowdSec 增强自定义模块,处理已知威胁无需重构逻辑。
实施效果
指标对比(2025 无 WAF vs. 2026 有 WAF):
| 指标 | 无防护 | 有 WAF |
|------------------|--------------|-------------|
| 垃圾流量 | ~12% | <0.3% |
| 负载平均值 | 1.8–2.5 | 0.9–1.2 |
| 失败率 | 高达 40% | 12–15% |
扫描 RPS 峰值在内核层消亡,分析数据现无机器人干扰。
局限性:
- 无应对高流量 L4 攻击能力。
- 需 CMS 更新(Bitrix)。
- 住宅 IP 防护较弱。
- 不适配全球 CDN 规模项目。
核心要点
- 可扩展性:ipset 实现数百万 IP 的 O(1) 检查。
- 原子性:交换机制避免过滤空白。
- 模块化:独立层(地理、可疑、CrowdSec)精准调优。
- 高效性:垃圾流量降至 0.3%,负载减半。
- 透明度:全程可见,无黑盒。
— Editorial Team
暂无评论。