一、命令介绍
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。
参考文章: