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 知识体系总览

下面这张图,是我对本章知识点的梳理。你可以把它当作一个“地图”。

网络流量基础:知识体系总览 网络流量基础:知识体系总览 TCP/IP协议栈 数据包结构 流量采集方法 应用层 传输层 网络层 网络接口层 以太网头 IP头 TCP/UDP头 Payload NetFlow sFlow 💡 核心逻辑: 理解协议栈 → 解析数据包结构 → 选择合适的采集方法 → 为基线建模提供高质量流量特征。 图:本章知识体系总览。三个模块层层递进,最终服务于异常检测。

2.5 实战建议:如何选择采集方案

如果你刚开始做流量基线,我建议按这个步骤来:

  1. 先搞清楚网络规模:小于1Gbps的链路,全量pcap都行;大于10Gbps,必须上采样。
  2. 确定特征需求:如果只需要五元组+流量大小,NetFlow v5就够了。如果需要应用层信息,考虑NetFlow v9或带DPI的增强版。
  3. 评估存储成本:NetFlow一条记录约50-100字节。1000条/秒,一天大约8-10GB。sFlow因为采样,数据量小一个数量级。
  4. 别忘了时间戳精度:我踩过坑——NetFlow v5的时间戳精度是毫秒级,但有些老设备只支持秒级。做时序分析时,秒级精度根本不够用。
我的习惯: 在采集层同时开启NetFlow和sFlow。NetFlow数据存入数据库做离线基线训练,sFlow数据走实时流处理做在线检测。两者互不干扰,各取所长。

好了,这一章的内容就到这里。TCP/IP协议栈是骨架,数据包结构是血肉,采集方法是工具。三样东西都拿稳了,后面建基线、做检测,才能心里有底。