圖解ARP協議(四)代理ARP原理與實踐(“善意的欺騙”)


一、代理ARP概述

我:當電腦要訪問互聯網上的服務器,目標MAC是什么?

很多小伙伴在剛學習網絡協議的時候,經常這樣直接回應:不就是服務器的MAC嘛!

 

wKiom1mm5OKSUROxAAFLJK6Bvz8988.png

這時我會反問:那電腦怎么拿到這個服務器的MAC地址呢?

小伙伴一般都自信的拋出下面兩個點:

①根據網絡通信中數據封裝的原則,通信雙方需要封裝源目IP和MAC地址;

②如果要拿到目標MAC地址,就需要通過ARP協議進行交互。

 

我:好,確實沒毛病,你是指的下面這個意思吧 ==>

 

wKioL1mm5N2SHqzCAAIItTEERuI671.png

 

小伙伴:對對對,是這個意思的。

我:好,你再看看下面這個圖,再確認下。

 

wKiom1mm5QGwFbbFAAGwXkYOQMc396.png

 

小伙伴:好像不太對唉,剛才沒注意看...... 互聯網這么多路由器,根據之前學過的:

①路由器隔離廣播域,每個接口/網段都是獨立的廣播域;

②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)。

 

wKioL1mm5PmxCmSCAAJHNEP5SXo883.png

上面這張圖中,電腦發送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為例=>

 

wKiom1mm5SSR_3WyAAIz5oQE4Mw307.png

 

實際網絡中,代理ARP由網絡中的網關設備來執行,包括路由器、多層交換機、無線路由器、防火牆等設備。並且,網關即便有代理ARP功能,也未必一定執行,還必須滿足兩個條件:①網關已經開啟代理ARP功能;②網關有目標的路由信息。我們來看下面這張圖=>

 

wKioL1mm5SvSx2ETAAKWXMXFIOo885.png

 

上面這張圖中,我們假設路由器已具備全網的路由,但連接電腦的接口沒有開啟(或不支持)代理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 =>

 

wKiom1mm5VPjDPMOAAJtvSyRjyY728.png

 

當電腦有網關時,PC Ping 8.8.8.8,采用正常ARP =>

wKiom1mm5XuwH8HhAAKTD90Y1DY629.png

 

通過上面的對比,我們得到以下信息:

①電腦沒有網關時,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=> 

wKioL1mm5ZKgIBGTAATtHcu7wv0626.png

 

當電腦有網關時(采用正常ARP ),PC 依次Ping 8.8.8.8、8.8.4.4、114.114.114.114=>

wKioL1mm5bDzM7-HAATnSUywH0Y812.png

 

通過上面的拓撲,我們可以得到更加通用性的總結,歸納如下:

①當電腦沒有網關(采用代理ARP)時:"跨網段訪問誰,就問誰的MAC"

②當電腦有網關(采用正常ARP)時:"跨網段訪問誰,都問網關的MAC"

③無論哪種ARP,跨網段通信時,發送方請求得到的目標MAC地址都是網關MAC。

 

注明:網關(Gateway)、下一跳(Next-hop)、路由器(Router)都指的是離發送方最近的三層(或多層)設備,具備三層和路由轉發功能。舉例:我們通過WiFi上網時,網關就是無線路由器,它幫忙將電腦和手機的數據轉發到互聯網;所以,我們訪問互聯網時(無論訪問誰),電腦和手機采用的目的MAC,都是無線路由器的MAC。有興趣的小伙伴都可以跟着我驗證下(請見下面章節)。

 

 

四、ARP與代理ARP實戰指南

為了讓大家更直觀理解,真正"親眼所見"上面學到的技術原理,這里我帶大家在真實網絡和虛擬環境分別驗證。第一個實驗,主要是針對沒任何命令基礎的小伙伴,大家可以在家就可以實驗;第二個實驗,主要針對有一定網絡和安全基礎的小伙伴,通過構造網絡虛擬實驗環境來驗證。

 

(一)真實網絡下ARP與代理ARP實驗

 

wKiom1mm5eHhXTgCAATL0E1TBp4934.png

這個網絡中,我的電腦地址是192.168.199.177,連接到極路由(無線路由器),通過極路由器訪問互聯網。這個WiFi網絡的主機列表情況如下,這里的PC就是我的Macbook。

 

wKiom1mm5fOxhvM2AAM99XZWEcg029.png

 

接下來再看看極路由MAC地址=>

 

wKioL1mm5evy7oirAAIVFlwNFvw107.png

 

查看我的電腦(Macox系統)IP地址和網關信息,通過命令"ifconfig"查看ip地址=>(Windows系統則通過"ipconfig /all"查看IP地址和網關信息)

 

wKiom1mm5hPibcJ_AAS2uf3Ki-Y876.png

 

通過命令"netstat -rn"查看我的電腦網關設置=>

 

wKioL1mm5hDyc2dQAAHzAQuIlV8888.png

 

接下來,我的電腦連續PING 8.8.8.8和114.114.114.114或其他外網地址=>

 

wKioL1mm5iOCt_FgAAYa0BgSCgw121.png

 

重點來了,在我的電腦連續訪問這么多外網地址之后,我們來看看ARP表項是怎樣的,是否有8.8.8.8、114.114.114.114、www.pinginglab.net(120.24.59.68)對應的MAC呢?

 

通過命令"arp -a"查看電腦的ARP緩存信息=>

 

wKioL1mm5jSyXCamAAF0Z3bt6k0108.png

從最終的ARP內容來看,我的電腦只記錄着本機和網關的MAC地址,MAC地址"d4:ee-07:54:c1:9e"就是上面給大家截圖的極路由MAC。

 

 

通過這個真實網絡的實驗,我們可以驗證了以下內容:

①真實網絡中一般都是正常ARP,而不是代理ARP;

②當電腦有網關(采用正常ARP)時,無論跨網段訪問誰,都直接問網關的MAC;

③當第一次獲取網關MAC之后,后續的通信都不再需要重新進行ARP請求。(這個是比較容易忽略的,而代理ARP每次訪問新的外網地址,都需要再次請求)

 

 

(二)虛擬環境下ARP與代理ARP實驗

網絡拓撲采用GNS3搭建,采用C3640操作系統鏡像=>

 

wKiom1mm5lyCFarGAAGtSwD4_dY840.png

① 首先為各個設備打開接口並配置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

 

wKiom1mm5nSh_KAvAAqLnE0bOoU603.png

 

從數據包可以看到,由於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)

 

查看底層數據包交互過程=>

 

wKioL1mm5oHh2PbbAAwHw8w5r5o755.png

 

當路由器關閉代理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詢問,我們來看看底層數據包截圖=>

 

wKiom1mm5rWTPNKxAAtviuOFW7Q323.png

 

四、代理ARP總結

① 本章節我們深入學習了代理ARP的原理和實踐,在文章的開頭,我們通過一個引子,幫大家矯正一個誤區:跨網段通信時,就一定要用到代理ARP;

②代理ARP是一個"善意的欺騙",當電腦要跨網段訪問外網設備時,網關設備用自己的MAC返回;

③代理ARP和ARP的具體實現,跟電腦是否有設置網關有直接的關系;有網關通過ARP,沒網關通過代理ARP;代理ARP可以看成是ARP的補充;

④代理ARP會"受限於沿途網絡設備",真實網絡里面一般都直接用ARP獲取MAC地址。

 

 

 

預告:

什么是免費/無故ARP?

免費ARP的功能是什么?在什么時候出現?

免費ARP的數據包結構是如何的?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM