一、命令介绍

  tcpdump 和 Wireshark 是最常用的网络抓包和分析工具。tcpdump 仅支持命令行格式使用,常用在服务器中抓取和分析网络包。Wireshark呢, 除了可以抓包外,还提供了强大的图形界面和汇总分析工具,在分析复杂的网络情景时,尤为简单和实用。
  因为 tcpdump 输出格式却并不直观因,所以在实际分析网络性能时,先用 tcpdump 抓包,后用 Wireshark 分析,也是一种常用的方法。
  tcpdump 是基于 libpcap ,利用内核中的 AF_PACKET 套接字,抓取网络接口中传输的网络包;并提供了强大的过滤规则,帮你从大量的网络包中,挑出最想关注的信息。tcpdump 展示了每个网络包的详细细节,这意味着要使用你必须要对网络协议有基本了解。而要了解网络协议的详细设计和实现细节, RFC 当然是最权威的资料。
  tcpdump 提供了大量的选项以及各式各样的过滤表达式,我们可以阅读 tcpdump 手册pcap-filter 手册。

常用选项:

选项 含义
-i 指定网络接口
-n 不将主机地址转换为名称,这可用于避免 DNS 查找
-nn 不解析协议和端口名称
-S 不把TCP随机序列和确认序列解析成绝对值。
-c 限制抓取的网络包数
-A 以 ASCII 格式打印每个数据包(减去其链接级标头),方便捕捉网页。不指定此选项只显示头部信息。
-e 输出链路层头部信息。例如,这可用于打印以太网和 IEEE 802.11 等协议的 MAC 层地址。
-t 在输出的每一行不打印时间戳。
-w 将抓取信息保存到文件中,文件名通常以.pcap为后缀。文件可以交由 wireshark 分析。
-r 从指定的文件中读取包(这些包一般通过-w选项产生)
-v 解析和打印时,产生(略多)详细输出,至于那些详细信息使用man tcpdump命令去查看。
-vv 更详细的输出

过滤选项:

表达式 示例 含义
host、src host、dst host tcpdump host 10.88.88.13 主机过滤
net、src net、dst net tcpdump net 10.88.88.0 网络过滤
port、portrange、src port、dst port tcpdump dst port 80 端口过滤
ip、ip6、arp、tcp、udp、icmp tcpdump tcp 协议过滤
and、or、not tcpdump tcp or icmp 逻辑表达式
tcp[tcpflags] tcpdump "tcp[tcpflags] & tcp-syn != 0" 过滤特定状态TCP包

二、示例

我们来看一个简单抓包例子,抓取来自 10.0.0.46 地址的 icmp 包:

[root@cp3 ~]# tcpdump -nn icmp and host 10.0.0.46
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:15:38.136274 IP 10.0.0.46 > 10.0.0.14: ICMP echo request, id 11, seq 1, length 64
11:15:38.136322 IP 10.0.0.14 > 10.0.0.46: ICMP echo reply, id 11, seq 1, length 64

  输出前两行,表示 tcpdump 的提示信息和接口的基本信息,这两行下面就是抓取到的网络包的输出了。
  输出的基本格式:时间戳 协议 源地址.源端口 > 目的地址.目的端口 网络包详细信息。这是最基本的格式,可以通过选项增加其他字段。

接下来,我们来抓取分析下经典的 TCP 三次握手(来自 10.0.0.46 的 ssh 连接):

[root@cp3 ~]# tcpdump -c 3 -S -nn tcp and host 10.0.0.46
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:38:23.399594 IP 10.0.0.46.58440 > 10.0.0.14.22: Flags [S], seq 836514978, win 64860, options [mss 1410,sackOK,TS val 1066846754 ecr 0,nop,wscale 7], length 0
11:38:23.399641 IP 10.0.0.14.22 > 10.0.0.46.58440: Flags [S.], seq 1044761325, ack 836514979, win 27960, options [mss 1410,sackOK,TS val 2406870144 ecr 1066846754,nop,wscale 7], length 0
11:38:23.399952 IP 10.0.0.46.58440 > 10.0.0.14.22: Flags [.], ack 1044761326, win 507, options [nop,nop,TS val 1066846755 ecr 2406870144], length 0

# 再次模拟ssh连接并抓取保存到文件
[root@cp3 ~]# tcpdump -nn tcp and host 10.0.0.46  -w ssh.pcap

输出观测可能不直观,保存到文件由 wireshark 分析:

第一次:客户端向服务端发送连接请求报文,会带上 SYN 标识和一个随机序列号 seq 为 x。
第二次:服务端接收到请求报文,会给客户端回应一个包带上 SYN 和 ACK 标识,随机序列号为 y,确认序列号为 x+1。
第三次:客户端收到服务器的包,会给服务端发送一个确认包,回应的包会带上 ACK 标识,随机序列号为 x+1,确序列号为 y+1。

参考文章:

https://time.geekbang.org/column/intro/140

发表评论

验证码: 9 + 1 =