ARP协议与报文(学习笔记)

一、什么是ARP协议

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;

最直白的说法是:在IP以太网中,当一个上层协议要发包时,有了该节点的IP地址,ARP就能提供该节点的MAC地址。

二、 ARP协议工作原理

1. 在同一个网段的情况

假设主机A和B在同一个网段,主机A要向主机B发送信息,具体的地址解析过程如下:

  1. 主机A首先查看自己的ARP缓存表,确定其中是否包含有主机B对应的ARP表项。如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,并将数据包发送给主机B。

  2. 如果主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。

  1. 主机B比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。

  2. 主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。

2. 在不同网段的情况

当主机A和主机B不在同一网段时,主机A就会先向网关发出ARP请求,ARP请求报文中的目标IP地址为网关的IP地址。当主机A从收到的响应报文中获得网关的MAC地址后,将报文封装并发给网关。如果网关没有主机B的ARP表项,网关会广播ARP请求,目标IP地址为主机B的IP地址,当网关从收到的响应报文中获得主机B的MAC地址后,就可以将报文发给主机B;如果网关已经有主机B的ARP表项,网关直接把报文发给主机B。

那么,主机A是怎么事先知道主机B和自己不在同一个网段呢?一开始我自行思考,以为是主机A在自己网段内进行ARP请求无果后才知道目标主机和自己并不在同一个网段,后来经过查阅资料,发现其实它还有更加聪明的手段。

通常,局域网内的主机可以通过检查其子网掩码和目标主机的IP地址来判断目标主机是否在同一个子网内。子网掩码定义了一个IP地址的网络部分和主机部分,如果两个主机的IP地址与子网掩码相与的结果相同,它们就在同一个子网内。如果不同,它们就在不同的子网内。

(注意,这里需要提前了解IP地址的划分方式等知识)

如果在不同的子网内,主机A将目标主机B的IP地址设置为下一跳的目标,并使用ARP请求获取连接到主机A子网的路由器的MAC地址。然后,它将数据帧发送到路由器,由路由器转发到目标主机B所在的子网。

注意:总而言之,ARP协议不能跨网段使用,在跨网段通信的过程中,主机通常只能获取链路中的下一跳节点的MAC地址,而无法直接获取到目标主机的MAC地址。

三、ARP缓存表和TTL

1. ARP表

网络设备一般都有一个ARP缓存(ARP Cache),ARP缓存用来存放IP地址和MAC地址的关联信息。在发送数据前,设备会先查找ARP缓存表。如果缓存表中存在对方设备的MAC地址,则直接采用该MAC地址来封装帧,然后将帧发送出去。如果缓存表中不存在相应的信息,则通过发送ARP request报文来获得它。学习到的IP地址和MAC地址的映射关系会被放入ARP缓存表中存放一段时间。在有效期内,设备可以直接从这个表中查找目的MAC地址来进行数据封装,而无需进行ARP查询。过了这段有效期,ARP表现会被自动删除。如果目标设备位于其他网络则源设备会在ARP缓存表中查找网关的MAC地址,然后将数据发送给网关,网关再把数据转发给目的设备。

2. ARP表项又分为动态ARP表项和静态ARP表项。

动态ARP表项

动态ARP表项由ARP协议通过ARP报文自动生成和维护,可以被老化,可以被新的ARP报文更新,可以被静态ARP表项覆盖。每个动态ARP缓存项的潜在生命周期是10分钟。新加到缓存中的项目带有时间戳,如果某个项目添加后2分钟内没有再使用,则此项目过期并从ARP缓存中删除;如果某个项目已在使用,则又收到2分钟的生命周期;如果某个项目始终在使用,则会另外收到2分钟的生命周期,一直到10分钟的最长生命周期。

静态ARP表项

静态ARP表项通过手工配置和维护,不会被老化,不会被动态ARP表项覆盖。直到重新启动计算机为止。

配置静态ARP表项可以增加通信的安全性。静态ARP表项可以限制和指定IP地址的设备通信时只使用指定的MAC地址,此时攻击报文无法修改此表项的IP地址和MAC地址的映射关系,从而保护了本设备和指定设备间的正常通信。

静态ARP表项分为短静态ARP表项和长静态ARP表项。

在配置长静态ARP表项时,除了配置IP地址和MAC地址项外,还必须配置该ARP表项所在VLAN和出接口。长静态ARP表项可以直接用于报文转发。
在配置短静态ARP表项时,只需要配置IP地址和MAC地址项。如果出接口是三层以太网接口,短静态ARP表项可以直接用于报文转发;如果出接口是VLAN虚接口,短静态ARP表项不能直接用于报文转发,当要发送IP数据包时,先发送ARP请求报文,如果收到的响应报文中的源IP地址和源MAC地址与所配置的IP地址和MAC地址相同,则将接收ARP响应报文的接口加入该静态ARP表项中,之后就可以用于IP数据包的转发。
一般情况下,ARP动态执行并自动寻求IP地址到以太网MAC地址的解析,无需管理员的介入。

