地址解析协议(ARP)

干你娘啦ARP,不学行不行啊,老师。

Posted by i9u on December 16, 2020

前言

最近工作找得不太如意,要么被嫌弃没学历,要么被嫌弃项目经验少。

ARP这操蛋实际上在工作环境是肯定会碰到的,无论是排错还是日常运维过程中,你都会经常查看一个叫ARP表的玩意(还有一个叫Mac address-table)。几乎所有设备都有它的ARP表,可想而知ARP是多么的被广泛利用。如果你抱有想着能不能随便应付学下就算了的想法,我劝你还是回头是岸。

ARP的用途

ARP主要的功能是为提供使用IPv4通讯的时候充填Mac地址用的,因为我们在通讯的前提上,封装的数据报头有个字段是“目的Mac地址”,如何得知目的设备的Mac地址?那就是通过使用ARP对目的IPv4的Mac地址进行解析。

顺便一提,ARP这玩意估计各位网络工程师都要年纪大。在1982年的RFC 826上就被提出,但是在IPv6中却被ND(Neighbor Discover)代替了,所以说IPv6下没有ARP这玩意。

根据ARP本身的功能,有衍生出很多不同种类的ARP:

  • Proxy(代理)ARP
  • Gratuitous(免费)ARP
  • Reverse(翻转)ARP
  • Inverse(逆向)ARP

但是无论如何,ARP的工作都是为了查询IP地址到Mac地址的映射关系,不然在报文的封装过程中的Mac地址会不知道填什么。

ARP工作原理

ARP的基本工作原理很简单,它只有两种报文,一种是查询,另一种就是回复。比如我们在使用Ping的时候,由于指定了目的的IP地址,这时候就会需要ARP去查询目的IP地址的Mac地址到底是多少,不然无法完成数据包的充填。收到了目的IP回复过来的ARP报文,知道了Mac地址后就可以正常通信了。

image-20201216170221289

首次充填进ARP报文的MAC地址是全F(FFFF:FFFF:FFF)意为广播,只有这样才能使整个广播域内的机器都收到。

image-20201216170556173

通过抓包来实际看看它的报文交换过程:

image-20201216170840777

仔细看数据包No.18,它就是询问100.1.1.3(R3)的Mac是多少,发送者是100.1.1.1(R1)

No.19则是R3收到了查询报文后,给R1发回Reply报文,告知它R3的MAC地址是多少。然后就是一些Ping报的交互过程,你会发现它的确是先经过了ARP才能使用Ping。

ARP表

前面说过几乎所有设备都有ARP,所以根据上面的拓扑图,我们来看看R3设备上的ARP表:

使用命令:show arp 或者 show ip arp ,可以查看Cisco 设备上的ARP表

image-20201216171941698

在默认的情况下,所有设备都只知道自己接口的一些ARP信息,并且会定期清空表格而删掉一些多余的ARP信息。并且会将收到的ARP Request中的一些信息手机起来,形成ARP表,比如源Mac地址、源IP、入接口。

由于ARP几乎是空的,这时候如果进行Ping报处理,头两个报会被超时,那是因为要先进行ARP查询过程。

image-20201216172439482

上图我在R3进行了两次Ping包,留意第一个红框,就是要需要先进行ARP查询而导致的丢包,而第二个红框则没有这种情况,因为我们的ARP表里已经有了关于R1的MAC地址。

ARP的其他种类

Proxy ARP

代理(Proxy)APR功能是在无配置网关的情况下帮助PC正常访问网络。简单的工作原理就是不管你访问什么网站,作为开启了代理ARP的网关都帮回应它的接口MAC地址给你,以便你能正常使用 ,下文我会将它统称免费ARP或者Proxy ARP。

在无配置网关的情况下

比如,当电脑不配置网关的情况下访问R1,由于ARP这种广播报文会被路由器端口隔离掉,使R1无法正常回应,这时候开启ARP Proxy的网关会代它回复自己的接口Mac给PC。

image-20201217143641018

实际操作中,让我们分别对R1、R2发起Ping包,看看R3作为开启ARP proxy的网关是否都会用相同的MAC来Reply给PC:

image-20201217144117276

先查看下R3 E0/1的Mac地址,aabb.cc00.0510

