技术成就梦想

代码如诗

图解ARP协议(四)代理ARP原理与实践(“善意的欺骗”)

2017年8月31日 未分类 0

一、代理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的数据包结构是如何的?

 





【相关推荐】

TCP/IP协议栈视频教程》

《Wireshark协议分析从入门到精通》

《初级网络安全工程师》

新浪微博:@拼客学院陈鑫杰

微信公众号:拼客院长陈鑫杰(搜索”pingsec”即刻关注)

本文出自 “陈鑫杰讲网络与安全” 博客,请务必保留此出处http://chenxinjie.blog.51cto.com/7749507/1961255