giant1st 发表于 2011-12-21 08:43

知识点之ARP相关

<div id="art" style=" margin: 15px">
<div><font color="#F00000" size="4"><b>ARP工作在哪一层? 二层,三层都有道理,2.5层吧!!</b></font><br><br><br>很多教科书和培训教材上,都把ARP协议划分到网络层。我想主要的原因在于ARP协议属于TCP/IP协议簇,而在TCP/IP模型中,所有定义的协议至少是在网际层(或称网络层,IP层)。<br>
但是,按照OSI的标准,当数据向下传递时,每层会加上自己的信息,各层互不干扰.这样当网络层的IP包进入链路层时,链路层该如何加这个头部的目标信息
呢?它要依靠ARP协议来完成.显然如何加链路头并不是网络层的功能.而且,ARP协议工作时,并不使用IP的包头。所以也有很多人说,ARP是链路层
的。<br>
可以说,在TCP/IP模型中,ARP协议属于IP层;在OSI模型中,ARP协议属于链路层。<br>
在sniffer软件中,捕获协议数据时,如果使用IP地址是无法捕获到ARP包的,因为IP地址是ARP协议的载荷,不在包头中。但ARP协议的载荷
中,也并不包含任何上层的IP数据包。所以,构造和使用ARP协议的主体理解IP地址。从这个角度考虑,将ARP协议划分到IP层也有一定道理。<br>
总之,具体到某个协议,它到底属于哪一层,并不是那么严格。到目前为止,理解到此。<br><br>=====================<br><font color="#F00000" size="4"><b>免费ARP包</b></font><br>免费ARP包是标准ARP请求包的特例,目的MAC地址仍是二层广播地址FFFF-FFFF-FFFF,源MAC地址是发送ARP请求主机的MAC地址,然而,<font color="#800000"><b>源IP和目的IP都是发送主机的IP</b></font>。这就是免费ARP包和标准ARP请求包的区别。<br>主要有两个用途:</div>
<div>&nbsp;</div>
<div>1)免费arp可以用于检查重复地址,一个设备可以向自己的IP地址发送ARP请求,如果收到ARP响应则表明存在重复地址</div>
<div>2)免费arp还可以用于通告一个新的数据链路标识,当一个设备收到一个arp请求,如果arp高速缓存中以及有发送者的IP地址,那么与此IP地址相对应的硬件地址将会被发送者新的硬件地址所更新,这种免费arp用途时基于此事实。<br>通过这个功能,足可看出ARP机制的脆弱性。《TCP/IP详解 卷1:协议》第45页23行有这么一句话:“主机接收到任何ARP请求都要完成这个操作”,唉,这就是ARP攻击泛滥的根本原因。不知何时才能得到纠正,全世界统一升级二层ARP协议是个难题。<br><br>代理ARP:<br>三层交换机只有一个MAC地址。。<br><strong><font size="6">1.ARP<br>
</font></strong>首先讲到ARP,ARP是地址解析协议,它的作用是在<strong><font color="#0000ff">以太网环境下</font></strong>,通过3层的IP地址来找寻2层的MAC地址,得到一张ARP缓存表。转发数据的时候根据ARP缓存表来进行传输。下图详细说明数据传输时ARP是如何一步步操作的。<br>
在配置IP地址后,不做任何ping操作,ARP缓存表是这样的:<br>
<br>
<img src="http://www.link-hope.com/zero/ARP1.bmp" border="0"><br>
<br>
当PC去ping R1的时候,你会发现第一个丢包了。像这样<br>
R1#ping 192.168.1.2<br>
Type escape sequence to abort.<br>
Sending 5, 100-byte ICMP Echos to 192.168.1.2, timeout is 2 seconds:<br>
.!!!!<br>
Success rate is 100 percent (5/5), round-trip min/avg/max = 8/25/56 ms<br>
<br>
第一个包其实是做ARP请求去了。PC发现ping的是本网段,会发出ARP广播,向R1请求192.168.1.2的MAC地址。得到回应后ARP表会添加ARP请求得来的相应内容。<br>
<br>
<img src="http://www.link-hope.com/zero/ARP2.bmp" border="0"><br>
<br>
<br>
<strong><font color="#ff0000">PC:</font></strong>这个时候PC再去ping
10.1.1.3会发现ping的不是本网段,由于PC没有路由功能所以不知道该往哪里发送,会按照之前已经配好的默认网关发送出去,一般默认网关会配置
成路由器的接口IP,在这里是192.168.1.2。查看ARP缓存表发现了192.168.1.2对应的MAC地址,就把包交给路由器处理了。<br>
<br>
<font color="#ff0000"><strong>R1:</strong></font>路由器收到去往10.1.1.0网段的数据包会查询路由表,首先查看路由表发现数据该发往FastEthernet 0/1<br>
#show ip route<br>
C&nbsp;&nbsp;    10.1.1.0 is directly connected, FastEthernet0/1<br>
然后查看ARP表是否有下一跳10.1.1.3的MAC地址信息,如果有则按MAC把数据发到下一跳;如果没有则发出ARP查询,查询后获得下一跳地址10.1.1.3的MAC地址,存到ARP缓存表中,然后转发。<br>
<img src="http://www.link-hope.com/zero/ARP3.bmp" border="0"><br>
<br>
数据包发送到R2(已做好静态路由)。同理数据包返回,成功ping通。<br>
<br>
<br>
<br>
<font size="6"><strong>2.代理ARP</strong></font><br>
“什么是代理ARP?代理ARP就是通过使用一个主机(通常为router),来作为指定的设备对另一设备的ARP请求作出应答。”这个可以说是一个官方解释了。大家可以用同一个拓扑来验证一下,在这里我们最常使用<strong><font color="#0000ff">Router关闭路由功能来模拟成PC</font></strong>完成这个实验(左方PC为路由器模拟,在做此实验前请把前一实验的ARP信息清除,建议重启):<br>
<img src="http://www.link-hope.com/zero/ARP4.bmp" border="0"><br>
<br>
PC上不配置默认网关,此时用PC去ping 192.168.1.2和10.1.1.3。会得到以下ARP表<br>
<img src="http://www.link-hope.com/zero/ARP5.bmp" border="0"><br>
由此可见,PC发出ARP请求10.1.1.3的MAC地址,R2以自己的FastEthernet0/0口地址代理R3去回应PC,告诉PC自己的FastEthernet0/0就是10.1.1.3的MAC地址。<br>
结论:有默认网关的的时候PC按默认网关走,没有默认网关的时候路由器通过代理ARP完成通信。<br>
到目前为止一切都看起来那么的合理,那么的顺利。这个实验是一些培训班常做的实验之一。<strong><font color="#ff0000">其实,错了!</font></strong><br>
<br>
问题出在哪里?问题就出在我们是用一台路由器去模拟PC。不管是否关闭路由功能,它始终不是PC,它处理数据的方式与PC也不一样。请大家思考一下,如果是一台PC,在没有默认网关的情况下去ping一个非本网段地址,会出现什么情况?<br>
<img src="http://www.link-hope.com/zero/ARP6.bmp" border="0"><br>
在没有默认网关的情况下ping一个非本网段地址,显示目标网络不可达,然后直接丢包,根本不会发出ARP查询。<br>
PC在什么时候会发出ARP查询呢?ping一个本网段地址的时候(大家可以抓包来验证一下)。其实就是思科文档的这种情况了:<br>
<img src="http://www.link-hope.com/zero/ARP7.bmp" border="0"><br>
<br>
看清楚了,PC-A的IP地址是/16位,PC-D的IP地址是/24位,所以当PC-A去ping
PC-D的时候,PC-A认为是ping同一个网段,会发出ARP请求,这个时候ARP请求就到了路由器上了。路由器如果开启了代理ARP功能,会代替
PC-D给PC-A回应,告诉PC-A路由器的e0口MAC地址00-00-0c-94-36-ab就是PC-D的MAC地址,完成代理ARP操作,保护
了PC-D的MAC地址隐私。<br>
<br>
<strong>我认同这种说法,是合情合理的。但是不禁有个问题,谁会用这么脑残的方法配置IP地址呢?好吧,就当是有。<br>
</strong>以下转自鸟哥的Linux私房菜:<br>
“如果你一開始設計的網路環境就是同一個 C class 的網域,例如 192.168.10.0/24 ,
後來因為某些因素必須要將某些主機搬到比較內部的環境中,例如圖一的 PC2 ~ PC4 。 然後又因為某些因素,所以你不能變更 PC2 ~ PC4
的 IP ,也就是說,有點像底下這樣的圖示:”<br>
<img src="http://www.link-hope.com/zero/arp_proxy.bmp" border="0"><br>
<br>
代理ARP作为这种特殊情况的解决方案是无可厚非的,但是按道理说这种情况万中无一。既然这种情况出现的概率那么低,为什么要把代理ARP设置为默认启
动?这不是浪费资源吗?还存在ARP欺骗等安全隐患,完全可以把代理ARP功能设置为默认关闭。个人意见,有朋友知道原因请告知。<br>
<br>
<br>
<font size="6"><strong>3.三层交换机不同网段关闭路由互通问题</strong></font><br>
破烂熊的问题:<br>
一个三层交换机,f0/1设置成指定为pc同网段的网关的IP,f0/2指定为另一个网段的ip,关闭交换机的路由功能.pc可以ping通f0/2吗?<br>
<br>
破烂熊的答案:<br>
我用dy做实验是可以通的,<br>
pc的目的和自己是不同网段的,pc通过arp学习到网关的mac后,发ping请求给网关,这个ping请求包是一个三层包,这个数据包的格式是
目标mac(网关的),源mac(pc的), 源IP(pc的),目标ip(f0/2的IP)   
网关收到此包后检测数据帧的头部,发现是给自己的,于是解封装,除去帧头部,然后查看ip头部,网关发现目标IP和自己不是处于同一网段,由于三层已经没
有了路由功能,所以没有去查找路由表,正常情况下是先查找路由表的.在有过第一次的转发数据记录后才会去查看arp表而不是路由表,要不然一收到和自己不
网段的包就去找路由表,那arp表有啥用?于是通过查找找到了此IP已经被解析的mac,因为是交换机自身的接口配的IP的地址,当然是存在在路由器
arp中的.也就是说这个目标的ip是不需要学习就可以找到的.查找到后就对帧进行重新封装.然后返回给pc,<br>
纯个人见解,有不同看法的请指证......<br>
<br>
<br>
个人认为非常正确,说的很透彻。但是有一点保留意见,“正常情况下是先查找路由表的”<br>
我认为路由器会先查询ARP缓存表,缓存没有匹配消息才会查询路由表。<br>
“有过第一次的转发数据记录后才会去查看arp表而不是路由表”这点我的想法跟你相同。<br>
<br>
还想补充一点的是,三层交换机只有一个MAC地址。所以以上问题的情况在三层交换机中的ARP缓存表会这样显示:<br>
<img src="http://www.link-hope.com/zero/ARP8.bmp" border="0"><br>
F0/1和F0/2对应的MAC地址是相同的。<br>
<br>
<br>
<strong>最后留个问题:同样关闭路由功能的情况下,我在三层交换机上用F0/1去ping F0/2口能否通?</strong><br></div>
</div>
页: [1]
查看完整版本: 知识点之ARP相关