image-20201217144524639

使用抓包工具,查看下R3回应的网关是:…!?没错,通过查看PC的ARP发现无论PC问R1还是R2的MAC地址,R3都统一用自己的接口Mac地址回应了给PC

image-20201217144413303

image-20201217162450962

如果这时候使用手动的方法把ARP表清空,你会发现清空后似乎没有生效,没关系,其实已经生效了,那是因为清空时设备还再对表象里的IP进行一轮ARP查询,如果有回应mac还是会在ARP table里面。

在有配置网关的情况下

如图:

image-20201217151018289

在有网关的情况下,PC直接Ping的流程动作:

1.由于有网关,所以直接充填网关的MAC地址作为目的MAC,所以要先询问网关的MAC地址。

2.网关回应后,收到Ping包,是PC要访问R1和R2。

3.R3由于不知道R1和R2他们的目的MAC,这时候轮到R3对这两台设备发出ARP Request

4.这两台设备由于在同一个广播域,收到后发出Reply告知R3。

5.R3有了关于这两台设备的Mac地址后,就可以正常通讯了。

我们在来通过抓包验证下:

这里由于我清了两次ARP表,请不要介意。

NO.7的报文是PC配置完IP地址后会自动发出的免费ARP报文(后面会提到详细)NO.8是PC发出的ARP Request 报文,询问网关的MAC地址,NO.9则是网关发回的Reply报文,那么这张截图要验证了上面的流程动作1。

然后当我们从PC发出Ping报,分别去往R1和R2:

image-20201217160919265

image-20201217161002220

这时候R3收到了去往R1和R2的报文后,由于不知道它们两的MAC地址,也需要发出Request去询问,R1和R2收到后回复Reply。完成了这些动作之后,才能帮PC传递Ping报。

所以,在有网关的情况下,代理ARP不会生效,并且有效减少PC上的ARP表项,这时候无论访问什么网站统一使用网关的MAC作为目的MAC充填发出,查看PC的ARP表,会看到只有网关的ARP信息。

image-20201217162611154

在没配置代理ARP和网关的情况

最后我们来看看如果同时没有开启代理ARP和PC没有配置网关的情况:

关闭R3的E0/0 代理ARP功能:

image-20201217162848824

删除PC的网关配置:

image-20201217162944789

这时候我们进行对R1和R2的Ping动作:

image-20201217163217020

image-20201217163207605

我们会通过对R3的E0/1口抓包会发现收到来之PC的ARP Request,内容是对的上Ping动作的目的地址(R1和R2),但是由于没有配置网关和代理ARP,这个情况下就会没人回应导致无法访问。

Gratuitous ARP

当设备有设备一旦入网后,就会发送免费ARP来宣告自己对IP的拥有权,其他设备收到后若有相同的IP 这时候就会发生IP冲突。也就是说Gratuitous(免费)ARP的主要用途是用来宣告自己的IP的主权已经提醒管理员IP冲突,下文我会统称为免费ARP或者Gratuitous ARP。

我们把R1和R2的IP地址配成一样,然后抓个包来看看:

image-20201217170730086

会发现两台设备都会不停的发送免费(Gratuitous)ARP来宣告自己对这个IP的所有权,但是同时R2发出的时候会提示有重复地址,这时候如在R3上查看ARP表:

image-20201217171621934

可以发现到ARP表不停在被刷新,那是因为R1\R2\R3在同一个广播域内,而R1\R2又不停的宣告自己对这个IP的主权,所以才会导致R3上关于100.1.1.1这条ARP的MAC地址不停的变化。

当然R1和R2也会收到互相发送的免费ARP,这个时候就它们就会知道网络中发生了IP冲突,如果是在思科的路由其中,会弹出报错:

image-20201221153847156

所以免费ARP的其中一个很重要的用法就是通告自己对某个IP的主权,以及检测IP冲突。

如果在DHCP的环境下, 除了有免费(Gratuitous)ARP还有探针( Probe)ARP。Probe ARP和免费ARP的区别是免费ARP是用来宣告IP的主权并且让局域网内的设备刷新ARP条目,而Probe ARP是为了防止IP冲突(不是检测)。

R3和PC之间进行DHCP交换,并且抓包:

