流量分析基础回顾:OSI模型与TCP/IP协议栈

说实话,每次带新人入门流量分析,我都要先问一个问题:你清楚数据从你的浏览器到服务器,中间经历了什么吗? 很多人上来就抓包,看到一堆乱码就懵了。其实,搞懂OSI模型和TCP/IP协议栈,就像拿到了地图——你才知道自己站在哪一层。

OSI七层模型 vs TCP/IP四层模型

OSI模型是个理想化的参考框架,一共七层。但实际互联网用的是TCP/IP模型,它把七层压缩成了四层。我个人的习惯是,把OSI当作「理论课本」,把TCP/IP当作「实战手册」。

OSI七层 TCP/IP四层 典型协议 我关注的点
应用层 应用层 HTTP, DNS, TLS 这里最容易出异常,比如恶意请求
表示层 SSL/TLS加密 加密流量分析,嗯,这里是个难点
会话层 NetBIOS, RPC 会话劫持经常发生在这层
传输层 传输层 TCP, UDP 端口扫描、SYN洪水,都在这层
网络层 网络层 IP, ICMP IP欺骗、路由攻击,我踩过坑
数据链路层 网络接口层 Ethernet, ARP ARP欺骗,局域网里的老把戏
物理层 网线、信号 物理层出问题,抓包都抓不到
我的小技巧: 分析异常流量时,我习惯从下往上排查。先看物理层有没有丢包,再看网络层有没有异常路由。别一上来就盯着应用层,那样容易漏掉根本问题。

数据包封装与解封装过程

你想想看,你在浏览器里点了一下「发送」,数据是怎么变成一堆0101的?这个过程就是封装。反过来,服务器收到数据后,一层层剥开,就是解封装。

封装过程(发送端):

  1. 应用层: 原始数据,比如HTTP请求的JSON体。
  2. 传输层: 加上TCP头部(源端口、目的端口、序列号)。
  3. 网络层: 加上IP头部(源IP、目的IP)。
  4. 数据链路层: 加上以太网头部(源MAC、目的MAC),尾部还有FCS校验。
  5. 物理层: 变成比特流,通过网线发出去。

解封装过程(接收端): 反过来,从物理层开始,一层层剥掉头部,直到拿到原始数据。

我曾经踩过的坑: 有一次分析一个慢速攻击,抓包发现TCP重传率特别高。我盯着应用层看了半天,没发现问题。后来才发现是数据链路层的MTU设置不对,导致IP分片过多。所以,封装和解封装的每一层,都可能是瓶颈。

常见网络协议流量特征

做流量分析,你得认识几个「老朋友」。它们的流量特征,就像人的指纹一样,各有不同。

HTTP流量特征

  • 明文传输: 所有请求和响应都是明文,包括URL、Cookie、表单数据。
  • 请求方法: GET、POST、PUT、DELETE等。异常流量里,POST和GET最常见。
  • 状态码: 200(正常)、404(未找到)、500(服务器错误)。如果突然出现大量404,可能是扫描行为。
  • 头部信息: User-Agent、Referer、Cookie。我见过很多爬虫伪造User-Agent,但Referer往往露馅。
实战案例: 有一次客户说网站被攻击,我抓包一看,全是POST请求,但Body里都是空数据。而且User-Agent全是「python-requests」。嗯,这明显是自动化脚本在搞事。

DNS流量特征

  • 基于UDP(通常): 端口53。查询和响应都很短小。
  • 递归查询 vs 迭代查询: 客户端一般发递归查询,DNS服务器之间用迭代查询。
  • 异常特征: 大量相同域名的查询(可能是DNS劫持)、超长域名(可能是DNS隧道)。
避坑指南: 我曾经遇到一个案例,内网一台机器不断向外部DNS服务器查询一个奇怪的域名「abc123.xyz.com」。流量很小,但频率极高。后来发现是恶意软件在用DNS隧道传输数据。所以,别小看DNS流量。

TLS流量特征

  • 加密传输: 握手阶段是明文,之后所有数据加密。
  • 握手过程: Client Hello → Server Hello → 证书交换 → 密钥协商 → 加密通信。
  • 异常特征: 证书过期、自签名证书、TLS版本过低(如TLS 1.0)、密码套件异常。

说白了,TLS流量分析的核心就是看握手阶段。一旦握手完成,你就只能看到一堆乱码了。但别慌,我们可以通过流量大小、连接时长等元数据来推断。

Wireshark基础操作与过滤语法

Wireshark是流量分析的神器。我刚开始用的时候,也被满屏的包吓到过。但掌握几个过滤语法,你就能快速定位问题。

基础操作

  1. 选择网卡: 启动时选对网卡,别抓到回环接口去了。
  2. 开始/停止抓包: 快捷键 Ctrl+E 开始,Ctrl+E 停止。
  3. 保存抓包文件: 保存为 .pcapng 格式,方便后续分析。
  4. 着色规则: 默认就有,比如TCP SYN包是红色,RST包是黑色。你可以自定义。

常用过滤语法

过滤语法分两种:抓包过滤器(抓之前用)和显示过滤器(抓之后用)。我建议用显示过滤器,更灵活。

# 显示过滤器示例
# 只看HTTP流量
http

# 只看特定IP
ip.addr == 192.168.1.1

# 只看TCP端口80
tcp.port == 80

# 只看DNS查询
dns.qry.name contains "example.com"

# 只看TLS握手
tls.handshake.type == 1  # 1 是 Client Hello

# 组合过滤
http and ip.src == 10.0.0.1
我的常用组合: 分析异常流量时,我经常用 http.request or tls.handshake.type == 1 来快速定位「谁在发起连接」。然后再用 tcp.analysis.flags 看有没有重传或丢包。

追踪流功能

Wireshark有个很实用的功能叫「Follow TCP Stream」。选中一个TCP包,右键 → Follow → TCP Stream。它会帮你把整个会话的原始数据拼出来。对于HTTP明文流量,你甚至能看到完整的请求和响应。

注意: 对于TLS加密流量,Follow TCP Stream只能看到加密后的乱码。这时候你需要配合SSLKEYLOGFILE环境变量,或者用中间人代理来解密。嗯,这个我们后面章节会细讲。

好了,基础回顾就到这里。这些内容看似简单,但却是后续所有高阶技巧的基石。你想想看,如果连数据包怎么封装、HTTP和DNS长什么样都搞不清,那分析异常流量就像盲人摸象。我个人建议,把Wireshark的过滤语法练熟,最好能闭着眼睛写出常用的几条。这样在实战中,你才能快速从海量流量里揪出那个「害群之马」。