ARP协议详解

来源:互联网 发布:mysql bool 编辑:程序博客网 时间:2024/06/05 08:21

很多人都知道ARP是地址解析协议,但是其究竟如何工作,我们又该如何使用它呢?许多人就会一知半解了吧,下面我们从以下几个方面来详细解析一下ARP协议:

(一)ARP的定义和工作原理

(二)帧格式

(三)如何使用ARP

(四)ARP问题情况的分析

(五)ARP高速缓存

(六)ARP代理

(七)ARP攻击和使用原理

(一)ARP的定义和工作原理

对于以太网,数据链路层上是根据48bit的以太网地址来确定目的接口,设备驱动程序从不检查IP数据报中的目的IP地址。ARP协议为IP地址到对应的硬件地址之间提供动态映射。ARP协议(Address Resolve Protocol,地址解析协议)工作在TCP/IP协议的第二层(数据链路层),用于将ip地址转换为网卡地址(NICMAC地址,媒体访问控制地址)。无论是任何高层协议的通讯,最终都将转换为数据链路层的MAC地址来通讯。说白了,也就是将主机的ip地址转换为对应的48位物理地址。当然还有对应的RARP也就是向反的过程48位的物理地址转换为ip地址。

      举个例子来说明整个过程:

      比如hostA地址为192.168.4.12hostA现在想和hostB192.168.4.24通讯,那么将进行如下的操作:

        hostA主机查询自己的ARP缓存表,如果发现具有对应于ip地址192.168.1.24MAC项,则直接使用此MAC地址项构造并发送数据包,如果没有发现则进行下一步操作.

        hostA主机发出ARP解析请求广播,目的MAC地址是ff:ff:ff:ff:ff:ff,请求hostBMAC地址。当hostB收到ARP解析清求广播后回复给hostA一个ARP应答数据包。其中包含自己的ip地址和MAC地址;当hostA收到hostB的ARP回复后,将hostBMAC地址放入自己的ARP缓存表,然后使用hostBMAC地址作为目的MAC地址,hostBip192.168.1.24作为目的ip地址,构造数据包并发送给hostB

       这个时候hostA如果还要继续给hostB:192.168.1.24发数据的话就不用发广播去请求了,因为hostAARP缓存里有hostBipMAC的对应项了。当然如果是动态获取的话,超过两分钟没有使用这个项,那么这个表项将被删除。

这里有两点需要注意:

1.ARP协议只适用于局域网

2.如果本地主机想要向某一个IP地址的主机(路由表中的下一跳路由器或者直连的主机,注意此处IP地址不一定是IP数据报中的目的IP)发包,但是并不知道其硬件地址,此时利用ARP协议提供的机制来获取硬件地址。

