图解ARP协议(四)代理ARP原理与实践(“善意的欺骗”)
一、代理ARP概述
我:當(dāng)電腦要訪問互聯(lián)網(wǎng)上的服務(wù)器,目標(biāo)MAC是什么?
很多小伙伴在剛學(xué)習(xí)網(wǎng)絡(luò)協(xié)議的時(shí)候,經(jīng)常這樣直接回應(yīng):不就是服務(wù)器的MAC嘛!
?
這時(shí)我會(huì)反問:那電腦怎么拿到這個(gè)服務(wù)器的MAC地址呢?
小伙伴一般都自信的拋出下面兩個(gè)點(diǎn):
①根據(jù)網(wǎng)絡(luò)通信中數(shù)據(jù)封裝的原則,通信雙方需要封裝源目IP和MAC地址;
②如果要拿到目標(biāo)MAC地址,就需要通過ARP協(xié)議進(jìn)行交互。
?
我:好,確實(shí)沒毛病,你是指的下面這個(gè)意思吧 ==>
?
?
小伙伴:對對對,是這個(gè)意思的。
我:好,你再看看下面這個(gè)圖,再確認(rèn)下。
?
?
小伙伴:好像不太對唉,剛才沒注意看...... 互聯(lián)網(wǎng)這么多路由器,根據(jù)之前學(xué)過的:
①路由器隔離廣播域,每個(gè)接口/網(wǎng)段都是獨(dú)立的廣播域;
②ARP請求是二層廣播包,廣播包沒法過路由器,
這樣的話,ARP請求廣播包根本沒法穿越互聯(lián)網(wǎng)到達(dá)目標(biāo)服務(wù)器。
?
我:那我們平常上微博逛知乎去京東剁手基本都依據(jù)上面這張圖,通過DNS協(xié)議將域名解析為IP地址,通過ARP協(xié)議將IP解析為MAC地址。現(xiàn)在ARP請求無法穿越過去,電腦便無法獲取目標(biāo)服務(wù)器的MAC地址,怎么跟它通信呢?
小伙伴:。。。。。。
?
上面這個(gè)疑惑,我相信每個(gè)學(xué)習(xí)網(wǎng)絡(luò)協(xié)議的初學(xué)者經(jīng)常會(huì)問到,更普遍的情況是,很多工作多年的工程師,也未必能夠?qū)⑾旅孢@幾個(gè)問題完全搞清楚:
?
①電腦訪問互聯(lián)網(wǎng)服務(wù)器的時(shí)候,ARP詢問的內(nèi)容,真的是問服務(wù)器的嗎?
②什么是代理ARP?跟ARP有什么區(qū)別?什么場景下會(huì)用到代理ARP?
③代理ARP跟網(wǎng)關(guān)(默認(rèn)路由)設(shè)置有什么關(guān)系?
?
所以,這一篇文章雖然是講代理ARP,但其實(shí)核心內(nèi)容是圍繞代理ARP,解讀跨網(wǎng)段通信過程中,ARP/代理ARP/網(wǎng)關(guān)(默認(rèn)路由)/數(shù)據(jù)封裝等相關(guān)問題。
?
?
二、代理ARP原理
當(dāng)ARP請求目標(biāo)跨網(wǎng)段時(shí),網(wǎng)關(guān)設(shè)備收到此ARP請求,會(huì)用自己的MAC地址返回給請求者,這便是代理ARP(Proxy ARP)。
?
上面這張圖中,電腦發(fā)送ARP請求服務(wù)器8.8.8.8的MAC地址,路由器(網(wǎng)關(guān))收到這個(gè)請求時(shí)會(huì)進(jìn)行判斷,由于目標(biāo)8.8.8.8不屬于本網(wǎng)段(即跨網(wǎng)段),此時(shí)便返回自己的接口MAC地址給PC,后續(xù)電腦訪問服務(wù)器時(shí),目標(biāo)MAC直接封裝為MAC254。
?
代理ARP本質(zhì)是一個(gè)"善意的欺騙",是一個(gè)"錯(cuò)位"的映射。從圖中我們看到服務(wù)器地址的正常映射是<8.8.8.8-MAC2>,而路由器返回給電腦的,卻是 <8.8.8.8-MAC254>。不管是不是"欺騙",至少最終電腦可以與外網(wǎng)的服務(wù)器實(shí)現(xiàn)通信,以PC Ping Server為例=>
?
實(shí)際網(wǎng)絡(luò)中,代理ARP由網(wǎng)絡(luò)中的網(wǎng)關(guān)設(shè)備來執(zhí)行,包括路由器、多層交換機(jī)、無線路由器、防火墻等設(shè)備。并且,網(wǎng)關(guān)即便有代理ARP功能,也未必一定執(zhí)行,還必須滿足兩個(gè)條件:①網(wǎng)關(guān)已經(jīng)開啟代理ARP功能;②網(wǎng)關(guān)有目標(biāo)的路由信息。我們來看下面這張圖=>
?
?
上面這張圖中,我們假設(shè)路由器已具備全網(wǎng)的路由,但連接電腦的接口沒有開啟(或不支持)代理ARP功能,此時(shí)便造成一個(gè)尷尬的情況:電腦反復(fù)詢問到8.8.8.8的MAC地址,路由器收到之后,處理流程跟正常ARP是一致的,"問自己的回復(fù),不是問自己的丟棄"。因此,當(dāng)網(wǎng)絡(luò)通信采用代理ARP時(shí),可能會(huì)"受制于沿途網(wǎng)關(guān)設(shè)備",造成網(wǎng)絡(luò)通信故障。
?
進(jìn)一步思考:既然代理ARP不是一種特別流暢的實(shí)現(xiàn),會(huì)"受限于別人",那我們沒必要一定要使用它。甚至,這里我們需要搞清一個(gè)事實(shí):實(shí)際網(wǎng)絡(luò)中,無論是同網(wǎng)段還是跨網(wǎng)段通信(例如訪問互聯(lián)網(wǎng)),絕大情況下都是使用正常的ARP,而不是代理ARP。生活中的上網(wǎng)的經(jīng)驗(yàn)也已經(jīng)告訴我們,好像從來沒有遇到或聽到過"XXX設(shè)備不支持代理ARP功能,導(dǎo)致通信故障"這樣的問題。
?
很多小伙伴看到這里,會(huì)有大大的疑惑:
① "什么! 我們才剛學(xué)習(xí)了代理ARP的實(shí)現(xiàn)原理,現(xiàn)在居然告訴說它沒怎么用?"
② 那為什么要?jiǎng)?chuàng)造代理ARP,它的真正使用場景在哪里??
③ 上述圖解中,電腦跨網(wǎng)段通信時(shí)ARP到底是如何工作的???
?
接下來給大家劃重點(diǎn):
第一,代理ARP僅僅是正常ARP的一個(gè)拓展使用,是可選項(xiàng)而不是必要項(xiàng);
第二:代理ARP有特定的應(yīng)用場景,與網(wǎng)關(guān)/路由的設(shè)置有直接關(guān)系:當(dāng)電腦沒有網(wǎng)關(guān)/路由功能時(shí),并且需要跨網(wǎng)站通信時(shí),則會(huì)觸發(fā)代理ARP。換句話說,如果有網(wǎng)關(guān)/路由功能,則不需要代理ARP;
第三:正常環(huán)境下,當(dāng)用戶接入網(wǎng)絡(luò)時(shí),都會(huì)通過DHCP協(xié)議或手工配置的方式得到IP和網(wǎng)關(guān)信息(所以不需要代理ARP)。
?
?
三、ARP與代理ARP:不是互斥而是互補(bǔ)
在大家理解了代理ARP的工作原理和應(yīng)用場景之后,接下來我們終于可以更加全面的分析開篇的這個(gè)經(jīng)典問題:當(dāng)用戶訪問互聯(lián)網(wǎng)的時(shí)候,到底用ARP還是代理ARP?跟網(wǎng)關(guān)/路由設(shè)置有什么關(guān)系?數(shù)據(jù)封裝又有什么區(qū)別?
?
我們通過下面兩張圖做個(gè)對比=>
?
當(dāng)電腦沒有網(wǎng)關(guān)時(shí),PC Ping 8.8.8.8,采用代理ARP =>
?
?
當(dāng)電腦有網(wǎng)關(guān)時(shí),PC Ping 8.8.8.8,采用正常ARP =>
?
通過上面的對比,我們得到以下信息:
①電腦沒有網(wǎng)關(guān)時(shí),ARP直接詢問目標(biāo)IP對應(yīng)的MAC地址(跨網(wǎng)段),采用代理ARP;
②電腦有網(wǎng)關(guān)時(shí),ARP只需詢問網(wǎng)關(guān)IP對應(yīng)的MAC地址(同網(wǎng)段),采用正常ARP;
③無論是正常ARP還是代理ARP,電腦最終都拿到同一個(gè)目標(biāo)MAC地址:網(wǎng)關(guān)MAC。
?
為了讓上面這個(gè)總結(jié)更加的通用性,我們將原有的網(wǎng)絡(luò)拓?fù)渖晕?fù)雜化 =>
?
當(dāng)電腦沒有網(wǎng)關(guān)時(shí)(采用代理ARP ),PC 依次Ping 8.8.8.8、8.8.4.4、114.114.114.114=>?
?
當(dāng)電腦有網(wǎng)關(guān)時(shí)(采用正常ARP ),PC 依次Ping 8.8.8.8、8.8.4.4、114.114.114.114=>
?
通過上面的拓?fù)?#xff0c;我們可以得到更加通用性的總結(jié),歸納如下:
①當(dāng)電腦沒有網(wǎng)關(guān)(采用代理ARP)時(shí):"跨網(wǎng)段訪問誰,就問誰的MAC"
②當(dāng)電腦有網(wǎng)關(guān)(采用正常ARP)時(shí):"跨網(wǎng)段訪問誰,都問網(wǎng)關(guān)的MAC"
③無論哪種ARP,跨網(wǎng)段通信時(shí),發(fā)送方請求得到的目標(biāo)MAC地址都是網(wǎng)關(guān)MAC。
?
注明:網(wǎng)關(guān)(Gateway)、下一跳(Next-hop)、路由器(Router)都指的是離發(fā)送方最近的三層(或多層)設(shè)備,具備三層和路由轉(zhuǎn)發(fā)功能。舉例:我們通過WiFi上網(wǎng)時(shí),網(wǎng)關(guān)就是無線路由器,它幫忙將電腦和手機(jī)的數(shù)據(jù)轉(zhuǎn)發(fā)到互聯(lián)網(wǎng);所以,我們訪問互聯(lián)網(wǎng)時(shí)(無論訪問誰),電腦和手機(jī)采用的目的MAC,都是無線路由器的MAC。有興趣的小伙伴都可以跟著我驗(yàn)證下(請見下面章節(jié))。
?
?
四、ARP與代理ARP實(shí)戰(zhàn)指南
為了讓大家更直觀理解,真正"親眼所見"上面學(xué)到的技術(shù)原理,這里我?guī)Т蠹?strong>在真實(shí)網(wǎng)絡(luò)和虛擬環(huán)境分別驗(yàn)證。第一個(gè)實(shí)驗(yàn),主要是針對沒任何命令基礎(chǔ)的小伙伴,大家可以在家就可以實(shí)驗(yàn);第二個(gè)實(shí)驗(yàn),主要針對有一定網(wǎng)絡(luò)和安全基礎(chǔ)的小伙伴,通過構(gòu)造網(wǎng)絡(luò)虛擬實(shí)驗(yàn)環(huán)境來驗(yàn)證。
?
(一)真實(shí)網(wǎng)絡(luò)下ARP與代理ARP實(shí)驗(yàn)
?
這個(gè)網(wǎng)絡(luò)中,我的電腦地址是192.168.199.177,連接到極路由(無線路由器),通過極路由器訪問互聯(lián)網(wǎng)。這個(gè)WiFi網(wǎng)絡(luò)的主機(jī)列表情況如下,這里的PC就是我的Macbook。
?
?
接下來再看看極路由MAC地址=>
?
?
查看我的電腦(Macox系統(tǒng))IP地址和網(wǎng)關(guān)信息,通過命令"ifconfig"查看ip地址=>(Windows系統(tǒng)則通過"ipconfig /all"查看IP地址和網(wǎng)關(guān)信息)
?
?
通過命令"netstat -rn"查看我的電腦網(wǎng)關(guān)設(shè)置=>
?
?
接下來,我的電腦連續(xù)PING 8.8.8.8和114.114.114.114或其他外網(wǎng)地址=>
?
?
重點(diǎn)來了,在我的電腦連續(xù)訪問這么多外網(wǎng)地址之后,我們來看看ARP表項(xiàng)是怎樣的,是否有8.8.8.8、114.114.114.114、www.pinginglab.net(120.24.59.68)對應(yīng)的MAC呢?
?
通過命令"arp -a"查看電腦的ARP緩存信息=>
?
從最終的ARP內(nèi)容來看,我的電腦只記錄著本機(jī)和網(wǎng)關(guān)的MAC地址,MAC地址"d4:ee-07:54:c1:9e"就是上面給大家截圖的極路由MAC。
?
?
通過這個(gè)真實(shí)網(wǎng)絡(luò)的實(shí)驗(yàn),我們可以驗(yàn)證了以下內(nèi)容:
①真實(shí)網(wǎng)絡(luò)中一般都是正常ARP,而不是代理ARP;
②當(dāng)電腦有網(wǎng)關(guān)(采用正常ARP)時(shí),無論跨網(wǎng)段訪問誰,都直接問網(wǎng)關(guān)的MAC;
③當(dāng)?shù)谝淮潍@取網(wǎng)關(guān)MAC之后,后續(xù)的通信都不再需要重新進(jìn)行ARP請求。(這個(gè)是比較容易忽略的,而代理ARP每次訪問新的外網(wǎng)地址,都需要再次請求)
?
?
(二)虛擬環(huán)境下ARP與代理ARP實(shí)驗(yàn)
網(wǎng)絡(luò)拓?fù)洳捎?strong>GNS3搭建,采用C3640操作系統(tǒng)鏡像=>
?
① 首先為各個(gè)設(shè)備打開接口并配置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
?
②為各個(gè)設(shè)備設(shè)置路由信息:
a.關(guān)閉PC上路由功能,模擬主機(jī)并查看路由表(此時(shí)的電腦沒有設(shè)置網(wǎng)關(guān))
PC(config)#no ip routing
PC#show ip route
Default gateway is not set
Host?????????????? Gateway?????????? Last Use??? Total Uses? Interface
b.設(shè)置并查看Router和Server路由表,保證聯(lián)通,模擬互聯(lián)網(wǎng)(這里Router已有全網(wǎng)的直連路由,Server需要設(shè)置返回內(nèi)網(wǎng)的路由;實(shí)際環(huán)境應(yīng)該通過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鏈路的數(shù)據(jù)包,并讓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:
.!!!!?? (一個(gè)ping來回為一個(gè) ! 標(biāo)識(shí),而第一個(gè)點(diǎn) . 代表此時(shí)正在arp)
Success rate is 80 percent (4/5), round-trip min/avg/max = 44/47/48 ms
?
?
從數(shù)據(jù)包可以看到,由于PC沒有設(shè)置默認(rèn)網(wǎng)關(guān),所以直接采用代理ARP方式詢問:即直接詢問跨網(wǎng)段目的8.8.8.8的IP地址。而由于路由器Router默認(rèn)開啟了代理ARP功能,所以直接用自己的MAC地址回應(yīng)了。這里的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
?
因此,這里便驗(yàn)證了:當(dāng)電腦沒有設(shè)置網(wǎng)關(guān)信息,則采用代理ARP。
我們接著驗(yàn)證另外一個(gè)點(diǎn):當(dāng)采用代理ARP時(shí),會(huì)"受限于沿途網(wǎng)關(guān)設(shè)備",例如網(wǎng)關(guān)設(shè)備(路由器)可能不支持代理ARP或關(guān)閉代理ARP功能,此時(shí)電腦就無法與外網(wǎng)IP實(shí)現(xiàn)通信。
?
怎么驗(yàn)證呢?這里我們需要關(guān)閉路由器接口的代理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)
?
查看底層數(shù)據(jù)包交互過程=>
?
?
當(dāng)路由器關(guān)閉代理ARP時(shí),此時(shí)電腦"苦苦哀求"外網(wǎng)8.8.8.8的MAC地址,而路由器直接丟棄不再返回,由于電腦沒有目標(biāo)IP對應(yīng)的MAC信息,所以通信失敗,即 ?......?我們來看下此時(shí)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設(shè)置默認(rèn)網(wǎng)關(guān),重新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
?
可以看到,當(dāng)電腦具備網(wǎng)關(guān)信息之后,此時(shí)直接采用ARP詢問網(wǎng)關(guān)的MAC,即去往8.8.8.8的時(shí)候直接詢問192.168.1.254的MAC,這個(gè)時(shí)候不管Router有沒有開啟代理ARP,也會(huì)正常回應(yīng)PC的ARP詢問,我們來看看底層數(shù)據(jù)包截圖=>
?
?
四、代理ARP總結(jié)
① 本章節(jié)我們深入學(xué)習(xí)了代理ARP的原理和實(shí)踐,在文章的開頭,我們通過一個(gè)引子,幫大家矯正一個(gè)誤區(qū):跨網(wǎng)段通信時(shí),就一定要用到代理ARP;
②代理ARP是一個(gè)"善意的欺騙",當(dāng)電腦要跨網(wǎng)段訪問外網(wǎng)設(shè)備時(shí),網(wǎng)關(guān)設(shè)備用自己的MAC返回;
③代理ARP和ARP的具體實(shí)現(xiàn),跟電腦是否有設(shè)置網(wǎng)關(guān)有直接的關(guān)系;有網(wǎng)關(guān)通過ARP,沒網(wǎng)關(guān)通過代理ARP;代理ARP可以看成是ARP的補(bǔ)充;
④代理ARP會(huì)"受限于沿途網(wǎng)絡(luò)設(shè)備",真實(shí)網(wǎng)絡(luò)里面一般都直接用ARP獲取MAC地址。
總結(jié)
以上是生活随笔為你收集整理的图解ARP协议(四)代理ARP原理与实践(“善意的欺骗”)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图解ARP协议(六)RARP与IARP:
- 下一篇: 聊聊“数据安全与数据治理”那些事