一、概述
在我第一次接触ARP协议的时候,发现这协议挺简单的,"一去一回通过IP拿到MAC地址",整个过程在1s内就搞定了。后面学到了代理ARP,发现也不过是变了个法子,做了次"欺骗",本质还是一样。接下来又学到了免费ARP,顿时觉得网络协议设计者太牛了,一个协议居然能折腾出这么多玩法,连"地址检测"都能实现。等学到了ARP嗅探和欺骗,又发现其实黑帽子更爱折腾,谁能想到这么简单的协议,居然能制造工具出来做内网探测和欺骗攻击,引发这么大的危害。
当我以为ARP这一知识点在我的技术旅途中应该就此翻篇了的时候,又冒出了RARP和IARP这两,对比其他ARP协议的研究,当时学这两个协议是心不甘情不愿的:
第一,无论学习还是工作,极少碰到,真正"翻篇"了的协议;
第二,名字记不住,"翻转""反转""逆向""反向",不同技术文档的中文翻译有时候完全相反,没法记。毕竟汉语这么博大精深,就记住英文就好了,后面发现更加糟糕,因为reverse和inverse这两个单词仅仅2个字母之差,老外太欺负人了,这根本没法记。
我在想,肯定也有很多朋友学到这个时候遇到了上面同样的问题和纠结,有些坚持研究通透有些中途离开。然后我又思考了一番:ARP协议通过几个字段的细微调整,便能够适用于这么多不同场景,例如ARP、PARP、GARP、RARP、IARP,这是不是证明了它在TCP/IP协议栈里面独特的位置,有哪个协议能做到这一点,有这么多花样?所以,我的建议是:既然到了这一步了,就继续搞清楚吧,不管它是否用得上。
那么,什么是RARP和IARP?中文叫法是什么?它们各自的应用场景在哪里?数据包又是怎样的?
二、RARP原理与实践
RARP(Reverse ARP)即反向ARP或者翻转ARP,顾名思义,它跟常规的ARP功能恰恰是相反的,ARP是实现IP到MAC地址的映射,而RARP是实现MAC到IP地址的映射。
什么样的设备或者场景需要用到RARP呢?其实RARP原先在设计的时候,是适用于大部分终端设备的,不仅仅是无盘工作站,它的功能就是根据MAC获取IP地址,功能跟DHCP是一样的。
例如,一个电脑刚接入网络,没有IP地址就无法上网,此时它便会通过本地MAC地址,对外发送RARP Request广播请求,看看局域网里面是否有RARP Server,若Server上面有关于此MAC地址的映射IP,则会向此电脑返回RARP Reply回应,电脑便获取了IP地址=>
RARP通过非常精简的交互实现了IP地址的获取,但同时也暴露了一些问题:
①RARP Server必须提前将MAC和IP的映射静态绑定在本地;若没有提前绑定,则电脑用自己MAC询问时,Server也不会回应;
②RARP Server只能给电脑分配IP地址,不包括其他信息,包括网关、DNS等信息;
③RARP基于二层封装,只能运行在同一网段;每个网段分配地址,都需要一个RARP Server。
在RARP的基础上,后面又有了Bootp协议,直译过来便是"启动协议",功能同RARP,也是用于电脑接入网络时,用来获取IP地址的。但是毕竟做了增强,Bootp协议能让电脑启动时,不仅仅获取IP地址,而且能获取到网关地址,从而让电脑实现跨网段通信。
Bootp协议虽然让电脑能够获取到更多的信息,但是仍然没有解决最大的问题:
服务器仍然需要提前手工绑定MAC和IP地址,而对于现在的移动网络或者公共网络而言,这根本无法实现。
因为用户什么时候接入,接入的MAC是多少,管理员没法提前知道。这就有了后面的DHCP,DHCP通过动态分配的方式解决了这个诟病,并且通过DHCP中继技术实现了跨网段地址分配,实现了全网IP地址的统一管理。
小结:RARP是一种逝去的地址分配技术,是Bootp和DHCP的鼻祖,目前我们的电脑基本不会用到这个协议,只有部分无盘工作站等情况需要用到。
为了让大家更深入理解RARP,这里我们从数据包结构来解构它的功能。RARP的数据包比较难抓取,不像常规的ARP和DHCP协议,这里给大家提供一个思路:对于比较难找的协议数据包,除了搭建特殊的实验环境抓取之外,也可以借助一些[数据包生成工具]来实现,例如nmap扫描器里面集成的nping工具,可以生成非常多的协议包,包括arp、icmp、udp、tcp等等。
nmap的安装以及nping的使用,可以到https://nmap.org/nping下查询。这里给大家演示如何用nping生成rarp数据包,下图是我们要"人为"构造出来的交互场景=>
我的Macbook已经安装了nmap,自带了nping工具,跟ARP/RARP相关的帮助命令如下:
jayking:~ jaykingchen$ nping
Nping 0.7.60 ( https://nmap.org/nping )
Usage: nping [Probe mode] [Options] {target specification}
TARGET SPECIFICATION:
Targets may be specified as hostnames, IP addresses, networks, etc.
Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.*.1-24
ARP/RARP PROBE MODE:
--arp-type
--arp-sender-mac
--arp-sender-ip
--arp-target-mac
--arp-target-ip
为了能够抓取到rarp的请求和回复包,首先打开wireshark抓取电脑网卡流量并设置arp过滤,然后采用两条命令:第一条命令模拟我的电脑发起的RARP请求包,第二条命令模拟局域网网关设备(极路由)返回的RARP回复包。
jayking:~ jaykingchen$ sudo nping --arp-type RARP --arp-sender-mac ac:bc:32:8b:56:df --arp-sender-ip 0.0.0.0 --arp-target-mac ac:bc:32:8b:56:df --arp-target-ip 0.0.0.0 192.168.199.255
Starting Nping 0.7.60 ( https://nmap.org/nping ) at 2017-09-04 23:57 CST
SENT (0.0077s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
SENT (1.0079s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
SENT (2.0084s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
SENT (3.0111s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
SENT (4.0159s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 5 (210B) | Rcvd: 0 (0B) | Lost: 5 (100.00%)
Nping done: 1 IP address pinged in 5.02 seconds
jayking:~ jaykingchen$ sudo nping --arp-type RARP-reply --arp-sender-mac d4:ee:07:54:c1:9e --arp-sender-ip 192.168.199.1 --arp-target-mac ac:bc:32:8b:56:df --arp-target-ip 192.168.199.153 192.168.199.153
Starting Nping 0.7.60 ( https://nmap.org/nping ) at 2017-09-05 00:03 CST
SENT (0.8094s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
SENT (1.8107s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
SENT (2.8114s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
SENT (3.8138s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
SENT (4.8159s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 5 (210B) | Rcvd: 0 (0B) | Lost: 5 (100.00%)
Nping done: 1 IP address pinged in 5.82 seconds
此时,从Wireshark抓取到的RARP请求和回复包如下=>
三、IARP原理与实践
IARP(Inverse ARP)即逆向ARP,这个没法"顾名思义",因为它既不是IP到MAC的映射,也不是MAC到IP的映射,而是DLCI到IP的映射。相比前面所有其他ARP协议,IARP的应用场景不是在以太网(局域网)里面,而是在帧中继网络(广域网)里面。
要真正理解DLCI和IARP,需要有一些帧中继网络技术背景,这里简单说下:
DLCI(Data Link Connection Identifier)数据链接连接标识,是帧中继网络里面的二层地址,好比以太网里面的MAC地址,用于标记帧中继网络里面的虚拟专线。示图如下:
图中R1和R2通过专线连接到帧中继交换机,对应的DLCI号分别是102和201。交换机通过转发表进行数据交换:根据接口收到数据包的DLCI,查看对应的接口,转发到匹配的线路。
所以说,帧中继网络里面,DLCI类似MAC,决定了数据包的去向。那么,DLCI和IP的映射关系又是如何的呢?我们来看下帧中继网络里面的数据封装,以R1 ping R2为例:
从这里我们可以看到帧中继网络的数据封装和转发模式都不同于以太网:
①二层封装的时候,不需要源目地址,只需要本地DLCI;例如10.1.1.1 ping 10.1.1.2,源目IP地址这个跟以太网的封装是一样的,但是链路层封装不需要目标DLCI 201。
②交换机会改变二层地址信息,例如这里的DLCI从左边的102,变成了右边的201。
理解了这些差异,我们才能得到这里DLCI和IP的映射关系:即目标IP地址与本地DLCI的映射。例如R1要访问10.1.1.2,此时需要映射到本地的102;而R2要访问10.1.1.1,则需要映射到本地的201。
更完整地说明:逆向ARP解决帧中继网络里目标IP地址与本地DLCI的映射,并且让通信双方生成帧中继映射表(frame-relay map)。好比ARP解决了以太网里面目的IP与目标MAC的映射,并且让通信方生成ARP映射表。
接下来,我们通过实验环境来验证,这里可以通过GNS3模拟器搭建以上环境,并且抓包验证=>
①为R1和R2打开接口,封装帧中继,并配置IP地址:
R1(config)#int s0/0
R1(config-if)#no shutdown
R1(config-if)#encapsulation frame-relay
R1(config-if)#ip address 10.1.1.1 255.255.255.0
R2(config)#int s0/0
R2(config-if)#no shutdown
R2(config-if)#encapsulation frame-relay
R2(config-if)#ip address 10.1.1.2 255.255.255.0
② 开启wireshark抓包,抓取IARP请求和回复包:
R1#show frame-relay map
Serial0/0 (up): ip 10.1.1.2 dlci 102(0x66,0x1860), dynamic,
broadcast,, status defined, active
R2#show frame-relay map
Serial0/0 (up): ip 10.1.1.1 dlci 201(0xC9,0x3090), dynamic,
broadcast,, status defined, active
④测试R1和R2之间的联通并抓取ICMP包:
R1#ping 10.1.1.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.1.1.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 68/75/88 ms
至此,IARP的原理与实践并完成了。那么,既然IARP能够实现帧中继的通信,为什么在文章开头,我们提到说IARP跟RARP一样,在工作中已经不常见了呢?
①帧中继作为一种广域网远程连接技术,正在慢慢被其他技术代替;
②IARP不像ARP协议可以实时交互,它是周期性运行的,通信双方若丢失IARP映射表,则需要等待到固定的时间交互才能重新生成并通信。另外不同厂商不同型号对IARP的兼容性也可能不同。基于这些原因,一般建议直接关闭IARP协议,采用静态绑定的方式生成映射表,这里不再深入。(有兴趣的小伙伴可以观看我之前的技术视频教程,有深入讲解了如何关闭IARP和静态绑定的做法。)
四、RARP与IARP协议总结
①RARP用于实现MAC到IP的映射,本质就是为了获取IP地址,是Bootp和DHCP协议的鼻祖;
②IARP用于实现帧中继网络中DLCI到IP地址的映射,生成帧中继映射表(类似ARP表),实现数据封装与通信;
③相比ARP、免费ARP、代理ARP、ARP攻防等技术,RARP和IARP随着技术的更新迭代正在退出历史舞台,成为"被遗忘的兄弟协议" 。(对于初学者来说,也算是个好事,因为终于不用"翻转""反向""逆向"各种分不清了)
ARP协议大总结及下一阶段预告
到这里,我们通过六篇文章终于搞定了ARP协议的方方面面,包括它们的应用场景、设计思想、数据包结构、实验验证等等。
另外,为什么这次图解系列的开头是从ARP协议开始写,而不是从Ethernet、IP、TCP、HTTP或其他呢?
主要是因为"ARP太简单了",简单到大家在学网络和安全的时候,都容易去忽略协议背后的很多细节,例如很多人认为[ARP的请求就一定是广播的,回复就一定是单播的],但"常识"背后也有另外一些特殊的情况。所以,通过这一个足够简单的协议,为大家解构背后相对复杂的机制,为后续深入研究开个好头。
另外一个原因就是"ARP很有趣",例如协议设计者通过不同的操作代码(opcode),做了非常多的变种(arp是1和2,rarp是3和4,iarp是8和9),做一个模型便可以多处应用;而且通过精巧的构造,就可以在内网造成极大的杀伤力。
anyway,图解ARP协议只是整个系列的开篇,下一阶段,我们将进入IP协议,探讨IP协议原理、数据包结构、优缺点、地址结构、IP攻击与防御(分片攻击、欺骗攻击)……