对代理ARP技术的误读、无法完成代理ARP实验的故障分析

对代理ARP技术的误读、无法完成代理ARP实验的故障分析

问题的提出:

    网络工程技术人员和或者学习者面对ARP代理技术时,通常能理解ARP代理的作用和技术要点是什么,但是无法根据技术描述去实现ARP代理的功能!

 

首先来看一般对代理ARP的定义:


通常根据上述文字的描述,就意味着在如图1所示的环境中,主机192.168.2.2/24可以在不配置默认网关的情况下成功的与路由器R2的192.168.3.2/24通信。其实这种理解是没有错的,但是当用户使用实验来证实代理ARP的作用时,结果却非常的意外,如果在主机192.168.2.2/24上不配置任何网关,路由器R1启动了代理ARP功能,不能让192.168.2.2访问192.168.3.2,对,不能,永远不能,那这是为什么呢,难道是理论定义有错,现在我们来做分析。

首先看验证代理ARP技术时各个通信节点上的原始配置:

计算机192.168.2.2上的配置,如图2所示,确定只配IP地址不配置默认网关:

路由器R1和R2的配置如下所示,默认情况下路由器的代理ARP技术是被启用,可以通过指令showip interface e1/0在路由器R1上来查看并确认,R1的E1/0接口的代理ARP的确是被启动的,如图3所示。

路由器R1的配置:

interfaceEthernet1/0

ip address 192.168.2.1 255.255.255.0

interfaceEthernet1/1

ip address 192.168.3.1 255.255.255.0

routerrip

version 2

network 192.168.2.0

network 192.168.3.0

no auto-summary

路由器R2的配置:

interface Ethernet1/1

ipaddress 192.168.3.2 255.255.255.0

router rip

version 2

network 192.168.3.0

noauto-summary

按照上述的原始配置,那么主机192.168.2.2/24在没配置默认网关的情况下应该就能ping通192.168.3.2,但事实上,如图4所示,结果出乎意外,192.168.2.2根本就无法ping通192.168.3.2。

然后大众会发出几种对故障的猜想和推论:


1 关于代理ARP技术的理论的定义不正确,所以导致了无法完成的实验

能被列入RFC文档的论述,都是得到了比应用级更高的专家(研发级)共同认同的公理,虽然不能说100%就是定论,但是在多数情况下是不被推翻的,所以由于这种原因产生故障的可能性不太,要么就是应用级人员没有彻底理解文档,要么就是实施有误。

2 路由器IOS存在bug(漏洞),所以无法完成实验

种个厂商的IOS的确会存在bug(漏洞),但是这种bug通常会被顶尖的高手和黑客所发现,然后厂商会立即作出反应,对bug进行修复,并公开bug,典型的情况就是用户在查看IOS版本时,比如出现IOS12.2(14),说明这个版本已经经过了14次的修改,修改的次数越多,存在的bug就越少,所以对于代理ARP这种技术存在bug,而没被厂商发现的可能性太小了。

3 不同厂商的设备可能对ARP代理的定义和限制是不同的

这种原因就更不可能,因为网络公理,就相当于数学几何中的证明公理一样,它具备开放和开源性,差别只在于实现的指令和配置方式不同而已,再加上OSI模型的产生,所以所有厂商的技术,除私有特性技术外,都是一样,且必须一样,不然它将无法满足市场兼容性的需求,最终被踢出局。所以这种可能基本不会发生。

注意:任何一种对故障原因的分析和判别,都必须建立在数据、理论、取证三大元素之上,而且三大元素必须联动起来形成一种对故障现象非常有针对的“链条线”!尊重实验事实!

 

故障原因的分析思路与解决方案:

根据代理ARP的定义,如果主机192.168.2.2/24没有配置默认网关,那么它发出对192.168.3.2的ARP请求,将被路由器的R1的E1/0接口所接收,然后R1将代理源主机192.168.2.2去请求192.168.3.2的MAC地址,然后完成不同网络的通信。

一个关键过程是:如果路由器R1确认已经启动代理ARP功能,那么主机192.168.2.2是否发送对192.168.3.2的ARP请求,如果没发送,为什么?如果发送,路由器R1是否成功的执行了代理ARP的这个过程,并将结果返回给主机192.168.3.2,所以这是需要取证的第一个过程,所以在需要在主机192.168.2.2ping192.168.3.2时取证这个过程,如下图5所示,对ping行为的取证时,整个过程主机192.168.2.2都没有发送任何ARP请求,既然通信源主机对目标192.168.3.2的ARP请求都没有,何谈代理ARP的过程,所以确认实验故障是在主机192.168.2.2上,那么,为什么会出现这个故障,主机192.168.2.2为什么不发送针对192.168.3.2的ARP请求。

