linux系统的tcpdump命令用来分析数据包分析工具,相似的工具有wireshark等,wireshark使用见【wireshark报文解析ping baidu.com】
执行tcpdump指令可列出经过指定网络界面的数据包文件头,在Linux操作系统中,你必须是系统管理员。
如果不是root账户运行会出现[potato@localhost ~]$ tcpdump tcpdump:
tcpdump [-adeflnNOpqStvx][-c<数据包数目>][-dd][-ddd][-F<表达文件>][-i<网络界面>][-r<数据包文件>][-s<数据包大小>][-tt][-T<数据包类型>][-vv][-w<数据包文件>][输出数据栏位]
-a 尝试将网络和广播地址转换成名称。
-c<数据包数目> 收到指定的数据包数目后,就停止进行倾倒操作。
-d 把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出。
-dd 把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出。
-ddd 把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出。
-e 在每列倾倒资料上显示连接层级的文件头。
-f 用数字显示网际网络地址。
-F<表达文件> 指定内含表达方式的文件。
-i<网络界面> 使用指定的网络截面送出数据包。
-l 使用标准输出列的缓冲区。
-n 不把主机的网络地址转换成名字。
-N 不列出域名。
-O 不将数据包编码最佳化。
-p 不让网络界面进入混杂模式。
-q 快速输出,仅列出少数的传输协议信息。
-r<数据包文件> 从指定的文件读取数据包数据。
-s<数据包大小> 设置每个数据包的大小。
-S 用绝对而非相对数值列出TCP关联数。
-t 在每列倾倒资料上不显示时间戳记。
-tt 在每列倾倒资料上显示未经格式化的时间戳记。
-T<数据包类型> 强制将表达方式所指定的数据包转译成设置的数据包类型。
-v 详细显示指令执行过程。
-vv 更详细显示指令执行过程。
-x 用十六进制字码列出数据包资料。
-w<数据包文件> 把数据包数据写入指定的文件。
只用root账户使用tcptump命令的话,获得的数据包超级多,不方便进行排查问题,因此得需要进行过滤
准备工作
#查看linux系统网卡信息
ifconfig
获取到的网卡信息如下,一般虚拟机的以太网网卡都是ens,这里ens33就是我们测试的网卡,ether就是网卡对应的mac地址
[root@localhost potato]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.198.145 netmask 255.255.255.0 broadcast 192.168.198.255
inet6 fe80::1d:eebe:25e1:8e7d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:a4:6e:7a txqueuelen 1000 (Ethernet)
RX packets 1326 bytes 126506 (123.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1118 bytes 132303 (129.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 11 bytes 1001 (1001.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 11 bytes 1001 (1001.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:7f:f3:44 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#ping baidu.com获取百度的ip地址,得到baidu的ip为:39.156.66.10;
[root@localhost potato]# ping baidu.com
PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=1 ttl=128 time=67.6 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=2 ttl=128 time=66.1 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=3 ttl=128 time=76.1 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=4 ttl=128 time=78.9 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=5 ttl=128 time=70.1 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=6 ttl=128 time=78.9 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=7 ttl=128 time=72.5 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=8 ttl=128 time=76.5 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=9 ttl=128 time=78.0 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=10 ttl=128 time=60.7 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=11 ttl=128 time=67.5 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=12 ttl=128 time=65.6 ms
#开另外一个窗口获取跟百度相关的数据包
#监听ens33与所有主机相关的数据包
tcpdump -i ens33 host 39.156.66.10
#监听ens33与源地址主机相关的数据包
tcpdump -i ens33 scr 39.156.66.10
#监听ens33与目的主机相关的数据包
tcpdump -i ens33 dst 39.156.66.10
获取到相关数据包从左到右分别为:
请求时间 | 源ip地址 | 目的ip地址 | 协议类型 | 请求类型 | 请求序列号 | 标志 | 长度 |
---|---|---|---|---|---|---|---|
01:46:47.718943 | localhost.localdomain | 39.156.66.10 | ICMP | request(请求) | 3305 | 104 | 64 |
[root@localhost potato]# tcpdump -i ens33 | grep 39.156.66.10
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
01:46:47.718943 IP localhost.localdomain > 39.156.66.10: ICMP echo request, id 3305, seq 104, length 64
01:46:47.777747 IP 39.156.66.10 > localhost.localdomain: ICMP echo reply, id 3305, seq 104, length 64
01:46:48.721386 IP localhost.localdomain > 39.156.66.10: ICMP echo request, id 3305, seq 105, length 64
01:46:48.782127 IP 39.156.66.10 > localhost.localdomain: ICMP echo reply, id 3305, seq 105, length 64
01:46:49.723747 IP localhost.localdomain > 39.156.66.10: ICMP echo request, id 3305, seq 106, length 64
01:46:49.792391 IP 39.156.66.10 > localhost.localdomain: ICMP echo reply, id 3305, seq 106, length 64
01:46:50.726134 IP localhost.localdomain > 39.156.66.10: ICMP echo request, id 3305, seq 107, length 64
01:46:50.790149 IP 39.156.66.10 > localhost.localdomain: ICMP echo reply, id 3305, seq 107, length 64
01:46:51.727692 IP localhost.localdomain > 39.156.66.10: ICMP echo request, id 3305, seq 108, length 64
01:46:51.786456 IP 39.156.66.10 > localhost.localdomain: ICMP echo reply, id 3305, seq 108, length 64
01:46:52.730669 IP localhost.localdomain > 39.156.66.10: ICMP echo request, id 3305, seq 109, length 64
01:46:52.791169 IP 39.156.66.10 > localhost.localdomain: ICMP echo reply, id 3305, seq 109, length 64
01:46:53.733012 IP localhost.localdomain > 39.156.66.10: ICMP echo request, id 3305, seq 110, length 64
01:46:53.795976 IP 39.156.66.10 > localhost.localdomain: ICMP echo reply, id 3305, seq 110, length 64
通过-e命令可以查看,报文解析内容如下:
请求时间 | 源mac地址 | 目的mac地址 | 协议类型 | 长度 | 源ip地址 | 目的ip地址 | 协议类型 | 请求类型 | 请求序列号 | 标志 | 长度 |
---|---|---|---|---|---|---|---|---|---|---|---|
01:48:09.891936 | 00:0c:29:a4:6e:7a | 00:50:56:fb:7a:30 | ethertype IPv4 | 98 | localhost.localdomain | 39.156.66.10 | 64 | localhost.localdomain | 39.156.66.10 | ICMP | request |
#tcpdump -i ens33 -e | grep 39.156.66.10获取百度相关通信的包,并展示在每列倾倒资料上显示连接层级的文件头。
[root@localhost potato]# tcpdump -i ens33 -e host 39.156.66.10
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
01:48:09.891936 00:0c:29:a4:6e:7a (oui Unknown) > 00:50:56:fb:7a:30 (oui Unknown), ethertype IPv4 (0x0800), length 98: localhost.localdomain > 39.156.66.10: ICMP echo request, id 3305, seq 186, length 64
01:48:09.965766 00:50:56:fb:7a:30 (oui Unknown) > 00:0c:29:a4:6e:7a (oui Unknown), ethertype IPv4 (0x0800), length 98: 39.156.66.10 > localhost.localdomain: ICMP echo reply, id 3305, seq 186, length 64
01:48:10.893545 00:0c:29:a4:6e:7a (oui Unknown) > 00:50:56:fb:7a:30 (oui Unknown), ethertype IPv4 (0x0800), length 98: localhost.localdomain > 39.156.66.10: ICMP echo request, id 3305, seq 187, length 64
01:48:10.951369 00:50:56:fb:7a:30 (oui Unknown) > 00:0c:29:a4:6e:7a (oui Unknown), ethertype IPv4 (0x0800), length 98: 39.156.66.10 > localhost.localdomain: ICMP echo reply, id 3305, seq 187, length 64
01:48:11.895483 00:0c:29:a4:6e:7a (oui Unknown) > 00:50:56:fb:7a:30 (oui Unknown), ethertype IPv4 (0x0800), length 98: localhost.localdomain > 39.156.66.10: ICMP echo request, id 3305, seq 188, length 64
#对本机的UDP端口(123)进行监听
tcpdump udp port 123
[root@localhost potato]# tcpdump -i ens33 arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
02:14:57.335964 ARP, Request who-has gateway tell localhost.localdomain, length 28
02:14:57.336343 ARP, Reply gateway is-at 00:50:56:fb:7a:30 (oui Unknown), length 46
02:14:58.499764 ARP, Request who-has localhost.localdomain (00:0c:29:a4:6e:7a (oui Unknown)) tell 192.168.198.1, length 46
02:14:58.499805 ARP, Reply localhost.localdomain is-at 00:0c:29:a4:6e:7a (oui Unknown), length 28