当希望设备和指定用户只能使用某个固定的IP地址和MAC地址通信时,可以配置短静态ARP表项,当进一步希望限定这个用户只在某VLAN内的某个特定接口上连接时就可以配置长静态ARP表项。

四、ARP报文格式

ARP 报文总长度为 28 字节,MAC 地址长度为 6 字节,IP 地址长度为 4 字节。


1. 相关字段的含义:

·硬件类型:指明了发送方想知道的硬件接口类型,以太网的值为 1。
·协议类型:表示要映射的协议地址类型。它的值为 0x0800,表示 IPv4 地址。
·发送方硬件地址:指示ARP请求或响应的发送设备的物理MAC地址。
·发送方协议地址:指示ARP请求或响应的发送设备的协议地址,如IPv4地址
·操作类型:用来表示这个报文的类型,ARP 请求为 1,ARP 响应为 2,RARP 请求为 3,RARP 响应为 4。
·发送方 MAC 地址:发送方设备的硬件地址。
·发送方 IP 地址:发送方设备的 IP 地址。
·目标 MAC 地址:接收方设备的硬件地址。
·目标 IP 地址:接收方设备的IP地址。

ARP 数据包分为请求包和响应包,对应报文中的某些字段值也有所不同。

ARP 请求包报文的操作类型(op)字段的值为 request(1),目标 MAC 地址字段的值为 Target 00:00:00_00:00:00(00:00:00:00:00:00)(广播地址)。

ARP 响应包报文中操作类型(op)字段的值为 reply(2),目标 MAC 地址字段的值为目标主机的硬件地址。

2. 实战解析

1. 请求报文

这里的请求包是网关向我的设备发送的,并且我在实践中发现其ARP高速缓存表的更新速度很快,在10—20秒之间,因为当我的设备在连接网络时,能频繁抓到其给我发送的ARP请求。

细心的读者会发现,这里的Target MAC address为0地址,但是在MAC地址中,全1地址才是广播地址,这是否是自相矛盾了呢?

两个地方的目的 mac 地址恰好相反,看似对立,其实是统一的:arp 请求是为了确定目标主机的 mac 地址才发的,此时还不知道这个地址,所以在 arp 请求报文中,目的 mac 地址字段自然而然就“留空”,也就是全 0(这个字段只有在 arp 响应报文中才有值);为了确定目标主机的 mac 地址,需要向局域网内所有主机进行询问,所以在以太网那一层,要把目的 mac 地址填成全 1,表示它是一个广播帧,这样才能让局域网内的所有主机接收到这个 arp 请求。

2. 响应报文

这就是我的主机对上面那条请求报文的响应,这里就可以看到其发送给路由器的本机MAC地址和路由器的IP地址与接口MAC地址。

3. 免费ARP报文

免费 ARP(Gratuitous ARP)包是一种特殊的ARP请求,它并非期待得到IP对应的 MAC 地址,而是当主机启动的时候,发送一个 Gratuitous ARP请求,即请求自己的IP地址的MAC地址。

免费ARP报文与普通ARP请求报文的区别在于报文中的目标IP地址。普通ARP报文中的目标IP地址是其他主机的IP地址;而免费ARP的请求报文中,目标IP地址是自己的IP地址。

免费 ARP 数据包有以下 3 个作用。
  1. 该类型报文起到一个宣告作用。它以广播的形式将数据包发送出去,不需要得到回应,只为了告诉其他计算机自己的IP地址和MAC地址。

  2. 可用于检测IP地址冲突。当一台主机发送了免费ARP请求报文后,如果收到了ARP响应报文,则说明网络内已经存在使用该IP地址的主机。

  3. 可用于更新其他主机的ARP缓存表。如果该主机更换了网卡,而其他主机的ARP缓存表仍然保留着原来的MAC地址。这时,可以发送免费的 ARP数据包。其他主机收到该数据包后,将更新ARP缓存表,将原来的 MAC地址替换为新的MAC地址。

  4. 查看与修改ARP高速缓存表
    这一节其实并不属于ARP报文格式,但是在研究ARP报文格式的过程中需要配合使用命令窗口来进行,因此将这一节与个人经验放在这里。

以Win11为例,可以在命令窗口执行一些指令:
arp/? 查看arp命令的有关帮助
arp -a 列出当前主机上的各网络适配器的arp高速缓存表
arp -d * 清除当前主机里的ARP高速缓存表(需要管理员权限)
arp -s IP MAC 手动设置静态IP-MAC映射关系(需要管理员权限)

补充拓展:利用上述的方式,我进一步探究了主机与路由之间的关系。在前面的第二部分第二小节中我提到一个问题,就是不同网段之间通信时,主机可以通过电子掩码来区分得知目标是否在不同网段。

个人实验如下:

