一、代理ARP概述
我:当电脑要访问互联网上的服务器,目标MAC是什么?
很多小伙伴在刚学习网络协议的时候,经常这样直接回应:不就是服务器的MAC嘛!
这时我会反问:那电脑怎么拿到这个服务器的MAC地址呢?
小伙伴一般都自信的抛出下面两个点:
①根据网络通信中数据封装的原则,通信双方需要封装源目IP和MAC地址;
②如果要拿到目标MAC地址,就需要通过ARP协议进行交互。
我:好,确实没毛病,你是指的下面这个意思吧 ==>
小伙伴:对对对,是这个意思的。
我:好,你再看看下面这个图,再确认下。
小伙伴:好像不太对唉,刚才没注意看...... 互联网这么多路由器,根据之前学过的:
①路由器隔离广播域,每个接口/网段都是独立的广播域;
②ARP请求是二层广播包,广播包没法过路由器,
这样的话,ARP请求广播包根本没法穿越互联网到达目标服务器。
我:那我们平常上微博逛知乎去京东剁手基本都依据上面这张图,通过DNS协议将域名解析为IP地址,通过ARP协议将IP解析为MAC地址。现在ARP请求无法穿越过去,电脑便无法获取目标服务器的MAC地址,怎么跟它通信呢?
小伙伴:。。。。。。
上面这个疑惑,我相信每个学习网络协议的初学者经常会问到,更普遍的情况是,很多工作多年的工程师,也未必能够将下面这几个问题完全搞清楚:
①电脑访问互联网服务器的时候,ARP询问的内容,真的是问服务器的吗?
②什么是代理ARP?跟ARP有什么区别?什么场景下会用到代理ARP?
③代理ARP跟网关(默认路由)设置有什么关系?
所以,这一篇文章虽然是讲代理ARP,但其实核心内容是围绕代理ARP,解读跨网段通信过程中,ARP/代理ARP/网关(默认路由)/数据封装等相关问题。
二、代理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)。
三、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.8.4.4、114.114.114.114=>
当电脑有网关时(采用正常ARP ),PC 依次Ping 8.8.8.8、8.8.4.4、114.114.114.114=>
通过上面的拓扑,我们可以得到更加通用性的总结,归纳如下:
①当电脑没有网关(采用代理ARP)时:"跨网段访问谁,就问谁的MAC"
②当电脑有网关(采用正常ARP)时:"跨网段访问谁,都问网关的MAC"
③无论哪种ARP,跨网段通信时,发送方请求得到的目标MAC地址都是网关MAC。
注明:网关(Gateway)、下一跳(Next-hop)、路由器(Router)都指的是离发送方最近的三层(或多层)设备,具备三层和路由转发功能。举例:我们通过WiFi上网时,网关就是无线路由器,它帮忙将电脑和手机的数据转发到互联网;所以,我们访问互联网时(无论访问谁),电脑和手机采用的目的MAC,都是无线路由器的MAC。有兴趣的小伙伴都可以跟着我验证下(请见下面章节)。
四、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.8、114.114.114.114、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询问,我们来看看底层数据包截图=>
四、代理ARP总结
① 本章节我们深入学习了代理ARP的原理和实践,在文章的开头,我们通过一个引子,帮大家矫正一个误区:跨网段通信时,就一定要用到代理ARP;
②代理ARP是一个"善意的欺骗",当电脑要跨网段访问外网设备时,网关设备用自己的MAC返回;
③代理ARP和ARP的具体实现,跟电脑是否有设置网关有直接的关系;有网关通过ARP,没网关通过代理ARP;代理ARP可以看成是ARP的补充;
④代理ARP会"受限于沿途网络设备",真实网络里面一般都直接用ARP获取MAC地址。
预告:
什么是免费/无故ARP?
免费ARP的功能是什么?在什么时候出现?
免费ARP的数据包结构是如何的?
【相关推荐】
新浪微博:@拼客学院陈鑫杰
微信公众号:拼客院长陈鑫杰(搜索"pingsec"即刻关注)
本文出自 “陈鑫杰讲网络与安全” 博客,请务必保留此出处http://chenxinjie.blog.51cto.com/7749507/1961255
原文地址:http://chenxinjie.blog.51cto.com/7749507/1961255