# tcpdump -n
tcpdump
默认输出主机名词,-n
选项是输出 IP 地址。
# tcpdump -v
or
# tcpdump -vv
or
# tcpdump -vvv
tcpdump
的详细信息有三个等级,你可以通过在命令行增加 v 标记的个数来获取更多的信息。
# tcpdump -n -i eth1
or
# tcpdump -n -i any
any
表示任意端口,不加-i
选项的话,默认从第一个网络设备号抓取信息。
# tcpdump -w /path/to/file
写出的是 tcpdump
固有的格式,需要用 tcpdump
命令查看该文件。
# tcpdump -r /path/to/file
# tcpdump -s 100
# tcpdump -c 10
不加 -c
选项的话,会默认一直抓包。
# tcpdump -nvvv -i any -c 100 -s 100
从任意网络接口抓取100个包的前100个字节。
tcpdump
可以通过各式各样的表达式,来过滤所截取或者输出的数据。
# tcpdump -nvvv -i any -c 3 host 10.0.3.1
# tcpdump -nvvv -i any -c 3 src host 10.0.3.1
# tcpdump -nvvv -i any -c 3 port 22 and port 60738
# tcpdump -nvvv -i any -c 20 'port 80 or port 443'
# tcpdump -nvvv -i any -c 20 '(port 80 or port 443) and host 10.0.3.169'
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 数据包
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,但是主机并没有应答。
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次握手。
# tcpdump -nvvv -i any -c 1 -XX 'port 80 and host 10.0.3.1'
排查应用程序网络问题的通常做法,就是用 tcpdump 的 -XX 标记打印出 16 进制和 ASCII 码格式的数据包。
# tcpdump -nvvv -i any -c 1 -A 'port 80 and host 10.0.3.1'
你可以通过 -A
标记来打印 ASCII 码格式的数据包。
tcpdump 不是只能抓 TCP 数据包。它还可以用来获取其他类型的数据包,例如 ICMP、 UDP 和 ARP 包。
# tcpdump -nvvv -i any -c 2 icmp
# tcpdump -nvvv -i any -c 2 udp
ref: http://blog.jobbole.com/91631/