主机192.168.2.2/24不发送ARP请求的原因:

     基于IPv4的主机在发送ARP请求之前,它会将目标的IP地址拿来和自已的子网掩码求“与”运算,如果目标主机的IP地址与自己的子网掩码在求“与”运算后,确定目标主机和自己的IP不在同一子网,那么该主机在没有配置默认网关的情况下不会发送任何ARP请求,如果配置了默认网关那么该主机会把ARP请求发送给默认网关,在代理ARP这个实验中,主机192.168.2.2子网掩码为255.255.255.0,请大家注意看目标主机192.168.3.2与自己的子网掩码求与得出的网络ID是192.168.3.0;而自己属于192.168.2.0,并没有配置任何默认网关,所以主机192.168.2.2/24根本不会发送任何ARP请求,所以路由器R1上的代理ARP功能根本就没法工作起来,实验怎会不失败!

故障解决方案并验证代理ARP的工作过程:

    然仍保持不配置任何默认网关,然后如下图6所示,将主机的子网掩码改为255.255.0.0(即16位的子网),那么目标主机192.168.3.2和255.255.0.0求“与”运算,得到网络ID为192.168.0.0/16,而改变子网掩码后,自己也属于192.168.0.0/16这个网段,所以主机192.168.2.2可以发送ARP请求,即便是192.168.2.2没有配置默认网关,由于路由器R1的E1/0接口启动了代理ARP,所以R1将代理主机192.168.2.2去对192.168.3.2进行ARP解析,此时即便主机192.168.2.2没有配置任何默认网关也能成功的与192.168.3.2通信如图7所示。

如果用户在完成主机192.168.2.2改变子网掩码为16位,再ping192.168.3.2时,启动了协议分析器,那么就该能捕获如图8所示的数据帧,主机192.168.2.2在网络上询问谁是192.168.3.2的MAC,然后路由器在代理192.168.3.2对主机192.168.2.2做应答,R1使用自己E1/0的MAC地址来应答192.168.2.2。

致此为止,描述了对代理ARP故障的分析与解决,如果此时将路由器R1的E1/0接口的代理ARP功能关闭,会发生什么情况?答案是:主机192.168.2.2在没有配置默认网关的情况下再也无法ping通192.168.3.2,因为现在的连通性是代理ARP在维持。

关闭路由器R1的E1/0接口的代理ARP功能:

R1(config)#intee1/0

R1(config-if)#noip proxy-arp  *关闭代理ARP功能

注意:在关闭代理ARP功能以后,用户在作新的测试之前,如下图10首先在主机上使用ARP –a功能,查看主机的ARP缓存,如果缓存还存有没关闭代理ARP功能之前的解析结果,那么将误导您对代理ARP实验的认识,所以需要使用ARP –d清除缓存中所有的ARP记录,确认主机的ARP表已经被清空,再次ping192.168.3.2,结果是由于在R1上关闭了代理ARP的功能,连通性丢失!


如果在这个过程中,您再次启动协议分析器分析实时通信的数据帧,如下图10所示,只有主机192.168.2.2的N个ARP请求,但是没有应答,原因就是关闭了路由器R1的代理ARP功能,又没有配置默认网关,所以不会对该请求作应答,除非再次启动路由器R1的代理ARP功能。


在实践环境中代理ARP一般用在什么地方,它的优势与不足是什么?

一般在一些网络工程环境中,工程师为了防止用户错误的配置默认网关而导致通信丢失,可能会启动代理ARP功能,或者需要实现对子网划分的透明化,或者三层冗余时也会启动ARP代理。代理ARP有一定冗错的作用,但本人强烈反对这种做法,因为这会造成额外的流量,并构成很大的安全风险特别是在有可能发生ARP欺骗攻击的环境中。建议使用其它的冗余方案来替代它!

时间: 2024-10-17 02:51:44

对代理ARP技术的误读、无法完成代理ARP实验的故障分析的相关文章

雷军:风口论一直被误读 我不是机会主义者

新浪科技讯 4月23日上午消息,2016中国绿公司年会在山东济南举行.雷军在现场做了以“小米的明天:新国货运动”为主题的演讲. 雷军认为,国货不被信任的真正问题出在效率上.国货流通效率太低导致商品价格过高,为了降低商品价格只能降低生产成本,粗制滥造,而且用户体验不好. 为了提高商品流通效率,雷军选择做了小米网,以很低的价格直接卖到用户手上,在看准这个之后,才决定以智能手机作为突破口,也就是说,先有了“新国货运动”,再有了“为发烧而生”的MUI和小米手机. 在演讲中,雷军认为,小米的未来还是要踏踏

