网络排查命令----tcpdump
tcpdump工具简介
- tcpdump --- dump traffic on a network ;根据使用者的定义对网络上的数据包进行截获的包分析工具。
- tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析,它支持针对网络层、协议、主机、网络或端口的过滤,
- tcpdump提供and、or、not等逻辑语句来帮助你去掉无用的信息。
下载
yum -y install tcpdump
概要语法:
tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
[ -c count ]
[ -C file_size ] [ -G rotate_seconds ] [ -F file ]
[ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
[ --number ] [ -Q|-P in|out|inout ]
[ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
[ --time-stamp-precision=tstamp_precision ]
[ --immediate-mode ] [ --version ]
[ expression ]
常用选项
-D 列出网络接口列表
-D
--list-interfaces
打印系统上可用的网络接口列表,以及tcpdump可以在其中捕获数据包的网络接口列表。对于每个网络接口,都会打印一个数字和一个接口名称,后面可能跟有接口的文本描述。接口名称或编号可以提供给-i选项,以指定要捕获的接口。
[root@k8s-master ~]# tcpdump -D
1.docker0
2.tunl0
3.bluetooth0 (Bluetooth adapter number 0)
4.nflog (Linux netfilter log (NFLOG) interface)
5.nfqueue (Linux netfilter queue (NFQUEUE) interface)
6.usbmon1 (USB bus number 1)
7.cali2c685e579df
8.usbmon2 (USB bus number 2)
9.cali6b72856f7ac
10.ens37
11.cali296c6c0494c
12.any (Pseudo-device that captures on all interfaces)
13.lo [Loopback]
-i 指定网络接口
-i interface
--interface=interface
1.指定网络接口。
2.如果未指定,tcpdump将在系统接口列表中搜索编号最低的配置好的up接口(不包括环回),该接口可能是,例如,'eth0'。
3.在内核为2.2或更高版本的Linux系统上,可以使用接口参数“any”从所有接口捕获数据包。请注意"any"的捕获不会在混杂模式下完成。
4.如果支持-D标志,如果系统上没有接口将该标志打印的接口号作为名称,则可以将该标志打印的接口号用作接口参数。
-c 指定dump的包的个数
-c count
收到count个数据包后自动退出
-n 不做主机名与ip地址转换,只以ip打印
-n 不要将主机地址转换为名称。这可以用来避免DNS查找。
-nn 也不会将协议和端口号等转换为名称。
-N 不要打印主机名的域名限定。例如,如果您给出此短选项,tcpdump将打印"nic"而不是 "nic.ddn.mil".
#示例
[root@k8s-master ~]# tcpdump -i ens37 -vv -n -c 3
tcpdump: listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
13:59:28.580896 IP (tos 0x10, ttl 64, id 46658, offset 0, flags [DF], proto TCP (6), length 88)
192.168.75.200.ssh > 192.168.75.1.57745: Flags [P.], cksum 0x1865 (incorrect -> 0xc3c8), seq 4088702861:4088702909, ack 3151059447, win 501, length 48
13:59:28.581039 IP (tos 0x0, ttl 128, id 24244, offset 0, flags [DF], proto TCP (6), length 40)
192.168.75.1.57745 > 192.168.75.200.ssh: Flags [.], cksum 0xf4ce (correct), seq 1, ack 48, win 4104, length 0
13:59:28.581199 IP (tos 0x10, ttl 64, id 46659, offset 0, flags [DF], proto TCP (6), length 184)
192.168.75.200.ssh > 192.168.75.1.57745: Flags [P.], cksum 0x18c5 (incorrect -> 0xa433), seq 48:192, ack 1, win 501, length 144
3 packets captured
3 packets received by filter
0 packets dropped by kernel
[root@k8s-master ~]# tcpdump -i ens37 -vv -nn -c 3
tcpdump: listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
13:59:35.048566 IP (tos 0x10, ttl 64, id 46671, offset 0, flags [DF], proto TCP (6), length 88)
192.168.75.200.22 > 192.168.75.1.57745: Flags [P.], cksum 0x1865 (incorrect -> 0xf5c7), seq 4088703645:4088703693, ack 3151059831, win 501, length 48
13:59:35.048714 IP (tos 0x0, ttl 128, id 24269, offset 0, flags [DF], proto TCP (6), length 40)
192.168.75.1.57745 > 192.168.75.200.22: Flags [.], cksum 0xf041 (correct), seq 1, ack 48, win 4101, length 0
13:59:35.048933 IP (tos 0x10, ttl 64, id 46672, offset 0, flags [DF], proto TCP (6), length 168)
192.168.75.200.22 > 192.168.75.1.57745: Flags [P.], cksum 0x18b5 (incorrect -> 0x359c), seq 48:176, ack 1, win 501, length 128
3 packets captured
3 packets received by filter
0 packets dropped by kernel
[root@k8s-master ~]# tcpdump -i ens37 -vv -N -c 3
tcpdump: listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
13:59:47.769377 IP (tos 0x10, ttl 64, id 46686, offset 0, flags [DF], proto TCP (6), length 88)
k8s-master.ssh > 192.57745: Flags [P.], cksum 0x1865 (incorrect -> 0x28d1), seq 4088704509:4088704557, ack 3151060311, win 501, length 48
13:59:47.769545 IP (tos 0x0, ttl 128, id 24303, offset 0, flags [DF], proto TCP (6), length 40)
192.57745 > k8s-master.ssh: Flags [.], cksum 0xeafe (correct), seq 1, ack 48, win 4104, length 0
13:59:47.769973 IP (tos 0x0, ttl 64, id 24073, offset 0, flags [DF], proto UDP (17), length 71)
k8s-master.59205 > public1.domain: [bad udp cksum 0xf199 -> 0xe0cb!] 62457+ PTR? 1.75.168.192.in-addr.arpa. (43)
3 packets captured
9 packets received by filter
0 packets dropped by kernel
[root@k8s-master ~]#
-v 详细输出
-v
1.在解析和打印时,生成(稍微多一些)详细的输出。例如,打印IP数据包中的生存时间、标识、总长度和选项。还支持其他数据包完整性检查,例如验证IP和ICMP报头校验和。
2.使用-w选项写入文件时,每10秒报告捕获的数据包数。
-vv
更详细的输出。例如,从NFS回复数据包打印附加字段,并对SMB数据包进行完全解码。
-vvv
输出更加详细。例如,telnet SB。。。SE选项全部打印。使用-X Telnet时,选项也以十六进制打印。
-w 输出到文件
-w file
1.使用-v选项,每10秒报告捕获的数据包数
2.将原始数据包写入文件,而不是解析并打印出来。以后可以使用tcpdump-r选项打印它们。
3.如果将该输出写入文件或管道,则该输出将被缓冲,因此从该文件或管道读取的程序在收到数据包后的任意时间内可能看不到数据包。使用-U标志可使数据包在收到后立即写入。
4.MIME类型应用程序application/vnd.tcpdump.pcap已向IANA注册pcap文件。Tcpdump本身在读取捕获文件时不检查扩展名,在写入文件时也不添加扩展名(它在文件头中使用幻数)。但是,如果存在扩展,许多操作系统和应用程序将使用该扩展,建议添加一个(例如 file.pcap)
#示例
[root@k8s-master ~]# tcpdump -i ens37 -vv -N -c 3 -w test.pcap
tcpdump: listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
3 packets captured
15 packets received by filter
0 packets dropped by kernel
[root@k8s-master ~]# tcpdump -r test.pcap
reading from file test.txt, link-type EN10MB (Ethernet)
14:25:03.006770 IP k8s-master.ssh > 192.168.75.1.57745: Flags [P.], seq 4088721293:4088721357, ack 3151071495, win 501, length 64
14:25:03.006880 IP 192.168.75.1.57745 > k8s-master.ssh: Flags [.], ack 64, win 4103, length 0
14:25:03.037778 IP k8s-master.sun-sr-https > k8s-node2.25461: Flags [.], ack 515136967, win 501, length 0
[root@k8s-master ~]#
and 、or 、not 方法使用
- 要打印helios和hot或ace之间的流量
tcpdump host helios and \( hot or ace \)
- 要打印ace和除helios之外的任何主机之间的所有IP数据包
tcpdump ip host ace and not helios
host 、port 指定主机和端口
tcpdump host 10.159.32.65 port 443
tcpdump host k8s-master port https
dst 、src 指定目的(dst)或源(src)
#举例
[root@k8s-master ~]# tcpdump -i ens37 -vv -nn -c 3
tcpdump: listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
14:57:21.847612 IP (tos 0x10, ttl 64, id 47112, offset 0, flags [DF], proto TCP (6), length 88)
192.168.75.200.22 > 192.168.75.1.57745: Flags [P.], cksum 0x1865 (incorrect -> 0x897f), seq 4088728733:4088728781, ack 3151076247, win 501, length 48
14:57:21.847783 IP (tos 0x0, ttl 128, id 28378, offset 0, flags [DF], proto TCP (6), length 40)
192.168.75.1.57745 > 192.168.75.200.22: Flags [.], cksum 0x4e1d (correct), seq 1, ack 48, win 4105, length 0
14:57:21.848088 IP (tos 0x10, ttl 64, id 47113, offset 0, flags [DF], proto TCP (6), length 200)
192.168.75.200.22 > 192.168.75.1.57745: Flags [P.], cksum 0x18d5 (incorrect -> 0xe6e9), seq 48:208, ack 1, win 501, length 160
3 packets captured
3 packets received by filter
0 packets dropped by kernel
[root@k8s-master ~]# tcpdump -i ens37 -vv -nn -c 3 dst 192.168.75.200
tcpdump: listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
14:57:42.981775 IP (tos 0x0, ttl 63, id 17744, offset 0, flags [DF], proto TCP (6), length 40)
192.168.75.201.30370 > 192.168.75.200.6443: Flags [.], cksum 0xc612 (correct), seq 1185074782, ack 3486725036, win 10385, length 0
14:57:42.981891 IP (tos 0x0, ttl 63, id 17745, offset 0, flags [DF], proto TCP (6), length 75)
192.168.75.201.30370 > 192.168.75.200.6443: Flags [P.], cksum 0x43dc (correct), seq 0:35, ack 1, win 10385, length 35
14:57:42.983400 IP (tos 0x0, ttl 128, id 28444, offset 0, flags [DF], proto TCP (6), length 40)
192.168.75.1.57745 > 192.168.75.200.22: Flags [.], cksum 0x43ee (correct), seq 3151077303, ack 4088730333, win 4104, length 0
3 packets captured
5 packets received by filter
0 packets dropped by kernel
[root@k8s-master ~]# tcpdump -i ens37 -vv -nn -c 3 src 192.168.75.200
tcpdump: listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
14:58:14.667205 IP (tos 0x10, ttl 64, id 47165, offset 0, flags [DF], proto TCP (6), length 88)
192.168.75.200.22 > 192.168.75.1.57745: Flags [P.], cksum 0x1865 (incorrect -> 0x26f9), seq 4088731645:4088731693, ack 3151078599, win 501, length 48
14:58:14.667749 IP (tos 0x10, ttl 64, id 47166, offset 0, flags [DF], proto TCP (6), length 136)
192.168.75.200.22 > 192.168.75.1.57745: Flags [P.], cksum 0x1895 (incorrect -> 0xc508), seq 48:144, ack 1, win 501, length 96
14:58:14.667967 IP (tos 0x10, ttl 64, id 47167, offset 0, flags [DF], proto TCP (6), length 136)
192.168.75.200.22 > 192.168.75.1.57745: Flags [P.], cksum 0x1895 (incorrect -> 0x2e8d), seq 144:240, ack 1, win 501, length 96
3 packets captured
3 packets received by filter
0 packets dropped by kernel
使用tcpdump抓取交换机连接的端口
有时候需要知道服务器连接到了哪个交换机的哪个端口。这是如果连接的交换机支持LLDP或CDP协议,并启用了该协议。那我们就可以用过tcpdump来抓取物理连接信息。
对于LLDP,协议号是0x88cc。于是我们可以使用以下tcpdump命令来抓取到我们想要的信息。
tcpdump -i eth0 ether proto 0x88cc -A -s0 -t -c 1
对于使用CDP协议的交换机,一般是Cisco的交换机。可以使用下面命令。即把LLDP的协议号换成CDP的协议号0x2000
tcpdump -i eth0 ether proto 0x2000 -A -s0 -t -c 1