2. 攻击溯源数据源采集:NetFlow/sFlow流量采集原理与部署,BGP-LS/TE数据采集,Syslog与SNMP Trap日志收集,PCAP全包捕获策略
做溯源分析,最怕什么?最怕数据不够。你想想看,攻击者都跑路了,你手里只有半截日志,那真是欲哭无泪。所以这一章,我重点聊聊数据源采集这件事。说白了,就是我们要在攻击发生之前,先把“摄像头”和“录音笔”都架好。
我个人习惯把数据源分成四类:流量元数据、路由状态数据、设备日志数据、全包证据数据。下面一个一个说。
2.1 NetFlow/sFlow:流量元数据采集
先讲NetFlow。这东西是思科搞出来的,后来成了事实标准。它的核心思想很简单:不抓包内容,只记录“谁在什么时候和谁通信,用了什么端口,发了多少字节”。
我遇到过一起DDoS溯源,攻击流量高达40Gbps,全包抓取根本不现实。但NetFlow帮了大忙——通过分析流记录,我很快锁定了源IP的分布规律,发现80%的流量来自三个C段。这就是元数据的价值。
- v5:固定格式,字段少,不支持IPv6。老设备还在用,但我不建议新部署选它。
- v9:模板化设计,灵活多了。支持IPv6、MPLS、BGP下一跳等。我现在大部分项目都用v9。
- IPFIX:NetFlow v10,标准化版本。如果你要跨厂商互通,选它准没错。
sFlow呢?它是采样技术。NetFlow是“记录每一条流”,sFlow是“随机抓几个包看看”。采样率我一般设1:1024,流量大时甚至1:4096。精度会下降,但CPU开销小很多。
部署时有个坑:NetFlow的缓存超时时间。默认15分钟?太长了。攻击流可能几秒就结束了。我建议把active timeout设为60秒,inactive timeout设为15秒。这样能捕捉到短连接攻击。
# 思科设备NetFlow配置示例(v9版本)
ip flow-export version 9
ip flow-export destination 192.168.1.100 2055
ip flow-export source Loopback0
ip flow-cache timeout active 1
ip flow-cache timeout inactive 15
!
interface GigabitEthernet0/1
ip flow ingress
ip flow egress
2.2 BGP-LS/TE:路由拓扑数据采集
溯源时,光知道流量从哪来还不够。你还得知道它经过了哪些路径。这就是BGP-LS(链路状态)和BGP-TE(流量工程)的用武之地。
BGP-LS说白了,就是把IGP(OSPF/IS-IS)的拓扑信息通过BGP广播出来。这样你可以在一个中心点看到整个网络的拓扑结构。我曾在一次跨国攻击溯源中,通过BGP-LS发现攻击流量绕过了三个AS,最终在第四个AS被清洗——这个路径信息,没有BGP-LS根本拿不到。
采集BGP-LS数据,我推荐用GoBGP或ExaBGP。GoBGP性能好,ExaBGP灵活。下面是我常用的ExaBGP配置:
# ExaBGP配置示例(采集BGP-LS)
process bgp-ls-collector {
run /usr/bin/python3 /opt/exabgp/collector.py;
encoder json;
}
neighbor 10.0.0.1 {
router-id 10.0.0.2;
local-address 10.0.0.2;
local-as 65001;
peer-as 65000;
family {
l3vpn ipv4 unicast;
l3vpn ipv6 unicast;
ls;
flowspec ipv4;
}
capability {
dynamic;
}
}
BGP-TE呢?它关注的是流量工程路径。比如RSVP-TE隧道、SR-TE策略。这些信息能告诉你:为什么流量走了这条路径而不是那条。溯源时,这能帮你判断是不是有人恶意篡改了路径策略。
2.3 Syslog与SNMP Trap:设备日志收集
日志这东西,平时没人看,出事时恨不得把每一行都翻出来。Syslog和SNMP Trap就是两个最基础的日志通道。
Syslog:我建议用rsyslog或syslog-ng。别再用老旧的syslogd了,它不支持TCP、不支持TLS、不支持结构化日志。rsyslog可以做到:
- 每秒处理百万级日志
- 支持模板化输出(JSON格式最好)
- 支持TLS加密传输
- 支持过滤和路由(比如把BGP日志单独存一个文件)
# rsyslog配置示例(接收并分类存储)
module(load="imudp")
module(load="imtcp")
# 接收UDP和TCP日志
input(type="imudp" port="514")
input(type="imtcp" port="514")
# 按设备类型分类
if $fromhost-ip startswith "192.168.1." then {
action(type="omfile" file="/var/log/network/core.log")
stop
}
# BGP日志单独存放
if $msg contains "BGP" then {
action(type="omfile" file="/var/log/network/bgp.log")
stop
}
# 默认存储
*.* /var/log/network/all.log
SNMP Trap:它和Syslog不同。Syslog是设备主动“说”,SNMP Trap是设备主动“喊”。比如接口Down、CPU过载、BGP邻居断开,这些事件会通过Trap立刻通知你。
我曾经遇到一个案例:攻击者通过SNMP暴力破解,试图获取设备配置。幸好我部署了SNMP Trap监控,第一时间收到了认证失败的告警,及时封堵了源IP。嗯,这里要注意:SNMP v2c的社区字符串是明文传输的,一定要用v3。
2.4 PCAP全包捕获策略
最后说全包捕获。这是最“笨”的方法,也是最可靠的方法。全包意味着你保留了攻击的完整证据——从SYN包到RST包,一个不落。
但全包捕获有个大问题:存储。1Gbps的链路,一天下来就是10TB左右。所以必须要有策略:
| 策略 | 适用场景 | 存储需求 | 我的建议 |
|---|---|---|---|
| 全量捕获 | 合规要求、高安全等级 | 极高(10TB+/天) | 仅保留7天,循环覆盖 |
| 采样捕获 | 日常监控、流量分析 | 中等(1TB/天) | 采样率1:100,保留30天 |
| 触发式捕获 | 攻击响应、取证 | 低(按需) | 配合IDS/IPS告警触发 |
| 元数据+全包混合 | 溯源分析最佳实践 | 可控 | NetFlow记录元数据,全包只抓可疑流量 |
工具方面,我推荐tcpdump + Wireshark组合。tcpdump负责抓,Wireshark负责分析。但生产环境我更喜欢用Moloch(现在叫Arkime)。它支持分布式部署,能索引PCAP文件,支持全文搜索。你可以在几秒内找到某个IP在某个时间段的全部流量。
# tcpdump全包捕获示例(环形缓冲区)
# 每个文件1GB,保留10个文件,自动覆盖
tcpdump -i eth0 -s 0 -C 1000 -W 10 -w /data/pcap/traffic.pcap
# 配合BPF过滤,只抓特定流量
tcpdump -i eth0 -s 0 -C 1000 -W 10 \
-w /data/pcap/suspicious.pcap \
"host 10.0.0.1 or port 443 or port 22"
好了,数据源采集这部分就聊到这。四种方法各有优劣,实际项目中我通常是组合使用。NetFlow做宏观分析,BGP-LS看路径,Syslog/Trap盯事件,PCAP留证据。四者配合,溯源时才能游刃有余。
- NetFlow/sFlow:轻量级,适合长期存储和趋势分析
- BGP-LS/TE:路由级数据,适合路径溯源和拓扑分析
- Syslog/SNMP Trap:事件驱动,适合实时告警和事后审计
- PCAP全包:重量级,适合深度取证和攻击还原