ARP 位于七层模型里的第二层,即数据链路层。数据链路层有什么?答对了,是MAC地址。MAC地址指网络接口的硬件地址,是一个48bit的值,用来标识以太网或令牌环(已经很少听到了)的网络接口。送货总要有地址吧,在硬件层次上,MAC地址就是干这个的。发送数据的前提,就必须知道目的硬件地址。 总之,在以太网里面,一台主机要发送数据帧,必须知道对方的以太网地址才能发送数据。而我们只知道IP地址,这时就要喊ARP协议来干活了,将IP地址翻译成MAC地址。 一般认为ARP协议只适用于局域网。
现在我们知道ARP是干嘛的了,就是用于解析MAC地址。
TCP/IP协议栈是从上层到下层依次封装的,其中呢,第三层需要封装目的IP地址,第二层需要封装目的MAC地址。目的IP地址由用户/应用程序/DNS解析得到,而目的MAC地址哪来呢?ARP解析来的。
来看一下ARP解析MAC地址过程: 比如上层数据发送一个数据包过来,假设目的IP地址已经知道了。这个时候需要在数据链路层把MAC地址封装进去。可是主机说,我不知道啊,那封装就失败了,目的IP到目的MAC封装映射不成功。怎么办呢?那就先干些别的吧。 我先发个广播,就是ARP Request请求,源MAC是发起者的MAC, 目的MAC地址是FFFF:FFFF:FFFF (所有主机)。所有收到广播的设备,对收到的ARP Request拆封,读取ARP数据包中需要解析的目的IP,看看找谁。 两种结果,一种是主机发现,你要找的目的IP地址跟我的不一样啊,那就不管了,直接忽略。另一种是目的IP正确的设备,一看奥是找我的啊,那我回复一下吧。就发个ARP Reply来回应。ARP Reply消息,源MAC为被解析设备的MAC,目的MAC是ARP Request发起者的MAC地址。发起者接收到ARP Reply后,把目的IP地址与目的MAC地址的对应关系添加到ARP表里去。然后再继续未完成的封装工作,现在可以把正确的目的MAC封装到数据帧里发送出去了。
我们再看看ARP在TCP连接建立的过程中干了些啥,这次接收者是一台路由器。 当一个应用通过交互界面提交了数据请求,需要建立TCP连接。我们知道TCP需要三次握手,当TCP的第一个SYN报文到达IP层后,IP层就开始查找路由表。有这么几种处理方式: 1)如果发现目的IP和自己在同一个网段,那就查找ARP高速缓存表中。缓存表里面有,存在目的IP对应的MAC地址时,可以直接取出来重新封装并发送报文;缓存表里没有,ARP干活(缓存TCP的SYN先被缓存起来)。发送ARP Request广播请求目的IP的MAC,收到ARP应答之后,将应答之中的<IP地址,对应的MAC>缓存在本地ARP高速缓存表中,再重新封装TCP SYN报文并发送。 2)如果目的IP地址和自己不在同一个网段,那么久要把报文发送给默认网关(需要知道默认网关的MAC地址)。同样查找ARP高速缓存表,有默认网关对应的MAC地址时,直接提取数据,提交给网络接口,网络接口完成封装和转发。缓存表没有,则发送ARP广播请求默认网关的MAC,收到ARP应答之后,将应答之中的<默认网关地址,对应的MAC>缓存在本地ARP高速缓存表中,再重新完成TCP SYN的IP封装并转发。
ARP高速缓存 ARP高速缓存表在IP层使用。如果每次建立TCP连接都发送ARP请求,会降低效率,因此在主机、交换机、路由器上都会有ARP缓存表。建立TCP连接时先查询ARP缓存表,如果有效,直接读取ARP表项的内容进行第二层数据包的发送;只有表失效时才进行ARP请求和应答进行MAC地址的获取,以建立TCP连接。 ARP缓存是一个缓冲区,用来储存IP地址和MAC地址,本质就是<IP地址,MAC地址>的对应表。表中一个条目记录了网络上一个主机的IP地址和其对应的MAC地址。每一个以太网或令牌环网络适配器都有自己单独的表。 当地址解析协议被询问一个已知IP地址节点的MAC地址时,先在ARP缓存中查看,若存在,就直接返回与之对应的MAC地址,若不存在,才发送ARP请求向局域网查询。 ARP缓存包含动态和静态项目: 动态项目随时间推移自动添加和删除,每个动态ARP缓存项都有都设置了TTL(生存时间),TTL为0时此项目就从表中删除,Windows下TTL一般不超过10分钟。 静态 ARP 缓存条目是永久性的,可以使用 TCP/IP 工具手动添加和删除。静态 ARP 缓存条目用来禁止节点发送对常用的本地IPv4地址(例如路由器和服务器的 IPv4 地址)的ARP请求。
动态ARP老化机制 动态ARP是指设备通过ARP报文动态学习、动态刷新IP地址和MAC地址之间的映射关系,不需要网络管理员手工进行维护。 在一段时间内,如果ARP表中的某一映射关系始终没有得到使用,这条映射关系就会被删除,动态ARP老化机制就是实现系统自动删除ARP表项操作的一套机制。通过动态ARP的老化机制,可以及时删除使用频率不高的ARP表项,节省ARP表的存储空间,进而加快设备发送数据报文之前查询ARP表的速度。 从ARP高速缓存的使用中可以看到,ARP高速缓存可以减小广播量,进而减小网络通信量,提高计算机之间的通信效率。具有一定安全隐患(参考下面免费ARP)
免费ARP 免费ARP指主机发送ARP查找自己的IP地址,通常发生在系统引导期间进行接口配置时。 与标准ARP的区别就是免费ARP分组的目的IP地址字段封装的是自己的IP地址,即向所在网络请求自己的MAC地址。 免费ARP能干啥? 1) 一个主机可以通过它来确定另一个主机是否设置了相同的 IP地址。正常情况下发送免费ARP请求不会收到ARP应答,如果收到了一个ARP应答,则说明网络中存在与本机相同的IP地址的主机,发生了地址冲突。 2)更新其他主机高速缓存中旧的硬件地址。 如果发送免费ARP的主机正好改变了硬件地址,如更换了接口卡。其他主机接收到这个ARP请求的时候,发现自己的ARP高速缓存表中存在对应的IP地址,但是MAC地址不匹配,那么就需要利用接收的ARP请求来更新本地的ARP高速缓存表表项。 3)网关利用免费ARP防止ARP attack 有些网关设备在一定的时间间隔内向网络主动发送免费ARP报文,让网络内的其他主机更新ARP表项中的网关MAC地址信息,以达到防止或缓解ARP***的效果。
免费ARP安全隐患 ARP协议并不只在发送了ARP请求才接收ARP应答,计算机只要接收到ARP应答数据包,就会使用应答中的IP和MAC地址对本地的ARP缓存进行更新。 主机可以构造虚假的免费ARP应答,将ARP的源MAC地址设为错误的MAC地址,并把这个虚假的免费ARP应答发送到网络中,那么所有接收到这个免费ARP应答的主机都会更新本地ARP表项中相应IP地址对应的MAC地址。更新成功后,这些主机的数据报文就会被转发到错误的MAC地址,从而实现了ARP欺骗的***。
代理ARP 代理ARP就是通过使用一个主机(通常为router),来作为指定的设备使用自己的 MAC 地址来对另一设备的ARP请求作出应答。 为什么需要代理ARP? 我们知道,路由器的重要功能之一就是把局域网的广播包限制在该网内,阻止其扩散,否则会造成网络风暴。 ARP请求是个广播包,它询问的对象如果在同一个局域网内,就会收到应答。但是如果询问的对象不在同一个局域网该如何处理?路由器就提供的代理ARP为这个问题提供了解决方案。 两台主机A和B处于同一网段但不同的广播段时,主机A发送ARP请求主机B的MAC地址时,因为路由器不转发广播包的原因,ARP请求只能到达路由器。如果路由器启用了代理ARP功能,并知道主机B属于它连接的网络,那么路由器就用自己接口的MAC地址代替主机B的MAC地址来对主机A进行ARP应答。主机A接收ARP应答,但并不知道代理ARP的存在。 代理ARP能在不影响路由表的情况下添加一个新的Router,使子网对该主机变得透明化。一般代理ARP应该使用在主机没有配置默认网关或没有任何路由策略的网络上。缺点是,从工作过程可以看到,这其实是一种ARP欺骗。而且,通过两个物理网络之间的路由器的代理ARP功能其实互相隐藏了物理网络,这导致无法对网络拓扑进行网络概括。此外,代理ARP增加了使用它的那段网络的ARP流量,主机需要更大的ARP缓存空间。
ARP安全 ARP协议有简单、易用的优点,但是也因为其没有任何安全机制,容易被attacker利用。在网络中,常见的ARP attack方式主要包括: ARP泛洪attack,也叫拒绝服务DDoS(Denial of Service),主要存在这样两种场景: 1)设备处理ARP报文和维护ARP表项都需要消耗系统资源,同时为了满足ARP表项查询效率的要求,一般设备都会对ARP表项规模有规格限制。Attacker就利用这一点,通过伪造大量源IP地址变化的ARP报文,使得设备ARP表资源被无效的ARP条目耗尽,合法用户的ARP报文不能继续生成ARP条目,导致正常通信中断。 2)Attacker者利用工具扫描本网段主机或者进行跨网段扫描时,会向设备发送大量目标IP地址不能解析的IP报文,导致设备触发大量ARP Miss消息,生成并下发大量临时ARP表项,并广播大量ARP请求报文以对目标IP地址进行解析,从而造成CPU(Central Processing Unit)负荷过重。 ARP欺骗,是指Attacker通过发送伪造的ARP报文,恶意修改设备或网络内其他用户主机的ARP表项,造成用户或网络的报文通信异常。
提高ARP安全的方案 不同厂商产品的特性和配置方式都不尽相同,但大致有这些方式来提高ARP的安全性: ARP报文限速;ARP Miss消息限速;免费ARP报文主动丢弃;ARP优化应答;ARP表项限制;ARP表项限制;ARP表项固化;动态ARP检测;ARP防网关冲突;ARP报文内MAC地址一致性检查等。
“Spec of ARP full” 案例 本案例仅供参考。 设备:华为NE05E-SE路由器; 现象:例行巡检时,发现错误告警“Spec of ARP full”。 查找资料得知,ARP表项受硬件规格限制。如果ARP表项满了,则会导致新设备MAC地址无法注册,无法提供IP地址到MAC地址的解析,网络通讯无法连接等问题。 需要考虑的是,如果这些ARP是真实的,如果无法通过软件方式提高ARP表项支持数目,就只有更换硬件了。 本案例中,当前版本的路由器支持ARP表项数量为1055 (设备ARP和ND的规格共享),可以通过“set arp specification { 1055 | 8192 }” 命令设置,设备ARP规格独享8192,ND规格独享1055。
RARP 反向ARP 具有本地磁盘的系统引导时,一般是从磁盘中的配置文件读取IP地址。但是无盘机,如无盘工作站,则需要采用其他方法获取ip地址。 网络上的每个系统都具有唯一的硬件地址,他是由网络接口生产厂家配置的。无盘系统的RARP实现过程是从接口卡上读取唯一的硬件地址,然后发送一份RARP请求(一帧在网络上的数据),请求某个主机在无盘系统的IP地址。 RARP服务器的复杂性在于。服务器一般要为多个主机提供硬件地址到IP地址的映射。更为复杂的是,RARP请求作为一个特殊类型的以太网数据帧来传送。这说明RARP服务器必须能够发送和接收这种类型的以太网数据帧。 RARP是许多无盘系统在引导时用来获取IP地址的。RARP实现起来要比ARP复杂,因为RARP请求实在硬件层上广播的。这意味着他们不经过路由器进行转发。为了能让无盘系统在RARP关机的情况下也能引导,通常要在一个网络上(一根电缆)提供多个RARP服务器。