3. 流量采集与工具:tcpdump使用技巧、Wireshark基础、流量数据预处理
做异常流量分析,第一步不是上模型,也不是写规则。
第一步是——你得先拿到流量。
我见过太多人,算法调得飞起,结果发现采集的数据本身就有问题。那感觉,就像你花三天炖了一锅汤,最后发现锅底有个洞。所以,这一章咱们把基本功打扎实。我会从最底层的 tcpdump 讲起,再到 Wireshark 的图形化分析,最后聊聊怎么把原始流量变成算法能吃的“干净数据”。
3.1 tcpdump:命令行下的流量“手术刀”
tcpdump 这玩意儿,说白了就是 Linux 系统里抓包的瑞士军刀。它轻量、高效,没有图形界面,但功能一点不含糊。
我个人习惯,排查线上问题第一反应就是 ssh 上去,一个 tcpdump 命令甩下去。为什么?因为它快,而且不挑环境。
3.1.1 基础用法:先跑起来再说
最简单的用法,抓取所有经过 eth0 网卡的包:
tcpdump -i eth0
但这样会刷屏,你基本什么都看不清。我建议你加上 -c 参数,指定抓取数量:
tcpdump -i eth0 -c 100
这表示只抓 100 个包,然后自动停止。嗯,调试的时候特别好用。
3.1.2 过滤表达式:精准打击
真正的技巧在于过滤。你想想看,生产环境一秒几万甚至几十万个包,你不加过滤,那跟拿渔网捞沙子没区别。
常用的过滤套路:
- 按 IP 过滤:只看某个 IP 的流量
tcpdump -i eth0 host 192.168.1.100
- 按端口过滤:只看 HTTP 或 DNS
tcpdump -i eth0 port 80
tcpdump -i eth0 port 53
- 按协议过滤:只看 TCP 或 UDP
tcpdump -i eth0 tcp
tcpdump -i eth0 udp
tcpdump -i eth0 src host 10.0.0.5 and port 80。逻辑运算符 and、or、not 都可以用。
3.1.3 保存与读取:把现场“冻结”起来
线上抓包,一般不会当场分析。我会用 -w 参数把流量保存成 pcap 文件,回头慢慢看:
tcpdump -i eth0 -w capture.pcap
读取的时候用 -r:
tcpdump -r capture.pcap
-c 限制,结果磁盘写满了,服务直接挂了。血的教训——一定要预估流量大小,或者用 -C 参数限制单个文件大小(比如 -C 100 表示每个文件 100MB 自动轮转)。
3.2 Wireshark:图形化的流量“显微镜”
tcpdump 适合快速采集和简单过滤,但要做深度分析,Wireshark 才是王道。它把二进制包解析成人类能看懂的结构,还能做各种统计。
我刚开始学的时候,打开 Wireshark 看到满屏的包,脑子是懵的。后来发现,其实只要掌握几个核心功能就够了。
3.2.1 界面三要素
Wireshark 的界面分三块:
- 包列表区:显示每个包的概要信息(时间、源IP、目的IP、协议、长度等)
- 包详情区:选中某个包后,这里会分层展示协议头(以太网帧 → IP头 → TCP/UDP头 → 应用层数据)
- 包字节区:最原始的十六进制和 ASCII 码,一般用不到,但排查诡异问题时很有用
3.2.2 显示过滤器:比 tcpdump 更强大
Wireshark 的过滤语法更直观。比如:
ip.addr == 192.168.1.1:只看这个 IP 的流量tcp.port == 443:只看 HTTPShttp.request:只看 HTTP 请求dns.qry.name contains "baidu":只看包含 baidu 的 DNS 查询
重点来了:Wireshark 的过滤器支持“表达式”输入。你可以在过滤栏输入 tcp.analysis.flags,它会自动高亮所有有问题的 TCP 包(比如重传、丢包、窗口满等)。做异常流量分析时,这个功能能帮你快速定位网络层面的问题。
3.2.3 追踪流:还原一次完整的对话
我最常用的功能是“Follow TCP Stream”。右键点击一个 TCP 包 → Follow → TCP Stream。Wireshark 会把这次 TCP 连接中的所有数据拼接起来,还原成原始的请求和响应。
举个例子,你怀疑有人在搞 HTTP 慢速攻击,追踪流一看,发现客户端发完请求头后,故意慢慢发请求体,一秒才发一个字节。嗯,实锤了。
3.3 流量数据预处理:从“脏数据”到“干净特征”
拿到 pcap 文件后,不能直接扔给算法。为什么?因为原始流量包包含大量冗余信息,比如 TCP 重传、ACK 包、链路层填充等。这些对异常检测来说,基本是噪音。
我一般会做三步预处理:
3.3.1 第一步:会话切分
把原始流量按“五元组”(源IP、目的IP、源端口、目的端口、协议)切分成一个个会话。一个会话就是一次完整的通信过程,比如一次 HTTP 请求从 TCP 三次握手到四次挥手。
常用的工具有 splitcap 或者自己写脚本。我个人习惯用 Python 的 scapy 库:
from scapy.all import *
packets = rdpcap('capture.pcap')
sessions = packets.sessions()
for session_name, session_packets in sessions.items():
print(f"会话: {session_name}, 包数量: {len(session_packets)}")
3.3.2 第二步:特征提取
每个会话提取出有意义的特征。常见的特征包括:
| 特征类别 | 具体特征 | 说明 |
|---|---|---|
| 基础统计 | 包总数、字节总数、持续时间 | 会话的基本规模 |
| 包大小分布 | 平均包长、最大包长、最小包长、标准差 | 异常流量往往包大小异常(比如 DDoS 攻击的固定小包) |
| 时间特征 | 包到达间隔的均值、方差 | 扫描攻击的包间隔通常很均匀 |
| 协议特征 | SYN/FIN/RST 标志位比例 | 端口扫描的 SYN 包比例极高 |
3.3.3 第三步:数据清洗与标准化
这一步很枯燥,但必须做。主要包括:
- 去重:同一个包被重复抓取的情况偶尔会发生
- 处理缺失值:比如某些会话没有应用层数据,特征值就是 NaN
- 标准化:把不同量纲的特征映射到同一范围(比如 0-1 或 Z-score),否则算法会偏向数值大的特征
举个例子,包长度可能是 1500 字节,而 SYN 标志位只有 0 或 1。如果不标准化,算法会认为包长度更重要,但实际上 SYN 标志位可能才是区分攻击的关键。
好了,流量采集和预处理这块,核心就是这些。工具只是手段,关键是你要理解:你采集的是什么数据?它包含了哪些信息?哪些信息对异常检测是有用的?
下一章,我们会把这些预处理好的数据,真正喂给算法模型。到时候你会发现,前面这些“脏活累活”,其实决定了模型效果的上限。