(二)帧格式

 ARP/RARP帧格式

  • 以太网目的地址:目的主机的硬件地址。目的地址全为1的特殊地址是广播地址。
  • 以太网源地址:源主机的硬件地址。
  • 帧类型:对于ARP协议,该字段为0x0806。对于RARP协议,该字段为0x8035
  • 硬件类型:表示硬件地址的类型。值为1时表示以太网地址。也就是说ARP协议不仅仅应用于以太网协议,还可以支持别的链路层协议
  • 协议类型:表示要映射的协议地址类型。值为0x0800时表示IP协议。
  • 硬件地址长度:与硬件类型对应的硬件地址的长度,以字节为单位。如果是以太网,则是6字节(MAC长度)。
  • 协议地址长度:与协议类型对应的协议地址长度,以字节为单位。如果是IP协议,则是4字节(IP地址长度)。
  • 操作类型(op):四中操作类型。ARP请求(1),ARP应答(2),RARP请求(3),RARP应答(4
  • 发送端硬件地址:如果是以太网,则是源主机以太网地址,此处和以太网头中的源地址对应。
  • 发送端协议地址:如果是IP协议,则表示源主机的IP地址。
  • 目的端硬件地址:如果是以太网,则是目的以太网地址,和以太网头中的目的地址对应。
  • 目的端协议地址:如果是IP协议,则表示源主机要请求硬件地址的IP地址。
  • 对应ARP请求包来说,目的端的硬件地址字段无须填充,其他字段都需要填充。对于ARP回复包来说,所有字段都需要填充。

ARP协议的数据结构: 

<pre name="code" class="cpp">typedef struct arphdr{    unsigned shortarp_hrd;/*硬件类型*/    unsigned shortarp_pro;/*协议类型*/    unsigned chararp_hln;/*硬件地址长度*/    unsigned chararp_pln;/*协议地址长度*/    unsigned shortarp_op;/*ARP操作类型*/    unsigned chararp_sha[6];/*发送者的硬件地址*/    unsigned longarp_spa;/*发送者的协议地址*/    unsigned chararp_tha[6];/*目标的硬件地址*/    unsigned longarp_tpa;/*目标的协议地址*/}ARPHDR,*PARPHDR;

这里有两点需要注意:

1、APR请求包是广播的,但是ARP应答帧是单播的。

2、以太网数据报最小长度是60字节(14字节的以太网头,不包含4字节的FCS),ARP数据包长度为42字节(14字节的以太网头和28字节的ARP数据),需要加入填充字符到以太网最小长度要求:60字节。

(三)如何使用ARP

每台主机都具有一个用于缓存MAC地址的ARP缓存列表,你可以使用命令ARP -aARP -g来查看当前的ARP缓存列表。此ARP缓存列表是动态更新的,默认情况下,当其中的缓存项超过两分钟没有活动时,此缓存项就会超时被删除。你可以使用ARP -s来静态绑定IP地址和MAC地址,不过在Windows server 2003XP以前的Windows系统中,就算你设置了静态MAC地址绑定项,同样会通过接收其他主机的数据包而更新已经绑定的项。在Windows server 2003XP中,静态绑定的项不会被动态更新,直到TCP/IP协议终止为止,例如重启计算机。如果要创建永久的静态MAC地址绑定项,你可以写一个脚本文件来执行ARP静态绑定,然后使用计划任务在启动计算机时执行该脚本即可。

(四)ARP问题情况的分析

我来假设有三台pc

              pc1192.168.4.10/24

              pc2192.168.4.11/24

              pc3:   192.168.4.12/24

三台pc在同一个网段里可以互相ping通没有任何问题。

这个时候我在pc1的机子上绑定pc2MAC,当然这个时候 pc2 ping pc1还是可以通的。只是在pc1上静态绑定了pc2ipmac罢了。好这个时候我将pc2关机,我在pc3上将它的ip改为刚刚关机的pc2的地址就是:192.168.4.11/24不通了。怎么回事?

好了用我上面讲的arp解析过程,他家不难发现。是不是pc3发的ip和对应pc1ip192.168.4.11对应的MAC不一样。这就起到了限定ip的作用。

(五)ARP高速缓存

每个主机都有一个ARP高速缓存表,这样避免每次发包时都需要发送ARP请求来获取硬件地址。默认老化时间是20分钟。利用arp -a命令可以查看显示系统中高速缓存的内容。

Windows下“arp -d”命令可以清除arp高速缓存表。

有时候需要手动清除arp缓存,曾经就是因为arp缓存没有做清理,导致迷惑了很久。遇到的问题:

1) 制作了一个写路由器MAC地址的工具,每次写完MAC地址,重启路由器,会发现无法telnet登陆路由器。IP地址没变,但是MAC地址更改了,而ARP缓存表中IP地址映射的仍然是旧的MAC地址。

2) 类似的问题,有两个路由器具有相同的IP地址。先连接一个路由器,登陆成功后,再去连接另一台路由器,却发现登陆不了。

(六)ARP代理

如果ARP请求时从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器可以回答该请求,这个过程称作委托ARP或者ARP代理。这样可以欺骗发起ARP请求的发送端,使它误以为路由器就是目的主机。

RARP:逆地址解析协议,将局域网中某个主机的物理地址转换为IP地址,比如局域网中有一台主机只知道物理地址而不知道IP地址,那么可以通过RARP协议发出征求自身IP地址的广播请求,然后由RARP服务器负责回答。RARP协议广泛应用于无盘工作站引导时获取IP地址。

RARP允许局域网的物理机器从网管服务器ARP表或者缓存上请求其IP地址。

RARP的工作原理:
  1. 发送主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;
  2. 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;
  3. 如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;
  4. 如果不存在,RARP服务器对此不做任何的响应; 
  5. 源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败

(七)ARP攻击和使用原理

1、交换网络的嗅探(man in the middle)
ARP协议并不只在发送了ARP请求才接收ARP应答。当计算机接收到ARP应答数据包的时候,就会对本地的ARP缓存进行更新,将应答中的IP和MAC地址存储在ARP缓存中。因此,在上面的假设网络中,B向A发送一个自己伪造的ARP应答,而这个应答中的数据为发送方IP地址是192.168.10.3(C的IP地址),MAC地址是DD-DD-DD-DD-DD-DD(C的MAC地址本来应该是CC-CC-CC-CC-CC-CC,这里被伪造了)。当A接收到B伪造的ARP应答,就会更新本地的ARP缓存,将本地的IP-MAC对应表更换为接收到的数据格式,由于这一切都是A的系统内核自动完成的,A可不知道被伪造了。 
ARP欺骗的主要用途就是进行在交换网络中的嗅探。

