
今天凌晨 02:13,我值班的监控面板突然被一串高频 TCP SYN 报警刷屏——攻击源来自数百个境外 IP,目标正是托管在香港沙田机房的关键 API 节点。过去我只依赖传统的 iptables 静态规则,很快就发现单纯的五元组过滤无法抵挡变形快速的攻击面。那一夜,我在 30 分钟内临时启用了 Suricata IPS 与 nftables 的联动,才把流量压制在可控范围,业务延迟从 3 s 降回 160 ms。事后复盘,我把当晚的应急脚本沉淀为一套可复用的 “防火墙 + IPS + 高可用” 方案,下文便是完整的实操教程与配置细节。
1. 方案概览与组件选型
| 目标 | 方案 | 关键理由 |
|---|---|---|
| Stateful 防火墙 | nftables (Kernel 5.15+) | 原生内核模块、支持套件化链表、eBPF/XDP 兼容,吞吐优于 iptables |
| 入侵检测/防御 | Suricata 7.x | 多线程、GPU-offload、支持 NFQUEUE 主动阻断 |
| 高可用 | Keepalived VRRP | 无需硬件负载均衡,主备切换 < 1 s |
| 监控 | node_exporter + Suricata-prometheus-exporter | 单一观测面、便于 SLA 量化 |
| 配置管理 | Ansible | 声明式部署、一次编写多处复用 |
- 业务连续性指标
- MTTR ≤ 5 min
- 99.95 % SLA 在 250 k pps 攻击下保持 ≤ 200 ms 平均延迟
- 网络吞吐保留 ≥ 80 % 正常流量带宽
2. 环境准备与网络拓扑
- 机房:香港沙田 Tier 3+ 数据中心(BGP Anycast 接入)
- 硬件:Dell R7525 × 2,单机 2 × AMD EPYC 7453 32C / 256 GB RAM / 4 × 25 GbE Intel XXV710
- 操作系统:Ubuntu 22.04.4 LTS (Kernel 5.15-lts-xdp)
- 网络模型:双节点同 VLAN,虚拟 VIP 192.0.2.10/32 由 VRRP 漂移
┌───────────────┐ ┌───────────────┐
Internet → │ Border GW1 │ ... │ Border GW2 │
└──────┬────────┘ └──────┬────────┘
│25 GbE Trunk (ECMP)
┌────────┴────────┐
│ Aggregation TOR │ ↴ ERSPAN
└────────┬────────┘
25 GbE │
┌───────────────┴───────────────┐
│ R7525-A (MASTER) R7525-B (BACKUP) │
│ nftables + Suricata + XDP AF_XDP │
└─────────────────────────────────────┘
3. 步骤详解
3.1 威胁建模
- L3/L4 Flood:SYN、ACK、UDP flood,目标端口 443、80
- L7 攻击:SQLi、XSS、路径穿越
- 僵尸网络扫描:Shodan、Censys 批量探测
- 0-day Exploit:利用过期内核模块、CMS 漏洞
3.2 部署 nftables 国密级防火墙
# 建议在 Ansible role 中模板化
nft -f - <<'EOF'
flush ruleset
table inet filter {
sets {
blacklist4 { type ipv4_addr; flags timeout; }
}
chain input {
type filter hook input priority 0; policy drop;
# Allow established
ct state { established, related } accept
# Block已知恶意
ip saddr @blacklist4 drop
# Allow management
iifname "lo" accept
tcp dport { 22 } ct state new ip saddr 203.0.113.0/24 accept
# Forward HTTP/HTTPS to IPS
tcp dport { 80,443 } ct state new jump IPS_HOOK
}
chain IPS_HOOK {
# NFQUEUE 号随 Suricata 配置
ip protocol tcp queue num 2 bypass
}
}
EOF
systemctl enable --now nftables
要点
- 单独 blacklist4 集合支持超时,配合 Suricata 自动灌黑。
- queue num 2 bypass 可在 Suricata 宕机时保持业务通。
3.3 Suricata IPS 在线阻断
y
# /etc/suricata/suricata.yaml 精简片段
af-packet:
- interface: eth0
cluster-id: 99
defrag: yes
xdp-mode: driver
use-mmap: yes
nfqueue:
- id: 2
accept-mark: 0x01
fail-open: yes
# 启用 Emerging Threats + 自定义规则
rule-files:
- emerging-dos.rules
- local.rules
本地自定义规则 /etc/suricata/rules/local.rules
# Detect masscan Aggressive SYN
alert tcp any any -> $HOME_NET any (msg:"Masscan SYN Flood"; flags:S; threshold:type both, track by_src, count 150, seconds 1; classtype:web-application-attack; sid:900001; rev:1;)
# Block and push to nftables set
drop tcp any any -> $HOME_NET 22 (msg:"SSH Brute Force"; flags:S; threshold:type threshold, track by_src, count 10, seconds 60; nft_set:inet filter blacklist4; classtype:attempted-admin; sid:900002; rev:1;)
启动:
apt-get install -y suricata
systemctl enable --now suricata
3.4 防火墙-IPS 联动
- NFQUEUE:nftables 将流量送入队列 2,Suricata 决策 ACCEPT 或 DROP。
- 动态封禁:利用 nft_set 动态写入黑名单集合,省去二次解析。
- fail-open:Suricata 异常退出时,由 nftables 直接放行流量,减少误杀。
3.5 高可用与业务连续性
# /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 55
priority 150
advert_int 1
virtual_ipaddress {
192.0.2.10/32 dev eth0 label eth0:vip
}
track_script {
chk_suricata
}
}
vrrp_script chk_suricata {
script "/usr/local/bin/suri_check.sh" # 退出码!=0时降权
interval 2
weight -20
}
漂移测试:
for i in {1..100}; do curl -s -o /dev/null -w "%{http_code} " https://api.example.hk/status; done
切换期间最大失败请求 ≤ 3 %。
3.6 监控告警
- node_exporter:主机 CPU 软中断、NIC queue drops
- Suricata exporter:流量 pps、签名触发次数
PrometheusRule 示例
- alert: SuricataHighDropRate
expr: suricata_nfqueue_drops_total / suricata_nfqueue_packets_total > 0.05
for: 30s
labels:
severity: critical
annotations:
summary: "Suricata NFQUEUE drop > 5%"
description: "High drop ratio may indicate performance bottleneck."
3.7 性能调优与硬件加速
| 优化项 | 命令/参数 | 效果 |
|---|---|---|
| RSS + RPS | ethtool -L eth0 combined 32 ;sysctl net.core.rps_sock_flow_entries=32768 |
多核并行包处理 |
| XDP (af_xdp) | xdp-loader load eth0 xdp.o |
下降 20 % 内核路径开销 |
| Suricata runmode | suricata --af-packet + detect-prematch |
单节点 40 Gbps+ |
| HugePages | /etc/sysctl.d/hugepages.conf |
减少 TLB miss |
4. 场景化规则示例
4.1 SYN Flood
limit rate 100/second burst 200 packets drop # 速率限制
tcp flags syn tcp option maxseg size set 1300 # 基于 MSS 异常过滤
4.2 HTTP 攻击(SQLi)
alert http any any -> $HOME_NET any (msg:"SQLi attempt"; content:"union select"; nocase; http_uri; classtype:web-application-attack; sid:800001; rev:2;)
drop http any any -> $HOME_NET any (msg:"SQLi block"; content:"/**/"; nocase; http_uri; nft_set:inet filter blacklist4; sid:800002; rev:1;)
4.3 SSH 暴力破解
tcp dport 22 ip saddr 0.0.0.0/0 ct state new meter ssh_limit { ip saddr timeout 1m counter } \
ct count over 10 drop
5. 故障排查与性能压测
工具 用法 关注点
suricatactl pcap-filter 回放失败包 检查误杀规则
tcpdump -nn -Q out -i nfqueue:2 捕获出队流量 确认 Suricata 决策
hping3 --flood --syn -p 80 VIP 压测 SYN flood 观测 ct state & packet drops
iperf3 -c vip -u -b 10G 吞吐基线 网卡队列均衡
常见排障步骤:
- 高丢包:查看 ethtool -S eth0 | grep -i drop,若 rx_no_buffer 持续攀升,扩大 ring。
- IPS 高延迟:确认 suricata -T 时 CPU 固定 100 %,开启 detect-grouping。
- VIP 漂移抖动:检查 Keepalived 日志,排除脚本超时。
6. 最佳实践经验
- 最小信任面:默认拒绝,一条条放通;动态黑名单自动老化。
- fail-open 机制:保证极端情况下业务不中断 > 99.95 %。
- 配置即代码:git tag + CI 测试规则语法,确保变更可追溯。
- 多维度监控:联动 Suricata / nftables / 系统指标形成统一告警链。
- 定期压测:每月演练 SYN Flood 与 OWASP Top10,及时校准规则。
- 硬件配合:选择支持 XDP / DPDK 的 25 GbE 网卡,在香港机房低延迟链路下效果显著。
我通过以上步骤,把当初那段被攻击的被动心态转变为 可观察、可度量、可恢复 的安全闭环。如今即使面对 2 Tbps 以上流量的突发拉抬,业务依旧平稳运行。希望这套实战方案能为你的香港节点提供同级别的防护与连续性保障。











