目录
5.2 在主机 192.168.0.155 打开一个shell命令行开启抓包监听
5.3 在主机 192.168.0.155 打开另一个shell命令行 telnet 192.168.0.154
5.4 在主机 192.168.0.155 抓包监听的窗口抓到头两帧数据即是 ARP 请求 和 ARP 应答包如下
1. ARP 协议
ARP(Address Resolution Protocol,地址解析协议)协议属于网络层协议,它实现了将目的主机的 IP 地址转换为 MAC 地址(物理地址)。
2. 工作原理
主机向自己所在的网络(比如家用路由器)广播一个 ARP 请求(request),该请求包含目的主机的IP地址,此网络上的其它主机都将收到这个请求,但只有被请求的目的主机会回应一个 arp 应答(reply)。
3. ARP 协议报文格式
字段 | 字节数 | 说明 |
---|---|---|
硬件类型 | 2 | 表示物理地址的类型,对于以太网 MAC 地址,值为:0x0001 |
协议类型 | 2 | 发送方要映射的协议地址类型,对于 IP 地址,值为:0x0800 |
硬件地址长度 | 1 | 以太网 MAC 地址,占用 6 个字节,所以值为:0x06 |
协议地址长度 | 1 | IPv4,占用 4 字节,所以值为:0x04 |
操作 | 2 | 4种操作类型:ARP 请求,值为:0x0001;ARP 应答,值为:0x0002;RARP 请求,值为:0x0003;RARP 应答,值为:0x0004 |
源MAC地址 | 6 | 发送方的 MAC 地址 |
源IP地址 | 4 | 发送方的 IP 地址 |
目的MAC地址 | 6 | 接收方的 MAC 地址,对于 ARP 请求,不知道接收方的 MAC 地址,该值用 0 填充,即 0x0000 0000 0000 |
目的IP地址 | 4 | 接收方的 IP 地址 |
上面表格的说明不能完全搞懂也不要紧,往下看,会有抓取 ARP 请求和 ARP 应答的帧数据,我们根据帧数据分析来理解,对于 ARP 请求协议的理解就容易多了。
4. ARP 缓存的查看和修改
在抓取 ARP 请求、应答包进行数据分析前,还有要讲明白 ARP 缓存。因为假如 ARP 请求的目的 IP 地址的 MAC 地址在本主机已经有缓存的话,就可能不会向自己所在的网络广播一个 ARP 请求(request),从而抓取不到 ARP 请求、应答包。
ARP 维护了一个缓存,包含了经常访问或最近访问的主机 IP 地址到 MAC 地址的映射,这样做的好处是避免了重复的 ARP 请求,从而提高发送数据包的速度。
linux 操作系统下可以使用 arp 命令来查看和修改 arp 缓存。
例如:
arp -a // 查看 arp 缓存信息
从上图可知:
网关 192.168.0.1 映射的 MAC 地址:3c:6a:48:e2:d5:67
主机 192.168.0.154 映射的 MAC 地址:00:0c:29:ba:f0:0d
主机 192.168.0.101 映射的 MAC 地址:b0:a4:60:28:96:f5
ens33 是网卡名
arp -d 192.168.0.154 // 删除目的主机 192.168.0.154 的缓存信息
5. tcpdump抓包ARP协议报文分析
tcpdump 是一个运行在命令行下的网络抓包工具,给使用者提供了大量的选项,用以过滤数据包或定制格式输出。
5.1 搭建 2 台虚拟机
环境搭建链接:搭建多台能够互相 telnet 的 centos 虚拟机-CSDN博客
主机 192.168.0.154 的 MAC 地址为:00:0c:29:ba:f0:0d,网卡名为:ens33
主机 192.168.0.155 的 MAC 地址为:00:0c:29:83:72:68,网卡名为:ens33
5.2 在主机 192.168.0.155 打开一个shell命令行开启抓包监听
tcpdump -i ens33 -en -XX '(dst 192.168.0.154 and src 192.168.0.155) or (dst 192.168.0.155 and src 192.168.0.154)'
-i: 是 interface 的意思,指定要监听的网卡接口。"-i any"表示抓取所有网卡接口的数据包。
ens33:网卡接口名
-e: 是 ethernet (以太网) 的意思,显示以太网帧头部信息。
-n: 是 number 的意思,显示 IP 地址表示主机,而不是主机名;显示数字表示端口号,而不是服务名称。
-XX: X是 hex 的意思,以十六进制显示数据包的内容,并打印每个十六进制字节对应的 ASCII 字符,XX表示还打印以太网帧头部信息
'(dst 192.168.0.154 and src 192.168.0.155) or (dst 192.168.0.155 and src 192.168.0.154)':抓取目的IP地址是 192.168.0.154 并且 源IP地址是 192.168.0.155 或者 目的IP地址是 192.168.0.155 并且源IP地址是 192.168.0.154 的数据包
5.3 在主机 192.168.0.155 打开另一个shell命令行 telnet 192.168.0.154
telnet 192.168.0.154
5.4 在主机 192.168.0.155 抓包监听的窗口抓到头两帧数据即是 ARP 请求 和 ARP 应答包如下
5.4.1 tcpdump对ARP请求解析的解读
20:36:28.520790 00:0c:29:83:72:68 > Broadcast, ethertype ARP (0x0806), length 42: Request who-has 192.168.0.154 tell 192.168.0.155, length 28
0x0000: ffff ffff ffff 000c 2983 7268 0806 0001 ........).rh....
0x0010: 0800 0604 0001 000c 2983 7268 c0a8 009b ........).rh....
0x0020: 0000 0000 0000 c0a8 009a ..........
20:36:28.520790:抓包时的时间戳
(1)站在数据链路层对以太网帧进行数据分析
说明:对于以太网帧来说,携带的数据报字节数范围:46 ~ 1500字节。所以对于ARP数据报,前28字节是ARP协议报文,还需填充18字节(PAD,填充),才能组成最低46字节的数据报,填充的每个字节数据都为:0x00
00:0c:29:83:72:68 > Broadcast, ethertype ARP (0x0806), length 42
00:0c:29:83:72:68 > Broadcast: MAC地址为 00:0c:29:83:72:68 的主机发送给 MAC地址为 Broadcast 的主机,00:0c:29:83:72:68:主机 192.168.0.155 的MAC地址;Broadcast:表示这是一个网络广播地址,即向自己所在的网络广播,此网络上的其它主机都将收到这个包
ethertype ARP (0x0806):以太网帧类型,2个字节,ARP请求的值为:0x0806
length 42: 表示以太网帧的长度为 42 字节,实际上是 64 字节,tcpdump没有统计ARP请求数据报中填充的18字节(PAD)和以太网帧尾部4字节的CRC字段。42字节的组成:以太网头部14字节(目的MAC地址 6 字节 + 源MAC地址 6 字节 + 帧类型 2字节)+ ARP 请求协议报文28字节
(2)站在网络层对ARP请求包进行数据分析
Request who-has 192.168.0.154 tell 192.168.0.155, length 28
Request: 表示这是一个 ARP 请求包
who-has 192.168.0.154 tell 192.168.0.155: 请求 IP 地址 192.168.0.154 的主机告诉IP地址 192.168.0.155 的主机
length 28: 表示ARP请求包在网络层是 28 字节(也就是上面说的ARP 协议报文格式的28字节)实际组包时应该是:28字节ARP协议报文+18字节PAD。
(3)分析ARP请求以太网数据帧
0x0000: ffff ffff ffff 000c 2983 7268 0806 0001 ........).rh....
0x0010: 0800 0604 0001 000c 2983 7268 c0a8 009b ........).rh....
0x0020: 0000 0000 0000 c0a8 009a ..........
现在我们用 ARP请求数据帧与ARP请求以太网帧报文格式进行对号入座分析:
以太网首部
0xffff ffff ffff: 对应的是以太网目的MAC地址的6字节,因为是网络广播,所以目的MAC地址为:0xffff ffff ffff
0x000c 2983 7268: 对应的是以太网源MAC地址的6字节,发送方是主机192.168.0.155,它的MAC地址就是 00:0c:29:83:72:68
0x0806: 对应的是帧类型的2字节,因为是ARP请求帧,它的值是 0x0806
ARP协议报文
0x0001: 对应的是硬件类型的2字节,表示物理地址的类型,对于以太网 MAC 地址,值为:0x0001
0x0800: 对应的是协议类型的2字节,表示发送方要映射的协议地址类型,对于 IP 地址,值为:0x0800
0x0604: 高8位对应的是硬件地址长度1字节,以太网 MAC 地址,占用 6 个字节,所以值为:0x06
低8位对应的是协议地址长度1字节,IPv4,占用 4 字节,所以值为:0x04
0x0001: 对应的是操作2字节,4种操作类型:ARP 请求,值为:0x0001;ARP 应答,值为:0x0002;RARP 请求,值为:0x0003;RARP 应答,值为:0x0004。我们这个是ARP请求包,所以,值为:0x0001
0x000c 2983 7268: 对应的是源MAC地址6字节,即发送方MAC地址,我们的发送方是主机 192.168.0.155,它的MAC地址就是:00:0c:29:83:72:68
0xc0a8 009b:对应的是源IP地址4字节,即发送方的IP地址,我们发送方是主机 192.168.0.155,点分十进制转换成点分十六进制表示就是:0xc0.a8.0.9b
0x0000 0000 0000: 对应的是目的MAC地址6字节,即接收方MAC地址,我们的接收方是主机 192.168.0.154,在 ARP请求中,不知道接收方的 MAC 地址,该值用 0 填充,即 0x0000 0000 0000
0xc0a8 009a: 对应的是目的IP地址4字节,即接收方IP地址,我们的接收方是主机 192.168.0.154,点分十进制转换成点分十六进制表示就是:0xc0.a8.0.9a
至此,ARP 请求数据包与ARP协议报文进行对号入座都一一对应上了
5.4.2 tcpdump对ARP应答解析的解读
20:36:28.521017 00:0c:29:ba:f0:0d > 00:0c:29:83:72:68, ethertype ARP (0x0806), length 60: Reply 192.168.0.154 is-at 00:0c:29:ba:f0:0d, length 46
0x0000: 000c 2983 7268 000c 29ba f00d 0806 0001 ..).rh..).......
0x0010: 0800 0604 0002 000c 29ba f00d c0a8 009a ........).......
0x0020: 000c 2983 7268 c0a8 009b 0000 0000 0000 ..).rh..........
0x0030: 0000 0000 0000 0000 0000 0000 ............
20:36:28.521017:抓包时的时间戳
(1)站在数据链路层对以太网帧进行数据分析
00:0c:29:ba:f0:0d > 00:0c:29:83:72:68, ethertype ARP (0x0806), length 60
00:0c:29:ba:f0:0d > 00:0c:29:83:72:68: MAC地址为 00:0c:29:ba:f0:0d 的主机发送给 MAC地址为 00:0c:29:83:72:68 主机的帧,00:0c:29:ba:f0:0d:以太网源MAC地址(即主机 192.168.0.154 的MAC地址);00:0c:29:83:72:68:以太网目的MAC地址(即主机 192.168.0.155 的MAC地址)
ethertype ARP (0x0806):以太网帧类型,2个字节,ARP应答的值为:0x0806
length 60: 表示以太网帧的长度为 60 字节,实际上是 64 字节,tcpdump没有统计以太网帧尾部4字节的CRC字段。60字节的组成:以太网头部14字节(目的MAC地址 6 字节 + 源MAC地址 6 字节 + 帧类型 2字节)+ ARP 请求协议报文28字节+18字节PAD
(2)站在网络层对ARP请求包进行数据分析
Reply 192.168.0.154 is-at 00:0c:29:ba:f0:0d, length 46
Reply: 表示这是一个 ARP 应答包
192.168.0.154 is-at 00:0c:29:ba:f0:0d: IP 地址 192.168.0.154 的MAC地址为:00:0c:29:ba:f0:0d
length 46: 表示ARP应答分用到网络层有 46 字节(ARP 协议报文格式的28字节+ 18字节PAD)
(3)分析ARP应答以太网数据帧
0x0000: 000c 2983 7268 000c 29ba f00d 0806 0001 ..).rh..).......
0x0010: 0800 0604 0002 000c 29ba f00d c0a8 009a ........).......
0x0020: 000c 2983 7268 c0a8 009b 0000 0000 0000 ..).rh..........
0x0030: 0000 0000 0000 0000 0000 0000 ............
现在我们用 ARP应答数据帧与ARP请求以太网帧报文格式进行对号入座分析:
以太网首部
0x000c 2983 7268: 对应的是以太网目的MAC地址的6字节,目的主机是 192.168.0.155,它的MAC地址就是 00:0c:29:83:72:68
0x000c 29ba f00d: 对应的是以太网源MAC地址的6字节,发送方是主机192.168.0.154,它的MAC地址就是 00:0c:29:ba:f0:0d
0x0806: 对应的是帧类型的2字节,因为是ARP应答帧,它的值是 0x0806
ARP协议报文
0x0001: 对应的是硬件类型的2字节,表示物理地址的类型,对于以太网 MAC 地址,值为:0x0001
0x0800: 对应的是协议类型的2字节,表示发送方要映射的协议地址类型,对于 IP 地址,值为:0x0800
0x0604: 高8位对应的是硬件地址长度1字节,以太网 MAC 地址,占用 6 个字节,所以值为:0x06
低8位对应的是协议地址长度1字节,IPv4,占用 4 字节,所以值为:0x04
0x0002: 对应的是操作2字节,4种操作类型:ARP 请求,值为:0x0001;ARP 应答,值为:0x0002;RARP 请求,值为:0x0003;RARP 应答,值为:0x0004。我们这个是ARP请求包,所以,值为:0x0002
0x000c 29ba f00d: 对应的是源MAC地址6字节,即发送方MAC地址,应答数据报的发送方是主机 192.168.0.154,它的MAC地址就是:00:0c:29:ba:f0:0d
0xc0a8 009a:对应的是源IP地址4字节,即发送方的IP地址,应答数据报的发送方是主机 192.168.0.154,点分十进制转换成点分十六进制表示就是:0xc0.a8.0.9a
0x000c 2983 7268: 对应的是目的MAC地址6字节,即接收方MAC地址,我们的接收方是主机 192.168.0.155,它的MAC地址就是:00:0c:29:83:72:68
0xc0a8 009b: 对应的是目的IP地址4字节,即接收方IP地址,我们的接收方是主机 192.168.0.155,点分十进制转换成点分十六进制表示就是:0xc0.a8.0.9b
0x0000 0000 0000 0000 0000 0000 0000 0000 0000: 18字节PAD
至此,ARP 应答数据包与ARP协议报文进行对号入座都一一对应上了