之前文章介绍过 wireshark 抓包工具的 捕获过滤器 和 显示过滤器,而 捕获过滤器 使用的 BPF 过滤语法可以在 tcpdump 中使用,tcpdump 可以在 Linux 服务端使用,熟悉和了解 tcpdump 抓包工具的使用,可以帮助分析服务端数据报文的情况。
1.TCP 协议特点
- TCP连接是面向连接的(一对一)、可靠的(不管网络发生什么变化)、基于字节流的(消息没有边界,有序的)传输层通信协议,是根据 IP 地址穿越网络传送数据
- 点对点(不能广播、多播),面向连接
- 双向传递(全双工)
- 字节流:打包成报文段、保证有序接收、重复报文自动丢弃
- 优点:不强制要求应用必须离散的创建数据块,不限制数据块大小
- 缺点:不维护应用报文的边界(对比HTTP、GRPC)
- 流量缓冲:解决速度不匹配问题
- 可靠的传输服务(保证可达,丢包时通过重发进而增加时延实现可靠性)
- 拥塞控制
2.消息传输的核心要素
- IP地址
- TCP(UDP) 端口
- HTTP Host/URI 等
- IP 序列号
- TCP 序列号
3.IP 头部
4.UDP 头部
Tips:Destination Port 表示目的端口,Source Port 表示消息来源端口(回送消息也是依据此端口),Checksum 表示防止错误的校验码。
5.TCP 协议的任务
- 主机内的进程寻址
- 创建、管理、终止连接
- 处理并将字节(8 bit)流打包成报文段(如 IP报文)
- 传输数据
- 保持可靠性与传输质量
- 流量控制与拥塞控制
6.如何标识一个 TCP 连接
- TCP 四元组(源地址、源端口、目的地址、目的端口)
- 对于 IPv4 地址,单主机最大 TCP 连接数 2^(32+16+32+16)
- QUIC 协议是基于连接 ID 的。
7.TCP Segment 报文段
Tips:Destination Port 表示目的端口,Source Port 表示消息来源端口(回送消息也是依据此端口),Sequence Number 和 Acknowledgment Number 用来唯一标识一个 TCP 连接,Acknowledgment Number 还用来确认报文,保证消息的可达性,TCP 常规报文段是 20 字节。
8.TCP Segment 报文段抓包
9.TCP 常用可选项
从前面的 TCP Segment 报文段图中可以看出 TCP OPTIONS 是可选项,可选项如下表:
类型 | 总长度(字节) | 数据 | 描述 |
0 | - | - | 选项列表末尾标识 |
1 | - | - | 无意义,用于32对其使用 |
2 | 4 | MSS 值 | 握手时发送端告知可以接收的最大报文大小 |
3 | 3 | 窗口移位 | 指明最大窗口扩展后的大小 |
4 | 2 | - | 表明支持 SACK 选择性确认中间报文段功能 |
5 | 可变 | 确认报文段 | 选择性确认窗口中间的 Segments 报文段 |
8 | 10 | Timestamps | 用于更精确的计算 RT,及解决 PAWS 问题 |
14 | 3 | 校验和算法 | 双方认可后,可使用新的校验和算法 |
15 | 可变 | 校验和 | 当16位标准校验和放不下时,放置在这里 |
34 | 可变 | FOC | TFO(TCP first open) 中 Cookie |
关于 TCP OPTIONS 抓包如下图所示:
10.tcpdump 使用方法
- 捕获选项
- -D 列举所有网卡设备
- -i 选择网卡设备
- -c 抓取多少条报文
- --time-stamp-precision 指定捕获时的时间精度,默认毫秒 micro,可选纳秒 nano
- -s 指定每条报文的最大字节数,默认 262144 字节。
10.1 查看网卡设备
tcpdump -D
10.2 选择网卡设备抓取
tcpdump -i ens160
10.3 指定抓取报文条数
tcpdump -i ens160 -c 20
10.4 抓取环回地址报文
tcpdump -i lo
10.5 指定抓取报最大文字节数
tcpdump -s 1024
10.6 抓取纳秒精度的报文
tcpdump --time-stamp-precision nano
11.捕获过滤器(BPF)语法介绍
Berkeley Packet Filter,在设备驱动级别提供抓包过滤接口,多数抓包工具都支持此语法(tcpdump),expression 表达式由多个原语组成:
11.1 primitives 原语过滤
primitives 原语由名称或数字,以及描述它的多个限定词组成,qualifiers 限定词:
- Type:设置数字或者名称所指的类型,例如host www.baidu.com
- (1)host、port
- (2)net,设定子网,如 net 192.168.0.0 mask 255.255.255.0 等价于 net 192.168.0.0/24
- (3)portrange,设置端口范围,例如 portrange 6000-8000
- Dir:设置网络出入方向,例如 dst port 80
- (1)src、dst、src、src or dst、src and dst(src 表示源,dst 表示目标)
- (2)ra、ta、addr1、addr2、addr3、addr4、(仅对 IEEE 802.11 Wireless LAN有效)
- Proto:指定协议类型,例如 udp
- ether、fddi、tr、wlan、ip、ip6、arp、rarp、decnet、tcp、udp、icmp、igmp、icmp、igrp、pim、ah、esp、vrrp
- 其他
- (1)geteway:指明网关 IP 地址,等价于 ether host $ehost and not host $host
- (2)broadcast:广播报文,例如ether broadcast 或者 ip broadcast
- (3)multicast:多播报文,例如 ip multicast 或者 ip6 multicast
- (4)less,greater小于或者大于。
11.2 原语运算符
原语运算符如:src or dst portrange 6000-8000 && tcp or ip6
- 与:&& 或者 and
- 或:|| 或者 or
- 非:! 或者 not
11.3 基于协议域过滤
- 捕获所有 TCP 中的 RST 报文
- TCP[13]&4==4
- 抓取 HTTP GET 报文
- port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420,注意 47455420 是 ASCII 码的 16 进制,表示 'GET',TCP 报文头可能不只 20 字节,data offset 提示了承载数据的偏移,但它以 4 字节为单位
12.tcpdump 文件操作
- -w 输出结果至文件
- -C 限制输入文件的大小,超出后以后缀加 1 等数字形式递增(注意单位是 1000000 字节)
- -W 指定输出文件的最大数量,到达后会重新覆盖写第 1 个文件
- -G 指定每隔 N 秒就重新输出至新文件,注意 w 参数应基于 strftime 参数指定文件名
- -r 读取一个抓包文件
- -V 将待读取的多个文件名写入一个文件中,通过读取该文件同时读取多个文件
12.1 抓取报文至文件
tcpdump -C 1 -W 3 -w a
12.2 读取一个抓包文件
tcpdump -r a0
13.tcpdump 输出时间戳格式
- -t 不显示时间戳
- -tt 自 1970 年 1 月 1 日 0 点至今的秒数
- -ttt 显示邻近两行报文间经过的秒数
- -tttt 带日期的完整时间
- -ttttt 自第一个抓取的报文起经历的秒数
14.tcpdump 分析信息详情
- -e 显示数据链路层头部
- -q 不显示传输层信息
- -v 显示网络层头部更多信息,如 TTL、id 等
- -n 显示 IP 地址、数字端口代替 hostname 等
- -S TCP 信息以绝对序列号替代相对序列号
- -A 以 ASCII 方式显示报文内容,适用于 HTTP 分析
- -x 以 16 进制方式显示报文内容,不显示数据链路层
- -xx 以 16 进制方式显示报文内容,显示数据链路层
- -X 同时以 16 进制及 ACII 方式显示报文内容,不显示数据链路层
- -XX 同时以 16 进制及 ACII 方式显示报文内容,显示数据链路层