常用的 tcpdump 命令参考手册

1 参数介绍

1.1 不转换主机名、端口号等

# tcpdump -n

tcpdump 默认输出主机名词,-n 选项是输出 IP 地址。

1.2 输出详细信息

# tcpdump -v
or
# tcpdump -vv
or
# tcpdump -vvv

tcpdump 的详细信息有三个等级,你可以通过在命令行增加 v 标记的个数来获取更多的信息。

1.3 指定网络接口

# tcpdump -n -i eth1
or
# tcpdump -n -i any

any 表示任意端口,不加-i选项的话,默认从第一个网络设备号抓取信息。

1.4 写入文件

# tcpdump -w /path/to/file

写出的是 tcpdump 固有的格式,需要用 tcpdump 命令查看该文件。

1.5 读取文件

# tcpdump -r /path/to/file

1.6 指定抓包大小

# tcpdump -s 100

1.7 指定抓包数量

# tcpdump -c 10

不加 -c 选项的话,会默认一直抓包。

1.8 汇总命令

# tcpdump -nvvv -i any -c 100 -s 100

从任意网络接口抓取100个包的前100个字节。

2 过滤器

tcpdump 可以通过各式各样的表达式,来过滤所截取或者输出的数据。

2.1 查找特定主机的流量

# tcpdump -nvvv -i any -c 3 host 10.0.3.1

2.2 只显示源地址为特定主机的流量

# tcpdump -nvvv -i any -c 3 src host 10.0.3.1

2.3 过滤源和目的端口

#  tcpdump  -nvvv -i any -c 3 port 22 and port 60738

2.4 查找两个端口号的流量

#  tcpdump  -nvvv -i any -c 20 'port 80 or port 443'

2.5 查找两个特定端口和来自特定主机的数据流

#  tcpdump  -nvvv -i any -c 20 '(port 80 or port 443) and host 10.0.3.169'

3 理解输出结果

3.1 判断数据包类型

10.0.3.246.56894 > 192.168.0.92.22: Flags [S], cksum 0xcf28 (incorrect -> 0x0388), seq 682725222, win 29200, options [mss 1460,sackOK,TS val 619989005 ecr 0,nop,wscale 7], length 0

从上面的例子,我们可以判断这个数据包是一个 SYN 数据包。
Flags 类型介绍:

[S] – SYN (开始连接)
[.] – 没有标记
[P] – PSH (数据推送)
[F] – FIN (结束连接)
[R] – RST (重启连接)
[S.] - SYN-ACK 数据包

3.2 不好的例子

15:15:43.323412 IP (tos 0x0, ttl 64, id 51051, offset 0, flags [DF], proto TCP (6), length 60)
    10.0.3.246.56894 > 192.168.0.92.22: Flags [S], cksum 0xcf28 (incorrect -> 0x0388), seq 682725222, win 29200, options [mss 1460,sackOK,TS val 619989005 ecr 0,nop,wscale 7], length 0
15:15:44.321444 IP (tos 0x0, ttl 64, id 51052, offset 0, flags [DF], proto TCP (6), length 60)
    10.0.3.246.56894 > 192.168.0.92.22: Flags [S], cksum 0xcf28 (incorrect -> 0x028e), seq 682725222, win 29200, options [mss 1460,sackOK,TS val 619989255 ecr 0,nop,wscale 7], length 0
15:15:46.321610 IP (tos 0x0, ttl 64, id 51053, offset 0, flags [DF], proto TCP (6), length 60)
    10.0.3.246.56894 > 192.168.0.92.22: Flags [S], cksum 0xcf28 (incorrect -> 0x009a), seq 682725222, win 29200, options [mss 1460,sackOK,TS val 619989755 ecr 0,nop,wscale 7], length 0

上面显示了一个不好的通信例子,在这个例子中“不好”,代表通信没有建立起来。我们可以看到 10.0.3.246 发出一个 SYN 数据包给 主机 192.168.0.92,但是主机并没有应答。

3.3 好的例子

15:18:25.716453 IP (tos 0x10, ttl 64, id 53344, offset 0, flags [DF], proto TCP (6), length 60)
    10.0.3.246.34908 > 192.168.0.110.22: Flags [S], cksum 0xcf3a (incorrect -> 0xc838), seq 1943877315, win 29200, options [mss 1460,sackOK,TS val 620029603 ecr 0,nop,wscale 7], length 0
15:18:25.716777 IP (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.0.110.22 > 10.0.3.246.34908: Flags [S.], cksum 0x594a (correct), seq 4001145915, ack 1943877316, win 5792, options [mss 1460,sackOK,TS val 18495104 ecr 620029603,nop,wscale 2], length 0
15:18:25.716899 IP (tos 0x10, ttl 64, id 53345, offset 0, flags [DF], proto TCP (6), length 52)
    10.0.3.246.34908 > 192.168.0.110.22: Flags [.], cksum 0xcf32 (incorrect -> 0x9dcc), ack 1, win 229, options [nop,nop,TS val 620029603 ecr 18495104], length 0

好的例子应该向上面这样,我们看到典型的 TCP 3次握手。

4 数据包检查

4.1 用十六进制和 ASCII 码打印数据包

# tcpdump -nvvv -i any -c 1 -XX 'port 80 and host 10.0.3.1'

排查应用程序网络问题的通常做法,就是用 tcpdump 的 -XX 标记打印出 16 进制和 ASCII 码格式的数据包。

4.2 只打印 ASCII 码格式的数据包

# tcpdump -nvvv -i any -c 1 -A 'port 80 and host 10.0.3.1'

你可以通过 -A 标记来打印 ASCII 码格式的数据包。

5 抓取非 TCP 数据流

tcpdump 不是只能抓 TCP 数据包。它还可以用来获取其他类型的数据包,例如 ICMP、 UDP 和 ARP 包。

5.1 ICMP 数据包

# tcpdump -nvvv -i any -c 2 icmp

5.2 UDP 数据包

# tcpdump -nvvv -i any -c 2 udp

ref: http://blog.jobbole.com/91631/

你可能感兴趣的:(tcpdump)