2. NetFlow与IPFIX协议基础
NetFlow 与 IPFIX 都属于“流级遥测”协议:它们不记录每一个报文的完整载荷,而是把具有相同五元组(或更丰富字段)的报文聚合成一条“流记录”,在流结束、定时器到期或缓存压力触发时,把统计结果导出给收集器。理解这套机制的关键,是分清四个层次:流(Flow)定义“什么被聚合”,模板(Template)定义“字段如何编码”,数据集(Data Set)承载“实际记录”,导出与收集架构决定“数据从哪里来、到哪里去”。威胁分析的所有能力——DDoS 检测、扫描识别、横向移动发现、外联行为画像——都建立在这四层之上。
一、流:聚合的粒度决定可见性
一条流由一组“流键”唯一标识。传统 NetFlow v5 使用固定七元组:源 IP、目的 IP、源端口、目的端口、协议号、TOS、入接口。NetFlow v9 与 IPFIX 则把流键交给模板定义,可以扩展到 VLAN、MAC、AS 号、BGP 下一跳、MPLS 标签、TCP 标志位等。聚合粒度越粗,导出量越小,但细节丢失越多;粒度越细,越能支撑威胁分析,但设备 CPU、缓存和带宽开销上升。
流记录中除流键外,还包含计数类字段:报文数、字节数、流起止时间、TCP 标志累计值、下一跳、输出接口等。威胁分析最常用的三个量是:字节数/报文数比值(判断放大攻击、数据外泄)、流持续时间(区分长连接 C2 与短促扫描)、包速率(识别 flood)。例如一条持续 3600 秒、仅 12 个报文、平均包长 1400 字节的流,很可能是心跳式 C2 或慢速数据渗出,而非正常交互。
二、模板与数据集:自描述编码
NetFlow v9 和 IPFIX 采用“模板 + 数据”分离的自描述结构。模板记录(Template Record)声明字段类型(Information Element,IE)及其长度;数据记录(Data Record)只按模板顺序填值,不再重复字段名。IPFIX 的 IE 由 IANA 统一编号,例如 IE 8 是 sourceIPv4Address,IE 12 是 destinationIPv4Address,IE 7 是 sourceTransportPort,IE 152 是 flowStartMilliseconds。NetFlow v9 的字段编号与 IPFIX 大体兼容,但存在厂商私有扩展。
模板有生命周期:收集器首次收到某模板 ID 的数据前,必须先收到对应模板;模板可被重新定义(同一 ID 换新模板),此时旧模板失效。若收集器重启或模板过期(IPFIX 默认模板超时通常为 600 秒,可配置),必须重新学习模板,否则数据无法解码。这正是“收集器收到数据却解析为空”的最常见原因。
三、导出与收集架构:从设备到分析平台
典型链路是:路由器/交换机/防火墙作为 Exporter,把流缓存中的记录封装成 UDP 报文发往 Collector。NetFlow v5 固定使用 UDP 2055;NetFlow v9 与 IPFIX 目的端口可配置,常见 2055、9995、4739(IPFIX 注册端口)。IPFIX 还允许 SCTP 和 TCP 传输,在丢包敏感场景下更可靠,但多数生产环境仍以 UDP 为主,靠 Collector 侧容忍少量丢失。
Collector 收到报文后,先按“源 IP + 观测域 ID(Observation Domain ID)”区分不同 Exporter,再查模板缓存解码。这里有一个工程要点:模板和数据可能分属不同报文。Exporter 通常周期性重发模板(例如每 20 个数据包或每 60 秒一次),Collector 必须缓存模板并在超时前持续使用。若 Collector 重启,模板缓存清空,此时到达的数据集会因“无模板”被丢弃,直到下一个模板到达。因此生产环境常把模板超时设得比 Exporter 重发周期更长,并监控“模板未命中”计数。
采样是另一个必须显式处理的环节。当 Exporter 开启 1:1000 采样时,导出的字节数和报文数都是采样后的值,Collector 或分析层必须乘以采样倍率才能还原真实流量。若忽略采样倍率,DDoS 速率会被严重低估,阈值告警随之失效。判断方法:在流记录中检查采样率字段(NetFlow v9 的 SAMPLING_INTERVAL,IPFIX 的 samplingPacketInterval),或在 Collector 配置中按 Exporter 单独设置倍率。
四、威胁分析场景下的差异与选型
从威胁分析角度看,NetFlow v5 字段固定、无模板,解析简单但只能看七元组,适合做基础 Top Talkers 和粗粒度 DDoS 检测。NetFlow v9 引入模板,可携带 TCP 标志、入出接口、AS 号,足以支撑端口扫描识别和部分横向移动分析。IPFIX 在 v9 基础上进一步标准化:字段编号与 IANA 对齐、支持可变长度字符串(如 URL、用户名)、支持企业私有 IE、支持 TCP/SCTP 可靠传输,更适合多厂商混合环境和需要扩展字段的高级分析。
选型建议可以归纳为三条:第一,看设备能力——若网络中存在多家厂商设备,优先统一到 IPFIX,避免私有字段各自为政;第二,看分析深度——只需五元组统计用 NetFlow v5 即可,需要 TCP 标志、接口、AS、采样率等字段则至少 v9,需要应用层扩展字段则选 IPFIX;第三,看传输可靠性——UDP 导出在拥塞时丢包,若分析对完整性要求高(如计费、合规审计),应选 IPFIX over TCP/SCTP,或至少开启多条 Collector 冗余接收。
tcpdump -i eth0 -n udp port 2055 -c 20 抓取原始导出报文,确认能看到模板集(Set ID=0 或 2)和数据集(Set ID≥256)。若只看到数据集、没有模板,说明模板在抓包前已发送,需要延长抓包时间或让 Exporter 立即重发模板。总结来说,流定义聚合粒度,模板定义编码契约,数据集承载实际观测,导出与收集架构决定数据能否完整、准确地到达分析层。威胁分析的效果不取决于协议版本高低,而取决于字段是否覆盖了你要检测的行为、采样倍率是否被正确还原、模板是否始终命中。把这四点对齐,NetFlow 与 IPFIX 才能真正成为可用的威胁流量分析数据源。