http://www.paper.edu.cn
ARP 改进与实现
刘卫华,管会生,韩海强
兰州大学信息科学与工程技术学院,兰州(730000)
E-mail: Liuwhua06@lzu.cn
摘 要:由于早期计算机网络环境比较简单,在 ARP 的实现中没有考虑在大规模网络环境
中工作的一些问题,这就造成了针对 ARP 的网络安全问题在今天的网络中屡见不鲜,给网
络的安全运行带来很大的问题,而只有从源头上对 ARP 进行改进才可以彻底解决这类问题。
本文通过认真分析 ARP 的工作原理,查找 ARP 安全问题的根源,提出了对 ARP 进行改进
的思路和算法,并在 ARP 实现经典代码的基础上,对 ARP 的实现代码作了改进,很好的解
决了针对 ARP 的网络安全问题。
关键词:ARP,ARP 高速缓存,ARP 改进
中图分类号:TP393.08
1. ARP 协议及其工作原理
1.1 ARP 协议原理
地址转换协议(ARP)用于实现IP地址到网络接口硬件地址(以太网网络接口硬件地址
长度为48bit)的映射,当然,ARP也可以工作在其他类型的数据链路下,本文仅针对IP地址
映射到48bit的以太网地址的情况。针对ARP的研究有两个核心因素,一个是ARP报文本身,
另外一个就是ARP高速缓存。ARP报文(包括硬件类型、协议类型、硬件地址长度、协议地
址长度、操作码、发送硬件地址、发送IP地址、接收端硬件地址、接收端IP地址)[1]中操作
码决定是请求还是应答报文,而接收端硬件地址是数据正确发送的前提,只有接收端硬件地
址已知,才能进行数据发送。保存地址映射关系的ARP高速缓存(每一项包括IF索引、物理
地址、I P地址、类型)[2]由系统内核负责维护,其中的物理地址和IP地址一一对应,网络状
态的更新将导致ARP高速缓存信息的变化。
由于频繁发送ARP请求/应答会降低网络性能,因此主机上使用ARP高速缓存来存放最
近通信的IP地址到硬件地址之间的映射记录。这个高速缓存在Net/3中的实现使用了llinfo_arp
结构的双向链表和路由表结点(rtentry结构)等多个结构,对这个高速缓存的操作涉及到以全
局变量llinfo_arp为链表头结点的多个结构。链表中的ARP节点类型分两类,其中静态ARP节
点是永久性的,不会根据网络情况自动进行更新,也不会因为超时被删除,而动态ARP节点
则不同,它可以根据网络情况自动更新,而且超过生存时间(一般为20分钟)的节点也会被
自动删除,本文的研究针对动态ARP节点进行。
1.2 ARP 工作流程:
当某主机要向以太网中另一台主机发送IP数据时,它首先根据目的主机的IP地址在ARP
高速缓存中查询相应的以太网地址,如果查到匹配的结点(存在目的主机IP地址到以太网接
口地址的映射),则相应的以太网地址被写入以太网帧首部,数据报被加入到输出队列等候
发送,同时更新该节点的时限值(生存时间)。如果查询失败,ARP会先保留待发送的IP数
据报,创建新的ARP节点,然后广播一个询问目的主机以太网地址的ARP报文,等收到目的
主机的ARP应答(单播)后,填充刚才创建的ARP节点信息,再将IP数据报发送出去。在动
态ARP节点的实现中,为了便于以太网地址更新后的通信,如果收到ARP请求或者应答,但
是对应的ARP结点早已存在,硬件地址却发生了变化,那么将会更新ARP结点的信息。
- 1 -
http://www.paper.edu.cn
2. ARP 工作中存在的问题
ARP 最初的实现建立在网络中各主机相互信任的基础上,而且为了保证了 ARP 的高效
运行使用了高速缓存,但随着网络技术的发展,协议的设计暴露出一些问题:为了通信便利,
主机通常使用动态 ARP 高速缓存,该缓存信息会根据网络情况自动更新,在需要发送数据
时先查找高速缓存,如果存在对应的地址映射则不发送 ARP 请求,并且在设计上, ARP
允许根据收到的 ARP 应答更新高速缓存中已有的映射信息,只要该应答报文是有效的,主
机就会刷新其高速缓存中的映射信息,而不管是否发送了对应的 ARP 请求,也不审核该应
答报文的信息是否真实可靠,这样,伪造 ARP 应答报文可以在网络中畅通无阻。正是根据
ARP 的这个特性,攻击主机就可以伪造 ARP 应答报文,篡改目的主机 ARP 高速缓存中的
映射关系,进而达到窃取数据或者破坏通信的目的,其典型代表就是中间人攻击。
中间人攻击主要是通过伪造ARP应答包实现[3]。当源主机(S)和目的主机(T)建立通
信后,ARP缓存中就会保存相互的地址映射信息,中间人(M)分别向S和T发送伪造的ARP
应答包:其中发向S的数据包中填充目的IP地址为IPT(伪造),填充目的接口地址为自己的
接口地址MACM,其中发向T的数据包中填充目的IP地址为的IPM(伪造),填充接口地址为
自己的接口地址MACM,这样,S和T主机更新缓存中的映射关系为IP T、IP S对应的接口地址
为MACM,M主机打开IP Forward功能,这样原来的通信就由S—T变成现在的S—M—T,S
和T的通信就经过M实现,M可以监听、篡改数据,进行破坏。
3. 协议改进
3.1 ARP协议改进思想
协议的正常流程是先发送ARP广播请求,后等待ARP单播应答,但如果没有发送ARP请
求,却收到一个ARP应答,这个应答包很有可能是伪造的,应该丢弃,而目前ARP协议接受
这个应答,并修改ARP节点信息,造成通信安全问题。那么很显然,如果对未请求而收到的
应答不进行ARP节点更新就能解决这个问题。因此上,改进主要是针对ARP对应答包的响应
进行修改,其算法思想为:如果主机收到来自其他主机的回答,对应的ARP结点早已存在,
虽然硬件地址发生了变化,但并不更新缓存表,以防欺骗,也就是只接收有发送请求的ARP
应答报文,其它的都丢弃。
3.2 ARP协议改进实现
由于伯克利(Berkeley)源代码是Unix或非Unix操作系统实现的起点,因此以伯克利联
网程序代码为基础进行分析:
3.2.1 用于处理ARP信息的相关函数的思想及实现代码
(1)函数in_arpinput的思想:
该函数用于处理接收到的ARP请求/回答,其思想为:如果主机收到来自其他主机的请
求或回答,对应的ARP结点早已存在,但硬件地址发生了变化,那么ARP结点将被更新;如
果没有对应的ARP节点则新建节点,对于ARP请求包则生成相应的ARP应答包。
(2)函数in_arpinput的部分代码:
本文节选in_arpinput函数[4]的部分代码,函数的第一部分查找本机IP地址是否与ARP包
的目的地址相匹配,函数的第二部分验证接收到的分组是否为发送到本机的正确分组,该段
代码是第三部分,在前两部分的基础上操作,创建新的ARP结点或更新已有的ARP结点。程
- 2 -
序的原始代码(403-420)见代码1:
http://www.paper.edu.cn
isaddr.s_addr, ether_sprintf(ea->arp_sha));
if(sdl->sdl_alen &&
bcmp((caddr-t)ea->arp_sha, LLADDR(sdl), sdl->sdl-alen))
log(LOG_INFO, "arp info overwritten for %x by %s\n",
la = arplookup(isaddr.s_addr, itaddr.s_addr == myaddr.s_addr,0);
if (la && (rt = la->la_rt) && (sdl = SDL (rt->rt_gateway))){
bcopy((caddr_t)ea->arp_sha, LLADDR(sdl), sdl->sdl_alen = sizeof(ea->arp_sha));
if(rt->rt_expire) rt->rt_expire = time.tv_sec + arpt_keep;
rt->rt_flag &=~RTF_REJECT;
la->la_asked = 0;
if(la->la_hold){
reply:
(*ac->ac_if.if_output)(&ac->ac_if, la->la_hold, rt_key(rt),rt);
la->la_hold = 0; } }
if(op!=ARPOP_REQUEST){
m_freem(m);
retrun; }
out:
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
代码1 in_arpinput函数部分代码
下面对程序进行说明:
403行在路由表中搜索与发送方IP地址匹配的结点:调用arplookup在ARP高速缓存中查
找符合发送方的IP地址(isaddr)。比较ARP分组中的目的IP地址是否等于本机IP,如果相等
则第二个参数是1(本机是通信的目的主机),创建新的ARP结点;如果不相等则第二个参
数是0(本机不是通信的目的主机),不需要创建的ARP结点。第三个参数是0表示不去查找
代理ARP结点。返回值是指向保存ARP信息的双向链表(llinfo_arp结构)的指针;如果查不
到或没有创建,返回值为空。
404行更新已有结点或填充新的结点:条件为找到一个已有的ARP结点或成功创建一个
新的ARP结点(la非空)、ARP结点指向保存硬件地址已知的IP地址对应的相关信息的路由
表结点(rt)和路由表结点的re_gateway字段指向一个sockaddr_dl结构。
405-408行检查发送方的硬件地址是否已改变:如果硬件地址长度(sdl_alen)非0,而
且硬件地址和发送方的硬件地址不同,说明ARP结点是现存的未超时节点,而且发送方的硬
件地址已经改变,则记录差错信息。
409行记录发送方硬件地址:将发送方的硬件地址写入路由表结点中rt_gateway成员指向
的sockaddr_dl结构,sockaddr_dl结构的硬件地址长度(sdl_alen)也被设为6,这时的ARP节
点信息已经完整。
410行更新最近解析的ARP结点:如果时限是非零的(动态ARP节点),则将被复位成
20分钟(arpt_keep),永久的ARP结点的时限值置为0(静态ARP节点)。
411-412行清除ARP避免洪泛算法的标志(RTF_REJECT),连续发往目的地址的ARP
请求数(la_asked)设为0。
413-415行如果ARP中保持有(la_hold指针保持有存放待发数据报的mbuf链的头结点的地
- 3 -
址 信 息 ) 正 在 等 待ARP 解 析 该 目 的 方 硬 件 地 址 的mbuf , 则 将mbuf 送 至 接 口 输 出 函 数
ether_output,输出数据。
http://www.paper.edu.cn
416-420行如果该ARP操作不是请求,那么丢弃接收到的分组,程序返回。
in_arpinput 函 数 的 剩
余部分,产生一个对应于
ARP请求的回答,并传送
至接口输出函数。
链路层地址长度非 0,且链路层
地址和发送方的硬件地址不同
N
Y
3.2.2 ARP 改进与实现
(1)程序流程图:
经 过 分 析 发 现 ,
405-408 这些代码造成了
ARP 更新的不安全问题,
因此本文针对它们进行修
改,程序流程见图 1:
记录硬件地址改变信息
请求包
Y
N
记录拒绝修改硬件地址
丢弃分组,返回
填充新的 ARP 节点中的硬件地址
图 1 修改后的程序流程图
(2)对 405-408 的代码进行修改,修改后的代码见代码 2:
405
if(sdl->sdl_alen && bcmp((caddr-t)ea->arp_sha, LLADDR(sdl), sdl->sdl-alen))
{
log(LOG_INFO, " arp info overwritten for %x by %s\n ",
isaddr.s_addr, ether_sprintf(ea->arp_sha));
if(op!=ARPOP_REQUEST)
{
log(LOG_INFO, " Two MAC for One IP, arp info REFUSE overwritten for %x by %s\n",
isaddr.s_addr, ether_sprintf(ea->arp_sha));
goto reply;
}
}
代码2 对405-408行修改后的代码
这样,如果硬件地址长度(sdl_alen)非0,且硬件地址和发送方的硬件地址不同,则记
录硬件地址改变信息,同时判断收到ARP包的操作码如果不是请求,说明收到的是一个要求
修改硬件地址的应答包,则程序跳到reply执行丢弃接收到的分组并返回的操作,不更新ARP
结点的硬件地址信息。修改后的操作只有在硬件地址改变时丢弃收到的分组,不会丢弃发送
完请求包后收到的应答包。
4. 结束语
通过修改ARP协议,将会拒绝未发送ARP请求却收到ARP应答,并要求修改原有ARP节
点的操作,伪造ARP应答包的欺骗手段将无法成功,在一定程度上保护了网络数据的安全。
1、ARP协议实现的无认证性、无状态造成了现在ARP问题的泛滥,因此通过协议修改
才能解决根本问题,本文的修改在不改变原有数据结构和基本操作的基础上进行,只对接收
ARP的操作进行修改且修改量很小,对于修改网络的底层基础来说,这无疑是件好事。
2、修改后的协议丢弃了部分操作(多个应答包的问题),但这部类情况相对较少,所
- 4 -
http://www.paper.edu.cn
以对通信的影响不大。丢弃的操作主要体现在:如果两个相同地址的ARP应答包(2个ARP
包中源IP地址都是本机地址)来到,这有两种类型,一个是IP地址冲突,在ARP实现中有具
体规定和操作,另外一种可能就是伪造应答包。修改后的协议响应第一个包,而丢弃第二个
包,一般来说伪造包可能响应更慢一些,但不排除第二个包来自真正的通信对象,有可能造
成通信失败,这可以通过其他的方法解决,本文不作讨论。
参考文献
[1] W.Richard Stevens. TCP/IP详解 卷1:协议[M].范建华,胥光辉,张涛,译.北京:机械工业出版社.2000: 39-40。
[2] Tim Parker Mark Sportack. TCP/IP大全[M].前导工作室译.北京:机械工业出版社,2000:45。
[3] 郭卫兴,刘旭,吴灏.基于ARP缓存超时的中间人攻击检测方法[J].计算机工程,2008年,34卷(13):133。
[4]Gary R.Wright, W.Richard Stevens. TCP/IP详 解 卷2: 实现[M]. 陆 雪 莹 等. 译. 北 京: 机械 工 业 出 版 社,
2000:552-557
ARP Improvement and Implementation
Liu Weihua,Guan Huisheng,Han Haiqiang
School of Information Science and Engineering, Lanzhou University, Lanzhou (730000)
Abstract
In the early days, computer network environment is relatively simple. Some issues of large-scale
network environment did not consider in the realization of the ARP, so the network security issues of
ARP is very common today, and it caused a lot of problems. Only at the source of the ARP
improvements can solve these problems. This paper makes improvements on the ARP of ideas and
algorithms through careful analysis of the principle of ARP and finding the root cause of ARP security
problems. Furthermore, the paper improved the ARP realization code based on the classic ARP
realization code. The improvement solutes the network security issues of ARP Successfully.
Keywords: ARP, ARP Cache, ARP Improvement
- 5 -