N0.3 Probe ARP

查看No.3的ARP报文,它就是Probe ARP:

image-20201221155544221

Probe ARP和免费ARP的分别在于它的Sender IP address是0.0.0.0,那是因为这个时候它还不敢宣城自己拥有了某个IP,因为它不确定这个网络内是否有其他人在用。

最后我们可以总结一下,免费ARP是检测IP冲突和刷新ARP表用的,而Probe(探针) ARP是防止IP冲突检测用的,它可以在DHCP的环境下比免费ARP更快进行IP冲突检测,防止因为冲突而刷新了ARP表。

Reverse ARP

Reverse ARP 的Reverse 意为反向/逆向,常规的ARP是通过询问IP地址获取到关联的Mac地址,Reverse ARP则相反,使用Mac地址来获取IP地址,下文我统称为RARP或者反向ARP。

它的工作原理如图,其实功能就是根据MAC地址分配IP,和DHCP像:

image-20201221163133033

但是它却有不少弊端,比如:

  1. 需要提前做好绑定信息
  2. 每个网段都需要有RARP分配服务器
  3. 不分配DNS和网关

后面改进,开发出了BOOTP协议,能在基础上分配网关了。

image-20201221163243962

但是依然需要提前配置好绑定信息,超废材。

再后来的后来,我们在这两的基础上开发出了DHCP协议,实现了动态的分配地址,不在需要提前配绑定信息,同时因为有DHCP中继的存在,也不必在每个网段中都建立RARP服务器,实现了统一管理。

因为现网很少碰到,这里就不抓包分析了。

Inverse ARP

这个是用在帧中继环境中,Inverse 可以翻译成逆向,和上面的RARP的译名有点像,但是却完全是两回事。Inverse ARP是用来实现DLCI到IP的映射关系。

这玩意和RARP一样,都是很少见的玩意,这里也不提了,先匿了。

ARP安全

由于ARP是服务于上层的底层协议,本身不带有任何安全机制,也不可能带有,所以它很容易被利用成攻击手段,下面来继续说下ARP的攻击行为和安全加固方法。

ARP欺诈攻击

首先说明正常的交互过程:

image-20201221173724367

如果R1是作为攻击者,那么它的攻击行为可以简单的说成一下:

R3收到了另一份ARP Reply后,会优先选择最新的ARP信息,接收到后更新自己的ARP表象。当然在ARP表超时后R2也会发出正确的ARP报文来更新,但是只要作为攻击者的R1持续的发出错误的ARP Reply就肯定能覆盖掉R2的,这种行为就是ARP攻击,或者叫ARP欺诈。

image-20201222152747400

转发设备SW收到了ARP后,将Mac地址和接口关联起来并记录在自己的CAM表里面,错误地以为去往R2也是通过e0/0口。

这里,我们根据数据封装的规则,若R3要访问R2首先里面封装R2的IP地址,然后外面封装错误的R-Mac地址并发出。交换机收到后根据封装的Mac地址对CAM表进行查表转发,由于是封装了R1的Mac地址,结果会导致错误的发送到了R1。

这种结果导致流量被R1从中截取了,所以也叫中间者攻击,通过这个手段可以:

  1. 局域网内抓取他人的明文传输信息,比如HTTP、Telnet的流量,再从中挖掘有用的信息。
  2. 不停地ARP Reply错误的Mac地址,可以使被攻击者无法上网。

ARP泛洪攻击

ARP泛洪攻击也可以说是Dos攻击,由于一般的设备对于ARP表有预留表空间,并且处理ARP表也需要消耗CPU资源。攻击者只要发送大量的伪造源IP地址的ARP报文,使设备将表空间和设备性能耗光,从而中断网络。

另外交换机学习记录Mac地址和接口地址的CAM表也是需要使用CPU资源的,如果遭受ARP泛红功能或者广播风暴,会导致CAM表爆掉同时CPU性能耗尽,从而使局域网无法通信。

防ARP欺诈攻击

1.DAI(动态ARP检测)

DAI基于DHCP Snooping建立的MAC与IP地址的绑定关系来验证ARP数据包的合法性,如果是静态配置IP的主机,DAI可以使用ARP ACL来验证ARP数据包。它可以阻止攻击者发送伪造源IP的ARP Request或Reply包,拦截后验证会生成日志,通过日志定位问题源。

