一.ARP协议简介
ARP,全称Address Resolution Protocol,中文名为地址解析协议,它工作在数据链路层,在本层和硬件接口联系,同时对上层提供服务。
IP数据包常通过以太网发送,以太网设备并不识别32位IP地址,它们是以48位以太网地址传输以太网数据包。因此,必须把IP目的地址转换成以太网目的地址。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。ARP协议用于将网络中的IP地址解析为的硬件地址(MAC地址),以保证通信的顺利进行。
ARP的报头结构,如图1所示。
硬件类型 | 协议类型 | |
硬件地址长度 | 协议长度 | 操作类型 |
发送方的硬件地址(0-3字节) | ||
源物理地址(4-5字节) | 源IP地址(0-1字节) | |
源IP地址(2-3字节) | 目标硬件地址(0-1字节) | |
目标硬件地址(2-5字节) | ||
目标IP地址(0-3字节) |
(图1 ARP/RARP报头结构)
- 硬件类型字段指明了发送方想知道的硬件接口类型,以太网的值为1;
- 协议类型字段指明了发送方提供的高层协议类型,IP为0800(16进制);
- 硬件地址长度和协议长度指明了硬件地址和高层协议地址的长度,这样ARP报文就可以在任意硬件和任意协议的网络中使用;
- 操作字段用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4;
- 发送方的硬件地址(0-3字节):源主机硬件地址的前3个字节;
- 发送方的硬件地址(4-5字节):源主机硬件地址的后3个字节;
- 发送方IP(0-1字节):源主机硬件地址的前2个字节;
- 发送方IP(2-3字节):源主机硬件地址的后2个字节;
- 目的硬件地址(0-1字节):目的主机硬件地址的前2个字节;
- 目的硬件地址(2-5字节):目的主机硬件地址的后4个字节;
- 目的IP(0-3字节):目的主机的IP地址。
二. ARP欺骗
2.1 欺骗
ARP自动学习的目的,就是通讯的双方主机互相请求/告知MAC地址,并以此完成二层的以太网帧交换,由于通讯的双向性,很显然如果任何一方的ARP信息是空或者错误的,那么通讯就会失败。而ARP欺骗的目的就是频繁的发送错误消息欺骗网络通信的任何一方,最终导致不能正常通信。
那么怎样防止ARP欺骗呢?从根本上说就是双方的IP-MAC地址对应信息要正确,之前我们说过,ARP是自动学习的,是通过ARP Request和Response报文的交互,由别人告知的,正是这个特性让ARP欺骗有了可乘之机,显然最有效的方法就是不采用“学习”机制,现在很多设备厂商都是这么实现的,但配置静态ARP工作量非常大,后期维护也极不方便,假设局域网内主机数量为N,那么最少要配置的ARP条目有N+(N-1)=2N-1个;如果N=200,也就是说最后总共要配置400条,这还不算原始IP、MAC地址信息的收集、校对和维护工作。如果要全网ARP绑定的话,总条目可达N(N-1),那就更惊人了。
是否可以避开静态ARP绑定这种烦琐的方式呢?对Windows主机是没有办法的;但我们可以从路由器、Layer 3 Switch上着手,要回答这个问题,首先要弄清ARP欺骗的具体过程,先看实验拓扑结构:
由于很难找到合适的病毒重现真正的ARP欺骗,我们采用安装聚生网管(也叫Netsense、P2P终结者)来模拟,其实现的基础就是进行ARP欺骗。
在这个环境中,使用路由器作为网关,进行NAT操作,内网中连接两个PC,其中一台安装聚生网管,进行ARP欺骗。开始时,PC的ARP表中192.168.1.6对应的MAC地址是正确的,然后启动聚生网管,来看看现象:
1、第一阶段,ARP Cheater会发送大量ARP Request来逐个扫描内网中的PC:
正常情况下局域网PC会回应ARP Request,ARP Cheater就是靠这个来确认并收集内网中已经启动的PC的,并在本地形成一个数据库。
2、第二阶段,Cheater就开始进行实质的欺骗了,其过程为就是向真实网关和PC同时发送免费ARP Response,强行更新其ARP Table。
其中,发送给PC的为:
显然,Cheater强行通告给PC的ARP内容是错误的,因为00-0D-60-8C-0D-C9和192.168.1.6分别是Cheater的MAC地址和路由器的网关IP。
其次,发给网关路由器的为:
在这个信息中,00-00-E2-58-AC-EA和192.168.1.158都是对应的普通PC,是一个正确的信息,Cheater代替PC向网关发送ARP强制更新信息,是为了确保通讯能够正常完成。
欺骗完成之后,局域网中的所有PC都根据错误的ARP信息把数据包发给ARP Cheater,Cheater再通过路由器转发到公网真正的服务器上;当数据包从公网返回到路由器之后,路由器会把数据包直接返回到PC,中间不再经过ARP Cheater(如果需要,也可以经过ARP Cheater),参阅前面的拓扑结构图。
这样,ARP欺骗就完成了,PC上面关于网关的ARP信息发生了改变;不过为了“巩固”成果,聚生网管每隔2秒再次进行欺骗。
当然,聚生网管不算是一种病毒、木马或者恶意程序,只是它利用了ARP欺骗,把所有的局域网所有的主机流量都导入的自己的网卡上,籍此,聚生网管就可以进行相应的过滤和限制了。
现在比较流行的窃取密码的木马程序就是按照这个原理来实现的,当然密码只是在用户登陆的时候才输入的,所以木马程序会故意让自己的网卡失效又立刻恢复,此时,内网的用户以为是网络质量不好掉线,接着就是重新登陆、输入密码……
上面两种情况虽然是ARP欺骗,但多数时间网络还是正常运行的;如果只是要让网络中断,那么ARP Cheater只需频繁发送免费ARP Response即可,当然里面包含的Sender Address是错误的。
2.2 如何应对ARP欺骗?
前面提到,ARP欺骗可能会欺骗网关路由器或者内网的PC,下面我们就分这两种情况来分析一下。
2.2.1 避免ARP欺骗PC
要找到应对方法,必须先识别出ARP欺骗的特点:
1、ARP欺骗发生时
无论出于什么目的, ARP欺骗最开始、也是最关键的一步就是通过免费ARP Response信息,发送错误的网关ARP信息给局域网主机,其方法不外乎两种:
在本网段首先发送大量的ARP Request扫描,通过Response报文收集当前活动的主机,随后给每个主机发送免费的ARP Response;在这种情况下,路由器只能看到从一个固定的MAC地址发出大量ARP请求广播,而且这个过程可能会周期性重复。
第二,ARP Cheater不需要逐个找局域网的主机IP,它直接冒充网关,通过免费ARP Response广播通告全网;在这种情况下,路由器上应该可以观察到免费ARP Response报文,其Sender Internet Addr信息就是自己的IP地址,而且从上面的实验中可以看到,这种免费ARP Response广播报文是非常频繁的。
无论是那种情况,其目的都是欺骗PC,路由器虽然可能通过某些特征判断ARP欺骗的发生,但是根本无法制止,因为路由器对该PC是没有控制权的。
2、ARP欺骗发生后
ARP欺骗发生后的情况是怎样呢?当然是PC的ARP表被篡改了,当然我们可以通过手工方式来清除ARP表项重新学习,但ARP欺骗是不断的重复进行的,人工维护的工作量恐怕远远大于前面说的“静态ARP”,显然可行性为零。
既然手工方式不行,那么自动方式怎么样呢?跟ARP Cheater一样,我们可以考虑让网关路由器或者其他专用主机来发送免费ARP广播,把正确的网关ARP信息通报给全网。如果网内的ARP欺骗不是很频繁,这种是方法可行;但如果象聚生网管这样的情况,ARP欺骗为每2秒一次,要让PC的ARP表正确,路由器或专用主机发送的免费ARP Response广播必须更频繁,即便如此,内网PC的ARP表可能还会处于频繁变动的过程中,导致其正常通讯也会随之而产生丢包情况,同时整个网络上会因此而充满大量的以太网广播,我想这事谁也不愿看到的。RG Router的内网口上 arp gratuitous interval xx 的配置实际上就是定期向网内发送 arp Response;
综上,可以得出结论,对于内网主机的ARP欺骗,作为路由器本身基本上是无能为力的,至少效果非常有限。所以在对付ARP欺骗的时候,PC还是乖乖的进行静态ARP绑定措施。比如在PC机上配置autoexec.bat批处理文件:
@echo off
Arp –d
Arp –s 192.168.1.1 00-d0-0f-23-44-89
使得在PC机上能够静态绑定网关的正确MAC地址,防止网关欺骗;
在RG 2126G交换机上可以采用在端口下,anti-arp-spoofing ip xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx是网关地址;RG 2126G将阻止源IP是本网段网关地址的报文从这个端口进入;达到防止该端口上连接的PC发出对其它PC进行网关欺骗的ARP Response、ARP Request报文;
2.2.2 避免ARP欺骗路由器
跟PC的情况不同,由于路由器、Layer 3 Switch是一款三层设备,几乎没有什么上层应用会跟内网主机直接通讯,所以它的ARP表项通常不是主动请求获得的,而是被动学习到的,比如收到ARP Request或者免费的ARP Response前者是正常情况,不在我们讨论范围之内;而后者就是ARP Cheater欺骗网关路由器的手段。
还是分为两个阶段来分析:
1、ARP欺骗发生时
通常情况下下,ARP Cheater是通过单播性质的免费ARP Response把错误的主机ARP信息强制通告路由器、Layer 3 Switch的,而且由于内网的主机数量众多,路由器、Layer 3 Switch每次会收到大量的免费ARP Response单播报文。它们的Sender Internet Addr分别是局域网的主机IP地址,但是Sender Hardware Addr却都是ARP Cheater的网卡MAC地址。
显然,路由器、Layer 3 Switch完全可以通过免费ARP Response报文的特征来确定欺骗是否发生,但当确定的同时,ARP欺骗的结果是已经造成了的。
2、ARP欺骗发生后
由于路由器、Layer 3 Switch的ARP表项是被动学习的,所以在ARP欺骗发生之后,路由器、Layer 3 Switch必须自己主动的去查询正确的ARP信息,方法恐怕只有一种:就是根据现有ARP表项中的IP地址列表,强制性的逐一发送ARP Request,通过对方的Response信息来更新校正自己的ARP Table。显然这个工作量是很大的。尤其是在ARP Cheater的欺骗非常频繁的时候,路由器、Layer 3 Switch的ARP“自我校正”机制显得太苍白无力了。
2.3 应对ARP欺骗的其他方法
从前面的分析来看,单纯的通过ARP机制本身来防止ARP欺骗,几乎是不可能完成的任务。那么还有什么方法来避免呢?
2.3.1 硬件角度
路由器毕竟是一种三层设备,对于ARP二层协议的支持和处理总是有限的;我们是否可以从局域网交换机来入手呢?
因为ARP发生之后的结果(错误的ARP信息)是存储在网关路由器和主机中的,跟交换机没有任何关系,所以要通过交换机来处理,重点就是一个字:“防”。从前面的分析来看,无论怎样欺骗,其关键的特征就是发送免费ARP Response报文,而且ARP字段的Sender信息与其自身MAC地址不相符合,如果二层以太网交换机能够进行ARP报文合法性的判断,那么就自然可以进行相应的屏蔽了;
这个技术看起来不是很难事先,但涉及到交换机ASIC芯片的支持和软件功能的增加,其可行性和性价比还需要考证;同时需要把宽带路由器和交换机作为一个整体推给使用者。现在锐利网络在网吧等宽带市场中的路由交换一体化解决方案就是基于这个原理的。
这种思路应该可以从源头上解决ARP欺骗的发生,但对于交换机的要求比较高,不仅是功能方面,还同时涉及到性能、稳定性和性价比等特性。
在RG 27、29系列交换机上就是从硬件架构上进行设计,使得交换机能够根据报文类型,比如对报文类型Type是0X0806的ARP报文会检查其Source IP和Source MAC,根据在该端口上绑定的IP地址与相应的MAC地址来将攻击者的欺骗性ARP Response过滤掉,从而达到从根源上防止了ARP Attacking的实现;
2.3.2 软件角度
单纯的利用ARP特性是解决不了ARP欺骗的问题的,那么在软件上还有什么出路呢?方法还是有的,可以看一下艾泰的解决方案:
既然ARP欺骗最终影响的是ARP表项的内容,而表中的内容又是动态学习的,所以ARP机制才不安全,那么我为何不摒弃ARP自动学习这种机制呢?当然我们说的不是进行手工静态ARP绑定。其具体处理方法是把ARP表项的相关信息放到NAT的表项中一起处理。
原来NAT表项中的主要内容有:NAT转换前源IP地址、转换前源TCP/UDP端口、转换后源IP地址、转换后TCP/UDP端口、目的IP地址、目的端口等6项信息,而转换前IP地址和MAC地址的对应关系是靠ARP的动态学习机制来实现的。
现在,NAT表项的内容调整为:NAT转换前源IP地址、转换前源MAC地址、转换前源TCP/UDP端口、转换后源IP地址、转换后TCP/UDP端口、目的IP地址、目的端口等7项信息。这个新增加的源MAC地址可以不作为NAT判断的依据,其作用是让数据包从公网一侧回到路由器,经过NAT转换之后,能够送回到正确的PC主机。
那么如何才能保证PC主机的数据包不受ARP欺骗的影响,正确的送到路由器呢?很简单,进行手工的静态ARP绑定。前面分析过,对于ARP欺骗PC主机的情况,路由器是无能为力的。
这样,PC可以根据静态(正确)的ARP信息把数据包发到网关路由器,路由器在记录必要的信息转存为NAT cache的时候,把该以太网帧的源MAC地址也异同记录,写到NAT cache中,作为数据包返回时的参考。
这种方式的优点是不用一来交换机,避免ARP的欺骗,但PC主机还是需要进行手工的ARP绑定。可以说这是“硬件角度”的一种折中方案。其缺点是NAT存储和判断的因素较多,必然影响性能;而且这种机制只能避免PC和路由器之间的通信免受ARP欺骗的干扰,对于PC与PC之间的通讯则无能为力了。
2.3.3 消极角度
什么是消极角度?简单的说就是没有办法了,我不用ARP了,那么在以太网中怎么通讯?PPPoE!在理论上,这的确可以完全规避ARP的问题,但在实际应用的时候,需要让路由器来充当PPPoE服务器,这样所有局域网通讯的流量都要经过路由器进行三层转发。对于路由器的处理压力可想而知――不过确实有这种网络的实际案例,比如ISP的运维办公网,但他们使用PPPoE的目的更重要的是为了网络信息安全和管理。
2.4 建议
对于ARP欺骗,仅仅从ARP本身恐怕是没有什么好的解决方案的,要解决或避免ARP欺骗的问题,需要动一番手术的。
而对于普通的ARP冲突,我到时觉得还可以加强一下:
u 路由器、Layer 3 Switch在确认网络中有IP冲突后,会立刻发送1个免费ARP Request,用以确定冲突已经消失,如果冲突继续存在,则强制发送1个免费ARP Response。
ü 是否可以考虑延时一个时间段再发送免费ARP Request?用以避免Windows主机没有及时处理处于“非正常”状态的情况;
ü 其次,如果冲突继续存在,发送1次ARP Response;更合理的应该是重复进行免费ARP Request探测,冲突存在则强制进行免费ARP Response通报,直到冲突消失。
2.5 总结
在主要的两类ARP问题中,一般的非恶意地址冲突不会对路由器、Layer 3 Switch造成实质性的影响。而对于各种目的的ARP欺骗机制,无论是从预防还是后期干预上,路由器都没有直接有效的手段?
虽然现在可以使用双向的静态ARP来避免ARP欺骗带来的影响,但就实施和后期的维护来看,都非常的不方便,而且也未尝容易出错。
比较好的出路在于从硬件结构上对交换机进行改良,实现成本与功能的平衡,才是防止ARP问题的根本之路。