2、IP地址冲突 
我们知道,如果网络中存在相同IP地址的主机的时候,就会报告出IP地址冲突的警告。这是怎么产生的呢? 
比如某主机B规定IP地址为192.168.0.1,如果它处于开机状态,那么其他机器A更 改IP地址为192.168.0.1就会造成IP地址冲突。其原理就是:主机A在连接网络(或更改IP地址)的时候就会向网络发送ARP包广播自己的IP地址,也就是freearp。如果网络中存在相同IP地址的主机B,那么B就会通过ARP来reply该地址,当A接收到这个reply后,A就会跳出IP地址冲突的警告,当然B也会有警告。 
因此用ARP欺骗可以来伪造这个ARPreply,从而使目标一直遭受IP地址冲突警告的困扰。 
3、阻止目标的数据包通过网关 
比如在一个局域网内通过网关上网,那么连接外部的计算机上的ARP缓存中就存在网关IP-MAC对应记录。如果,该记录被更改,那么该计算机向外发送的数据包总是发送到了错误的网关硬件地址上,这样,该计算机就不能够上网了。 
这里也主要是通过ARP欺骗进行的。有两种办法达到这样的目的。 
(1)向目标发送伪造的ARP应答数据包,其中发送方的IP地址为网关的地址,而MAC地址则为一个伪造的地址。当目标接收到该ARP包,那么就更新自身的ARP缓存。如果该欺骗一直持续下去,那么目标的网关缓存一直是一个被伪造的错误记录。当然,如果有些了解的人查看ARP-a,就知道问题所在了。 
(2)这种方法非常狠,欺骗网关。向网关发送伪造的ARP应答数据包,其中发送方的IP地址为目标的IP地址,而MAC地址则为一个伪造的地址。这样,网关上的目标ARP记录就是一个错误的,网关发送给目标的数据报都是使用了错误的MAC地址。这种情况下,目标能够发送数据到网关,却不能接收到网关的任何数据。同时,目标自己查看ARP-a却看不出任何问题来。 

4、通过ARP检测混杂模式节点 
在混杂模式中,网卡进行包过滤不同于普通模式。本来在普通模式下,只有本地地址的数据包或者广播(多播等)才会被网卡提交给系统核心,否则的话,这些数据包就直接被网卡抛弃。现在,混合模式让所有经过的数据包都传递给系统核心,然后被sniffer等程序利用。 
通过特殊设计的ARP请求可以用来在一定程度上检测处于混杂模式的节点,比如对网络中的每个节点都发送MAC地址为FF-FF-FF-FF-FF-FE的ARP请求。对于网卡来说这不是一个广播地址(FF-FF-FF-FF-FF-FF),所以处于普通模式的节点就会直接抛弃该数据包,但是多数操作系统核心都认为这是一个广播地址,如果有一般的sniffer程序存在,并设置网卡为混杂模式,那么系统核心就会作出应答,这样就可以判断这些节点是否存在嗅探器了。 
可以查看,很多基于ARP的攻击都是通过ARP欺骗实现的。至于ARP欺骗的防范,还是尽可能使用静态的ARP。对于WIN,使用arp-s来进行静态ARP的设置。当然,如果能够完全使用静态的IP+MAC对应,就更好了,因为静态的ARP缓存只是相对的。 
当然,可以有一些方法来实现ARP欺骗的检测。设置一个ARP的嗅探器,其中维护着一个本地网络的IP-MAC地址的静态对应表,查看所有经过的ARP数据,并检查其中的IP-MAC对应关系,如果捕获的IP-MAC对应关系和维护的静态对应关系对应不上,那么就表明是一个欺骗的ARP数据包了。 
一个ARP数据包发送程序源代码和编译好的EXE程序可以参考ARPSender程序。注意:需要先安装WinPcap。

参考链接:http://www.cnpaf.net/Class/arp/200809/22941.html

          http://www.cnblogs.com/luckyxiaoxuan/p/3395527.html

          http://blog.chinaunix.net/uid-20652084-id-1591882.html

          http://blog.chinaunix.net/uid-20652084-id-1591883.html


0 0
原创粉丝点击