1、代理ARP概述html
我:当电脑要访问互联网上的服务器,目标MAC是什么?缓存
不少小伙伴在刚学习网络协议的时候,常常这样直接回应:不就是服务器的MAC嘛!安全
这时我会反问:那电脑怎么拿到这个服务器的MAC地址呢?服务器
小伙伴通常都自信的抛出下面两个点:微信
①根据网络通讯中数据封装的原则,通讯双方须要封装源目IP和MAC地址;网络
②若是要拿到目标MAC地址,就须要经过ARP协议进行交互。ide
我:好,确实没毛病,你是指的下面这个意思吧 ==>学习
小伙伴:对对对,是这个意思的。网站
我:好,你再看看下面这个图,再确认下。spa
小伙伴:好像不太对唉,刚才没注意看...... 互联网这么多路由器,根据以前学过的:
①路由器隔离广播域,每一个接口/网段都是独立的广播域;
②ARP请求是二层广播包,广播包无法过路由器,
这样的话,ARP请求广播包根本无法穿越互联网到达目标服务器。
我:那咱们日常上微博逛知乎去京东剁手基本都依据上面这张图,经过DNS协议将域名解析为IP地址,经过ARP协议将IP解析为MAC地址。如今ARP请求没法穿越过去,电脑便没法获取目标服务器的MAC地址,怎么跟它通讯呢?
小伙伴:。。。。。。
上面这个疑惑,我相信每一个学习网络协议的初学者常常会问到,更广泛的状况是,不少工做多年的工程师,也未必可以将下面这几个问题彻底搞清楚:
①电脑访问互联网服务器的时候,ARP询问的内容,真的是问服务器的吗?
②什么是代理ARP?跟ARP有什么区别?什么场景下会用到代理ARP?
③代理ARP跟网关(默认路由)设置有什么关系?
因此,这一篇文章虽然是讲代理ARP,但其实核心内容是围绕代理ARP,解读跨网段通讯过程当中,ARP/代理ARP/网关(默认路由)/数据封装等相关问题。
2、代理ARP原理
当ARP请求目标跨网段时,网关设备收到此ARP请求,会用本身的MAC地址返回给请求者,这即是代理ARP(Proxy ARP)。
上面这张图中,电脑发送ARP请求服务器8.8.8.8的MAC地址,路由器(网关)收到这个请求时会进行判断,因为目标8.8.8.8不属于本网段(即跨网段),此时便返回本身的接口MAC地址给PC,后续电脑访问服务器时,目标MAC直接封装为MAC254。
代理ARP本质是一个"善意的欺骗",是一个"错位"的映射。从图中咱们看到服务器地址的正常映射是<8.8.8.8-MAC2>,而路由器返回给电脑的,倒是 <8.8.8.8-MAC254>。不论是不是"欺骗",至少最终电脑能够与外网的服务器实现通讯,以PC Ping Server为例=>
实际网络中,代理ARP由网络中的网关设备来执行,包括路由器、多层交换机、无线路由器、防火墙等设备。而且,网关即使有代理ARP功能,也未必必定执行,还必须知足两个条件:①网关已经开启代理ARP功能;②网关有目标的路由信息。咱们来看下面这张图=>
上面这张图中,咱们假设路由器已具有全网的路由,但链接电脑的接口没有开启(或不支持)代理ARP功能,此时便形成一个尴尬的状况:电脑反复询问到8.8.8.8的MAC地址,路由器收到以后,处理流程跟正常ARP是一致的,"问本身的回复,不是问本身的丢弃"。所以,当网络通讯采用代理ARP时,可能会"受制于沿途网关设备",形成网络通讯故障。
进一步思考:既然代理ARP不是一种特别流畅的实现,会"受限于别人",那咱们不必必定要使用它。甚至,这里咱们须要搞清一个事实:实际网络中,不管是同网段仍是跨网段通讯(例如访问互联网),绝大状况下都是使用正常的ARP,而不是代理ARP。生活中的上网的经验也已经告诉咱们,好像历来没有遇到或听到过"XXX设备不支持代理ARP功能,致使通讯故障"这样的问题。
不少小伙伴看到这里,会有大大的疑惑:
① "什么! 咱们才刚学习了代理ARP的实现原理,如今竟然告诉说它没怎么用?"
② 那为何要创造代理ARP,它的真正使用场景在哪里??
③ 上述图解中,电脑跨网段通讯时ARP究竟是如何工做的???
接下来给你们划重点:
第一,代理ARP仅仅是正常ARP的一个拓展使用,是可选项而不是必要项;
第二:代理ARP有特定的应用场景,与网关/路由的设置有直接关系:当电脑没有网关/路由功能时,而且须要跨网站通讯时,则会触发代理ARP。换句话说,若是有网关/路由功能,则不须要代理ARP;
第三:正常环境下,当用户接入网络时,都会经过DHCP协议或手工配置的方式获得IP和网关信息(因此不须要代理ARP)。
3、ARP与代理ARP:不是互斥而是互补
在你们理解了代理ARP的工做原理和应用场景以后,接下来咱们终于能够更加全面的分析开篇的这个经典问题:当用户访问互联网的时候,到底用ARP仍是代理ARP?跟网关/路由设置有什么关系?数据封装又有什么区别?
咱们经过下面两张图作个对比=>
当电脑没有网关时,PC Ping 8.8.8.8,采用代理ARP =>
当电脑有网关时,PC Ping 8.8.8.8,采用正常ARP =>
经过上面的对比,咱们获得如下信息:
①电脑没有网关时,ARP直接询问目标IP对应的MAC地址(跨网段),采用代理ARP;
②电脑有网关时,ARP只需询问网关IP对应的MAC地址(同网段),采用正常ARP;
③不管是正常ARP仍是代理ARP,电脑最终都拿到同一个目标MAC地址:网关MAC。
为了让上面这个总结更加的通用性,咱们将原有的网络拓扑稍微复杂化 =>
当电脑没有网关时(采用代理ARP ),PC 依次Ping 8.8.8.八、8.8.4.四、114.114.114.114=>
当电脑有网关时(采用正常ARP ),PC 依次Ping 8.8.8.八、8.8.4.四、114.114.114.114=>
经过上面的拓扑,咱们能够获得更加通用性的总结,概括以下:
①当电脑没有网关(采用代理ARP)时:"跨网段访问谁,就问谁的MAC"
②当电脑有网关(采用正常ARP)时:"跨网段访问谁,都问网关的MAC"
③不管哪一种ARP,跨网段通讯时,发送方请求获得的目标MAC地址都是网关MAC。
注明:网关(Gateway)、下一跳(Next-hop)、路由器(Router)都指的是离发送方最近的三层(或多层)设备,具有三层和路由转发功能。举例:咱们经过WiFi上网时,网关就是无线路由器,它帮忙将电脑和手机的数据转发到互联网;因此,咱们访问互联网时(不管访问谁),电脑和手机采用的目的MAC,都是无线路由器的MAC。有兴趣的小伙伴均可以跟着我验证下(请见下面章节)。
4、ARP与代理ARP实战指南
为了让你们更直观理解,真正"亲眼所见"上面学到的技术原理,这里我带你们在真实网络和虚拟环境分别验证。第一个实验,主要是针对没任何命令基础的小伙伴,你们能够在家就能够实验;第二个实验,主要针对有必定网络和安全基础的小伙伴,经过构造网络虚拟实验环境来验证。
(一)真实网络下ARP与代理ARP实验
这个网络中,个人电脑地址是192.168.199.177,链接到极路由(无线路由器),经过极路由器访问互联网。这个WiFi网络的主机列表状况以下,这里的PC就是个人Macbook。
接下来再看看极路由MAC地址=>
查看个人电脑(Macox系统)IP地址和网关信息,经过命令"ifconfig"查看ip地址=>(Windows系统则经过"ipconfig /all"查看IP地址和网关信息)
经过命令"netstat -rn"查看个人电脑网关设置=>
接下来,个人电脑连续PING 8.8.8.8和114.114.114.114或其余外网地址=>
重点来了,在个人电脑连续访问这么多外网地址以后,咱们来看看ARP表项是怎样的,是否有8.8.8.八、114.114.114.11四、www.pinginglab.net(120.24.59.68)对应的MAC呢?
经过命令"arp -a"查看电脑的ARP缓存信息=>
从最终的ARP内容来看,个人电脑只记录着本机和网关的MAC地址,MAC地址"d4:ee-07:54:c1:9e"就是上面给你们截图的极路由MAC。
经过这个真实网络的实验,咱们能够验证了如下内容:
①真实网络中通常都是正常ARP,而不是代理ARP;
②当电脑有网关(采用正常ARP)时,不管跨网段访问谁,都直接问网关的MAC;
③当第一次获取网关MAC以后,后续的通讯都再也不须要从新进行ARP请求。(这个是比较容易忽略的,而代理ARP每次访问新的外网地址,都须要再次请求)
(二)虚拟环境下ARP与代理ARP实验
网络拓扑采用GNS3搭建,采用C3640操做系统镜像=>
① 首先为各个设备打开接口并配置IP地址:
PC(config)#int f0/0
PC(config-if)#no shutdown
PC(config-if)#ip address 192.168.1.1 255.255.255.0
Router(config)#int f0/0
Router(config-if)#no shutdown
Router(config-if)#ip address 192.168.1.254 255.255.255.0
Router(config-if)#int f1/0
Router(config-if)#no shutdown
Router(config-if)#ip address 8.8.8.1 255.255.255.0
Server(config)#int f0/0
Server(config-if)#no shutdown
Server(config-if)#ip address 8.8.8.8 255.255.255.0
②为各个设备设置路由信息:
a.关闭PC上路由功能,模拟主机并查看路由表(此时的电脑没有设置网关)
PC(config)#no ip routing
PC#show ip route
Default gateway is not set
Host Gateway Last Use Total Uses Interface
b.设置并查看Router和Server路由表,保证联通,模拟互联网(这里Router已有全网的直连路由,Server须要设置返回内网的路由;实际环境应该经过NAT返回,这里再也不深刻)
Router#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route
Gateway of last resort is not set
8.0.0.0/24 is subnetted, 1 subnets
C 8.8.8.0 is directly connected, FastEthernet1/0
C 192.168.1.0/24 is directly connected, FastEthernet0/0
Server(config)#ip route 192.168.1.0 255.255.255.0 8.8.8.1
Server#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route
Gateway of last resort is not set
8.0.0.0/24 is subnetted, 1 subnets
C 8.8.8.0 is directly connected, FastEthernet0/0
S 192.168.1.0/24 [1/0] via 8.8.8.1
③查看PC/Router/Server的接口MAC地址:
PC#show int f0/0
FastEthernet0/0 is up, line protocol is up
Hardware is AmdFE, address is cc05.1f56.0000 (bia cc05.1f56.0000)
Internet address is 192.168.1.1/24
Router#show int f0/0
FastEthernet0/0 is up, line protocol is up
Hardware is AmdFE, address is cc07.1f56.0000 (bia cc07.1f56.0000)
Internet address is 192.168.1.254/24
Router#show int f1/0
FastEthernet1/0 is up, line protocol is up
Hardware is AmdFE, address is cc07.1f56.0010 (bia cc07.1f56.0010)
Internet address is 8.8.8.1/24
Server#show int f0/0
FastEthernet0/0 is up, line protocol is up
Hardware is AmdFE, address is cc06.1f56.0000 (bia cc06.1f56.0000)
Internet address is 8.8.8.8/24
④经过Wireshark抓取PC和Router链路的数据包,并让PC ping Server(8.8.8.8),查看ARP问答信息:
PC#ping 8.8.8.8
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
.!!!! (一个ping来回为一个 ! 标识,而第一个点 . 表明此时正在arp)
Success rate is 80 percent (4/5), round-trip min/avg/max = 44/47/48 ms
从数据包能够看到,因为PC没有设置默认网关,因此直接采用代理ARP方式询问:即直接询问跨网段目的8.8.8.8的IP地址。而因为路由器Router默认开启了代理ARP功能,因此直接用本身的MAC地址回应了。这里的cc:07:1f:56:00:00即路由器的MAC地址。这里顺便查看下PC的arp表:
PC#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 8.8.8.8 9 cc07.1f56.0000 ARPA FastEthernet0/0
Internet 192.168.1.1 - cc05.1f56.0000 ARPA FastEthernet0/0
所以,这里便验证了:当电脑没有设置网关信息,则采用代理ARP。
咱们接着验证另一个点:当采用代理ARP时,会"受限于沿途网关设备",例如网关设备(路由器)可能不支持代理ARP或关闭代理ARP功能,此时电脑就没法与外网IP实现通讯。
怎么验证呢?这里咱们须要关闭路由器接口的代理ARP功能,而且清空电脑PC的arp表=>
Router(config)#int f0/0
Router(config-if)#no ip proxy-arp
PC#clear arp
PC#ping 8.8.8.8
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
查看底层数据包交互过程=>
当路由器关闭代理ARP时,此时电脑"苦苦哀求"外网8.8.8.8的MAC地址,而路由器直接丢弃再也不返回,因为电脑没有目标IP对应的MAC信息,因此通讯失败,即 ...... 咱们来看下此时PC的arp表是怎样的=>
PC#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 8.8.8.8 0 Incomplete ARPA
Internet 192.168.1.1 - cc05.1f56.0000 ARPA FastEthernet0/0
⑤为PC设置默认网关,从新ping 8.8.8.8,看看能不能通=>
PC(config)#ip default-gateway 192.168.1.254
PC#ping 8.8.8.8
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 44/244/1040 ms
能够看到,当电脑具有网关信息以后,此时直接采用ARP询问网关的MAC,即去往8.8.8.8的时候直接询问192.168.1.254的MAC,这个时候无论Router有没有开启代理ARP,也会正常回应PC的ARP询问,咱们来看看底层数据包截图=>
4、代理ARP总结
① 本章节咱们深刻学习了代理ARP的原理和实践,在文章的开头,咱们经过一个引子,帮你们矫正一个误区:跨网段通讯时,就必定要用到代理ARP;
②代理ARP是一个"善意的欺骗",当电脑要跨网段访问外网设备时,网关设备用本身的MAC返回;
③代理ARP和ARP的具体实现,跟电脑是否有设置网关有直接的关系;有网关经过ARP,没网关经过代理ARP;代理ARP能够当作是ARP的补充;
④代理ARP会"受限于沿途网络设备",真实网络里面通常都直接用ARP获取MAC地址。
预告:
什么是免费/无端ARP?
免费ARP的功能是什么?在何时出现?
免费ARP的数据包结构是如何的?
【相关推荐】
新浪微博:@拼客学院陈鑫杰
微信公众号:拼客院长陈鑫杰(搜索"pingsec"即刻关注)