2. 网络流量基础:TCP/IP协议栈回顾、数据包结构与采集方法
做网络行为基线,说白了就是先搞清楚“正常长什么样”。
你连正常流量都不认识,怎么抓异常?
这一章,我们就把基础打牢。我会从TCP/IP协议栈开始,一路讲到数据包长什么样,最后聊聊NetFlow和sFlow这两种主流采集方法。嗯,都是后面建模的“原材料”。
2.1 TCP/IP协议栈回顾
很多人觉得协议栈是八股文,但做流量分析时,每一层都对应着不同的特征。
我个人习惯把TCP/IP模型看成四层:
| 层级 | 核心协议/单元 | 我在基线建模中关注什么 |
|---|---|---|
| 应用层 | HTTP, DNS, SSH, TLS | 协议类型、请求频率、payload大小分布 |
| 传输层 | TCP, UDP | 端口号、连接状态、重传率、窗口大小 |
| 网络层 | IP, ICMP | 源/目的IP、TTL、协议号、分片标志 |
| 网络接口层 | 以太网, MAC | MAC地址、帧大小(MTU相关) |
你想想看,一个DDoS攻击,可能在网络层表现为海量小包,在传输层表现为SYN洪泛,在应用层表现为慢速HTTP攻击。只看一层,很容易漏掉。
我的经验: 做基线时,我建议至少提取传输层和网络层的特征。应用层特征虽然丰富,但加密流量越来越多,解析成本高。我曾经在一个项目中只依赖应用层特征,结果TLS流量一上来,基线直接崩了。
2.2 网络流量数据包结构
数据包是流量的最小单位。你得知道它里面装了什么。
一个标准的以太网数据包,结构大致如下:
+------------------+------------------+------------------+------------------+
| Ethernet Header | IP Header | TCP/UDP Header | Payload |
| (14 bytes) | (20 bytes) | (20/8 bytes) | (可变长度) |
+------------------+------------------+------------------+------------------+
| MAC地址 | 源/目的IP | 端口号/序列号 | 应用数据 |
+------------------+------------------+------------------+------------------+
这里有几个关键字段,我每次做特征工程都会盯着看:
- IP头中的TTL:不同操作系统默认值不同(Windows 128,Linux 64)。如果同一个源IP的TTL突然变了,大概率是伪造IP或经过了隧道。
- TCP标志位:SYN、ACK、RST、FIN的组合,能直接反映连接状态。我曾经靠分析RST包的比例,发现了一个内网扫描器。
- 包长度:正常交互的包长分布是有规律的。比如SSH的交互包通常很小,而视频流则有大包。如果小包比例异常升高,可能是扫描或心跳。
避坑指南: 不要只看包头的固定字段。我曾经忽略IP头的“标识符”字段,结果漏掉了一个IP分片攻击。分片攻击的标识符往往呈现规律性递增,而正常流量是随机的。
2.3 流量采集方法:NetFlow vs sFlow
全量抓包(pcap)虽然信息最全,但存储和计算成本太高。对于基线建模,我们通常用流级别的数据。
NetFlow和sFlow是两种主流方案。我简单对比一下:
| 特性 | NetFlow (v5/v9) | sFlow |
|---|---|---|
| 采集方式 | 基于流缓存,聚合后导出 | 基于数据包采样,实时发送 |
| 数据粒度 | 流级别(五元组+统计) | 包级别(采样后的包头部) |
| 资源消耗 | 较高(需要维护流表) | 较低(采样+无状态) |
| 典型场景 | 流量计费、安全分析 | 实时监控、大流量环境 |
| 我的选择 | 基线建模首选 | 实时告警辅助 |
为什么我推荐NetFlow做基线?因为它能提供完整的流记录,包括包数、字节数、持续时间。这些统计量对建立“正常行为轮廓”非常关键。
sFlow的优势在于轻量。我曾经在10Gbps链路上部署sFlow,采样率设为1:1000,CPU占用不到5%。但代价是精度下降,小流容易被漏掉。
核心观点: 基线建模用NetFlow,异常检测用sFlow做补充。两者结合,既保精度又保性能。
2.4 知识体系总览
下面这张图,是我对本章知识点的梳理。你可以把它当作一个“地图”。
2.5 实战建议:如何选择采集方案
如果你刚开始做流量基线,我建议按这个步骤来:
- 先搞清楚网络规模:小于1Gbps的链路,全量pcap都行;大于10Gbps,必须上采样。
- 确定特征需求:如果只需要五元组+流量大小,NetFlow v5就够了。如果需要应用层信息,考虑NetFlow v9或带DPI的增强版。
- 评估存储成本:NetFlow一条记录约50-100字节。1000条/秒,一天大约8-10GB。sFlow因为采样,数据量小一个数量级。
- 别忘了时间戳精度:我踩过坑——NetFlow v5的时间戳精度是毫秒级,但有些老设备只支持秒级。做时序分析时,秒级精度根本不够用。
我的习惯: 在采集层同时开启NetFlow和sFlow。NetFlow数据存入数据库做离线基线训练,sFlow数据走实时流处理做在线检测。两者互不干扰,各取所长。
好了,这一章的内容就到这里。TCP/IP协议栈是骨架,数据包结构是血肉,采集方法是工具。三样东西都拿稳了,后面建基线、做检测,才能心里有底。