猜想:现在假如主机A要与主机B进行不同网段的通信,它首先通过掩码得知B在不同网段,因此A需要把数据包的下一跳地址设置为路由的IP地址,同时标注上路由的MAC地址,假如我删去主机上高速缓存表中的路由IP-MAC对应关系,然后再让A向B发送数据包,那么A是否会向路由发送ARP请求来获取它的MAC地址呢?

其实,答案是会的。网络中的每一台主机联网都需要与路由进行通信,因此获取路由的MAC地址是必然的。

实验:
在主机上提前打开抓包工具(由于主机上可能存在许多应用与路由之间有频繁的数据传输,如果不提前打开抓包工具,主机的ARP高速缓存表可能很快就会刷新并添加上与路由的映射关系,这样会导致抓不到我们想要的ARP包),设置抓取ARP包,然后在命令窗口敲入arp -d 路由IP删除这条映射,刷新一下某个网站,果然,在所有的ARP包中,前面两条就是主机与路由器之间的ARP通信,这也证实了上面的猜想。

五、 RARP协议

1. 基本概念

反向地址转换协议,即RARP(Reverse Address Resolution Protocol)。 反向地址转换协议(RARP)允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。网络管理员在局域网的网关路由器里创建一个表以映射物理地址(MAC)和与其对应的 IP 地址。当设置一台新的机器时,其 RARP 客户机程序需要向路由器上的 RARP 服务器请求相应的 IP 地址。假设在路由表中已经设置了一个记录,RARP 服务器将会返回 IP 地址给机器,此机器就会存储起来以便日后使用。 RARP 可以使用于以太网、光纤分布式数据接口及令牌环 LAN等。

2. 产生原因

ARP(地址解析协议)是设备通过自己知道的IP地址来获得自己不知道的物理地址的协议。假如一个设备不知道它自己的IP地址,但是知道自己的物理地址,网络上的无盘工作站就是这种情况,设备知道的只是网络接口卡上的物理地址。这种情况下应该怎么办呢?RARP(逆地址解析协议)正是针对这种情况的一种协议。

RARP以与ARP相反的方式工作。RARP发出要反向解析的物理地址并希望返回其对应的IP地址,应答包括由能够提供所需信息的RARP服务器发出的IP地址。虽然发送方发出的是广播信息,RARP规定只有RARP服务器能产生应答。许多网络指定多个RARP服务器,这样做既是为了平衡负载也是为了作为出现问题时的备份。

3. 基本原理

  1. 源主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址。

  2. 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址。

  3. 如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用。

  4. 如果不存在,RARP服务器对此不做任何的响应。

  5. 源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。

六、 ARP欺骗与ARP攻击

由于ARP协议没有任何安全验证,因此很容易产生ARP欺骗。

1. 原理阐述:

  1. 主机A要和主机C通信,主机A发出ARP包询问谁是192.168.1.3?请回复192.168.1.1。
  2. 这时主机B在疯狂的向主机A回复,我是192.168.1.3,我的地址是0A-11-22-33-44-02。
  3. 由于ARP协议不会验证回复者的身份,造成主机A错误的将192.168.1.3的MAC映射为0A-11-22-33-44-02。

2. 分类

  1. 主机欺骗:欺骗对象为主机。
  2. 网关欺骗:欺骗对象为网关,可以获得其他主机的进流量。

3. ARP攻击及危害

攻击机常大量发送伪造的ARP相应包来试图更改靶机的ARP高速缓存表中的IP-MAC对应关系,从而导致靶机的通信瘫痪,还能劫持局域网中其他主机或网关的流量,获取敏感信息等。

也因此有一种单播ARP请求模式来对抗:

这是在查阅资料时看到的案例:

主机在ARP老化时间内多次发送单播(即目标地址明确)的ARP请求,这个时候ARP报文的发送,作用在于确认对端是否还在线,而不是要去寻找对端的MAC地址。所以可以直接指定MAC地址以及ip地址,如果对端在线,那么本端则刷新ARP缓存,同时也能减小被ARP欺骗的可能。

尽管如此,ARP欺骗仍然存在可能性,不过应对的措施仍然不在少数:

最理想的防制方法是网上内的每台计算机的ARP一律改用静态的方式,不过这在大型的网上是不可行的,因为需要经常更新每台计算机的ARP表。

另外一种方法,例如DHCP snooping,网上设备可借由DHCP保留网络上各计算机的MAC地址,在伪造的ARP数据包发出时即可侦测到。此方式已在一些厂牌的网上设备产品所支持。

有一些软件可监听网络上的ARP回应,若侦测出有不正常变动时可发送邮箱通知管理者。例如UNIX平台的Arpwatch以及Windows上的XArp v2或一些网上设备的Dynamic ARP inspection功能。

至于实现ARP攻击具体操作,将在以后学习。(主要是懒)

posted @ 2024-01-30 00:56  wyuu101  阅读(734)  评论(0编辑  收藏  举报