Blog

确定抓包位置(客户端还是服务器)

Content #

利用 IP 的 TTL 属性。显然,无论是哪一端,它的报文在发出时,其 TTL 就是原始值,也就是 64、 128、255 中的某一个。而对端报文的 TTL,因为会经过若干个网络跳数,所以一般都会比 64、128、255 这几个数值要小一些。

所以,我们只要看一下抓包文件中任何一个客户端报文(也就是源端口为高端口)的 TTL,如果它是 64、128 或 255,那说明这个抓包文件就是在客户端做的。反之,就是在服务端做的。

Viewpoints #

From #

02 | 抓包分析技术初探:你会用tcpdump和Wireshark吗?

tcptrace

Content #

tcptrace 是一个挺“古老”的工具了。在 Wireshark 工具集(Wireshark 图形界面和 tshark 等命令行工具)还没一统江湖的时候,tcptrace 也有其独到的价值,因为它不仅可以读取 pcap 格式的抓包文件,也可以读取 snoop 等其他格式的抓包文件。

比如下面这样,tcptrace 告诉我们,这个抓包文件里有 2 个 TCP 连接,并且是以 RST 结束的:

$ tcptrace -b test.pcap
1 arg remaining, starting with 'test.pcap'
Ostermann's tcptrace -- version 6.6.7 -- Thu Nov  4, 2004

145 packets seen, 145 TCP packets traced
elapsed wallclock time: 0:00:00.028527, 5082 pkts/sec analyzed
trace file elapsed time: 0:00:04.534695
TCP connection info:
  1: victorebpf:51952 - 180.101.49.12:443 (a2b)   15>   15<  (complete)  (reset)
  2: victorebpf:56794 - 180.101.49.58:443 (c2d)   56>   59<  (complete)  (reset)

Viewpoints #

From #

02 | 抓包分析技术初探:你会用tcpdump和Wireshark吗?

...

只抓取到传输层头部

Content #

一般来说,帧头是 14 字节,IP 头是 20 字节,TCP 头是 20~40 字节。如果你明确地知道这次抓包的重点是传输层,那么理论上,对于每一个报文,你只要抓取到传输层头部即可,也就是前 14+20+40 字节(即前 74 字节):

tcpdump -s 74 -w file.pcap

而如果是默认抓取 1500 字节,那么生成的抓包文件将是上面这个抓包文件的 20 倍。反过来说,使用同样的磁盘空间,上面这种方式,其抓包时间可以长达默认的 20 倍!

Viewpoints #

From #

02 | 抓包分析技术初探:你会用tcpdump和Wireshark吗?

过滤后转存

Content #

有时候,我们想从抓包文件中过滤出想要的报文,并转存到另一个文件中。比如想从一个抓包文件中找到 TCP RST 报文,并把这些 RST 报文保存到新文件。那么就可以这么做:

tcpdump -r file.pcap 'tcp[tcpflags] & (tcp-rst) != 0' -w rst.pcap

Viewpoints #

From #

02 | 抓包分析技术初探:你会用tcpdump和Wireshark吗?

抓取TLS握手阶段的Client Hello报文

Content #

tcpdump -w file.pcap 'dst port 443 && tcp[20]==22 && tcp[25]==1'
  1. dst port 443:

就是抓取从客户端发过来的访问 HTTPS 的报文。

  1. tcp[20]==22:

这是提取了 TCP 的第 21 个字节(因为初始序号是从 0 开始的),由于 TCP 头部占 20 字节,TLS 又是 TCP 的载荷,那么 TLS 的第 1 个字节就是 TCP 的第 21 个字节,也就是 TCP[20],这个位置的值如果是 22(十进制),那么就表明这个是 TLS 握手报文。

  1. tcp[25]==1:

这是 TCP 头部的第 26 个字节,如果它等于 1,那么就表明这个是 Client Hello 类型的 TLS 握手报文。

wireshark中显示的第21字节会是十六进制的 16,换算成十进制,就是 22 。

报文偏移量及其含义:

Viewpoints #

From #

02 | 抓包分析技术初探:你会用tcpdump和Wireshark吗?

...

sub:tcpdump

Some Common Options for TCPDump #

Option Description
-i <interface> Specifies the interface to use
-v Produces output in verbose mode
-vv Produces output in really verbose mode
-x Causes TCPDump to print the packet itself in hexadecimal format
-X Causes TCPDump to also print the output in ASCII
-n Tells TCPDump not to perform DNS lookups for the IP addresses
seen during the capture
-F <file> Reads the expression from <file>
-D Prints available interfaces
-s <length> Sets the length for each packet of the capture to <length>

Content #

抓取TLS握手阶段的Client Hello报文 抓取TCP RST报文 过滤后转存 只抓取到传输层头部 确定抓包位置(客户端还是服务器) tcptrace frame.time过滤器

...

抓包文件类型

Content #

  1. pcap

这个是 libpcap 的格式,也是 tcpdump 和 Wireshark 等工具默认支持的文件格式。pcap 格式的文件中除了报文数据以外,也包含了抓包文件的元信息,比如版本号、抓包时间、每个报文被抓取的最大长度,等等。

  1. cap

cap 文件可能含有一些 libpcap 标准之外的数据格式,它是由一些 tcpdump 以外的抓包程序生成的。比如 Citrix 公司的 netscaler 负载均衡器,它的 nstrace 命令生成的抓包文件,就是以.cap 为扩展名的。这种文件除了包含 pcap 标准定义的信息以外,还包含了 LB 的前端连接和后端连接之间的 mapping 信息。Wireshark 是可以读取这些.cap 文件的,只要在正确的版本上。

  1. pcapng

上图中右边的 pcapng 格式是包含报文的网络接口信息的,而左边的 pcap 就没有。

pcapng 还有很多别的特性,比如更细粒度的报文时间戳、允许对报文添加注释、更灵活的元数据,等等。如果你是用版本比较新的 Wireshark 和 tshark 做抓包,默认生成的抓包文件就已经是 pcapng 格式了。

Viewpoints #

From #

02 | 抓包分析技术初探:你会用tcpdump和Wireshark吗?

查看网络路径状况(traceroute和mtr)

Content #

一个简单的 traceroute 的典型输出:

$ traceroute  www.baidu.com
traceroute to www.a.shifen.com (180.101.49.12), 64 hops max
  1   10.0.2.2  0.133ms  0.131ms  0.087ms
  2   192.168.1.1  3.048ms  1.466ms  1.574ms
  3   100.65.0.1  8.975ms  3.067ms  6.472ms
  4   61.152.53.149  5.644ms  3.691ms  4.624ms
  5   61.152.24.226  5.357ms  4.393ms  4.244ms
  6   202.97.29.122  10.171ms  10.403ms  8.755ms
  7   58.213.94.118  10.707ms  11.880ms  11.441ms
  8   58.213.94.90  9.644ms  *  *
  9   58.213.96.110  12.758ms  12.095ms  11.842ms
 10   *  *  *
 11   *  *  *
 12   *  *  *
 13   *  *  *
 14   *  *  *
 15   *  *  *
 16   *  *  *
 17   *  *  *
 18   *  *  *
 19   *  *  *
 20   *  *  *

为什么从第 10 跳开始就没有 IP,只有星号了?你是不是也遇到过这种情况呢?其实,你稍微改一下命令,也就是加上 -I 参数(I 代表 ICMP),就可以正常跑到底了:

...