DAI依赖DHCP Snooping,所以要先开启DHCP Snooping才能使用DAI。

思科特权模式下配置,以交换机VALN 10作为下联 ,E0/0为上联为示例:

Switch(config)#ip dhcp snooping
Switch(config)#ip dhcp snooping vlan 10
Switch(config)#ip arp inspection vlan 10
Switch(config)#ip dhcp snooping
Switch(config)#inter e0/0
Switch(config-if)#ip arp snooping trust
Switch(config-if)#ip arp inspection trust
2.网关定期发送免费ARP

华为设备可以在网关上开启定时的免费ARP发送功能,定期更新ARP表,使用户的ARP表中的网关不会错误。

配置方法:

全局下定时间隔100秒发送一次免费ARP

[Quidway] arp gratuitous-arp send enable
[Quidway] arp gratuitous-arp send interval 100

接口下定时间隔100秒发送一次免费ARP

[Quidway] interface vlanif 10
[Quidway-Vlanif10] arp anti-attack gratuitous-arp drop
[Quidway-Vlanif10] arp gratuitous-arp send interval 100

防ARP泛洪攻击

1.ARP 限速

限制设备在全局、VLAN、接口下的ARP数量

华为配置方法(思科的找不到)

全局限制每秒发送的ARP为200个:

[Quidway] arp anti-attack rate-limit enable
[Quidway] arp anti-attack rate-limit 200

VLAN100内限制每秒ARP为200个:

[Quidway] vlan 100
[Quidway-vlan100] arp anti-attack rate-limit enable
[Quidway-vlan100] arp anti-attack rate-limit 200

配置接口 GE1/0/1在10秒内最多200个ARP通过,超过后60秒内持续丢弃该接口下的ARP报文

[Quidway] interface gigabitethernet1/0/1
[Quidway-GigabitEthernet1/0/1] arp anti-attack rate-limit enable
[Quidway-GigabitEthernet1/0/1] arp anti-attack rate-limit 200 10 block timer 60
2.ARP Miss 限速

如果网络中有用户向设备发送大量目标 IP 地址不能解析的 IP 报文(即路由表中存在该IP 报文的目的 IP 对应的路由表项,但设备上没有该路由表项中下一跳对应的 ARP 表项),将导致设备触发大量的 ARP Miss 消息。这种触发 ARP Miss 消息的 IP 报文会被上送到主控板进行处理,设备会根据 ARP Miss 消息生成和下发大量临时 ARP 表项并向目的网段发送大量 ARP 请求报文,这样就增加了 CPU 的负担,同时加重了目的网段的负担。

可针对全局、VLAN 和接口的 ARP Miss 消息限速

全局限制每秒发送的ARP Miss为200个:

[Quidway] arp-miss anti-attack rate-limit enable
[Quidway] arp-miss anti-attack rate-limit 200

VLAN100内限制每秒ARP为200个:

[Quidway] vlan 100
[Quidway-vlan100] arp-miss anti-attack rate-limit enable
[Quidway-vlan100] arp-miss anti-attack rate-limit 200

配置设备在 10 秒钟内最多允许处理 200 个从接口 GE1/0/1 上送的 IP 报文 触发的 ARP Miss 消息。

[Quidway] interface gigabitethernet1/0/1
[Quidway-GigabitEthernet1/0/1] arp-miss anti-attack rate-limit enable
[Quidway-GigabitEthernet1/0/1] arp-miss anti-attack rate-limit 200 10
3.免费 ARP 主动丢弃

华为

可以使用如下命令使能免费 ARP 报文主动丢弃功能:

全局使能免费 ARP 报文主动丢弃功能。

[Quidway] arp anti-attack gratuitous-arp drop 

在接口 VLANIF10 下使能免费 ARP 报文主动丢弃功能。

 [Quidway] interface vlanif 10 [Quidway-Vlanif10] arp anti-attack gratuitous-arp drop

思科

丢弃所有免费ARP 报文

Switch(config)#ip arp gratuitous none 

只允许本地子网的免费ARP通过

Switch(config)#ip arp gratuitous local