杂物论第二 我们一直在误读鲁迅

  杂物论第二 我们一直在误读鲁迅 原文见下面.这里摘引一段: "曾几何时,我们人生中关键的一根筋错乱了,将本是文学家的鲁迅前面硬加上革命家.思想家两大头衔,甚至还有政治家的嫌疑.殊不知,文学见政治就死,搞得鲁迅不会旁的,就会拿'匕首和投枪'扎人,成了'文学屠夫'了,其实不." 第一,  鲁迅所遭受的十年围剿是不可抹杀的,而且鲁迅至死对此一个也不宽恕.这种围剿,至今也没有停止过,尽管打着五颜六色的各种旗号.有些人们不断地给他封着各种各样的"封号",不断地往他的脸上涂

《谷歌宣布Chrome不再信任所有赛门铁克SSL证书》误读新闻的澄清说明

7月31日下午,各大媒体平台以及论坛发布的<Google宣布Chrome不再信任赛门铁克所有SSL证书>的新闻存在标题误读.夸大事实.不符合实际的情况. 关于新闻中的错误主要说明以下几点: 1.首先,赛门铁克的所有SSL证书都可以正常使用.之所以有这样的报道出现是因为:赛门铁克SSL证书签发的PKI系统要进行安全升级,谷歌为了督促赛门铁克此次更新,计划在2018年10月23号Chrome版本发布后,不信任赛门铁克未更新的PKI系统签发的证书,而非不信任赛门铁克所有的SSL证书,这是一个严重的误

WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果?

原文:WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果? 我们想对WCF具有一定了解的人都会知道:在客户端通过服务调用进行服务调用过程中,服务代理应该及时关闭.但是如果服务的代理不等得到及时的关闭,到底具有怎样的后果?什么要关闭服务代理?在任何时候都需要关闭服务代理吗?是否有一些例外呢?本篇文章将会围绕着这些问题展开. 一.会话信道(Sessionful Channel) V.S. 数据报信道(Datagram Channel) WCF通过信道栈实现了消息的编码.传输及基于某些特殊功能对

容易被误读的IOSTAT

iostat(1)是在Linux系统上查看I/O性能最基本的工具,然而对于那些熟悉其它UNIX系统的人来说它是很容易被误读的.比如在HP-UX上 avserv(相当于Linux上的 svctm)是最重要的I/O指标,反映了硬盘设备的性能,它是指I/O请求从SCSI层发出.到I/O完成之后返回SCSI层所消耗的时间,不包括在SCSI队列中的等待时间,所以avserv体现了硬盘设备处理I/O的速度,又被称为disk service time,如果avserv很大,那么肯定是硬件出问题了.然而Linu

为其他对象提供一种代理以控制对这个对象的访问-代理模式

一.前言 在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为“代理”的第三者来实现 间接引用.代理对象可以在客户端和目标对象之间起到 中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务. 通过引入一个新的对象来实现对真实对象的操作或者将新的对 象作为真实对象的一个替身,这种实现机制即 为代理模式,通过引入代理对象来间接访问一 个对象,这就是代理模式的模式动机. 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这

【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理

这篇博文,我们主要以类图和代码的形式来对照学习一下静态代理和动态代理.重点解析各自的优缺点. 定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用. 代理模式不会改变原来的接口和行为,仅仅是转由代理干某件事,代理能够控制原来的目标,比如:代理商,代理商仅仅会买东西,但并不会改变行为.不会制造东西. 让我们通过以下的代码好好理解一下这句话. 分类 静态代理和动态代理 静态代理 静态代理类图 代码演示样例 接口 pac

Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)

第一种代理即Java的动态代理方式上一篇已经分析,在这里不再介绍,现在我们先来了解下GCLIB代理是什么?它又是怎样实现的?和Java动态代理有什么区别? cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. cglib封装了asm,可以在运行期动态生成新的class. cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制. 原理区别: java动态代理是利用反射机

jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)

代理模式是一种很常见的模式,关于底层原理网上看到很多的有关的讲解,但看了一些都觉得比较粗略,很多时候把底层代码copy下来也不大讲解,感觉不如自己详细的写上一篇.本文将以非常详细的说明来分析cglib动态代理底层的实现原理,篇幅较长,但是每个核心方法代码中每步都有说明.还请耐心阅读 1. 举例 使用cglib代理需要引入两个包,maven的话包引入如下 <!-- https://mvnrepository.com/artifact/cglib/cglib --> <dependency&