為什麼路由器明明隔離廣播域,仍然可以全網廣播比如ARP協議?

路由器隔離廣播域,為什麼ARP任然會全網廣播自己的IP地址MAC地址 和目標Ip


先說結論,再貼長文:

1、ARP廣播包無法跨網段,路由器也確實隔離廣播,這都沒毛病;

2、無論是否開啟代理ARP,ARP廣播包仍然限制於本地。

接下來,為了讓題主能夠更好的搞清ARP、代理ARP、路由器、ARP廣播跨域、跨網段(即題主提到的"全網")通信等問題,可以閱讀這篇文章:

圖解ARP協議(四)代理ARP:善意的欺騙

一、代理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、http://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協議(二)ARP攻擊篇

圖解ARP協議(一)

《TCP/IP協議棧視頻教程》

《Wireshark協議分析從入門到精通》

新浪微博:@拼客學院陳鑫傑

微信公眾號:拼客院長陳鑫傑(搜索"pingsec"即刻關注)

拼客學院:http://www.pinginglab.net


只能開啟代理arp的時候才會跨廣播域


ARP廣播不會跨廣播域


這個應該不會 這個arp包只是在你的區域網內廣播
如果你要訪問的目標主機不在同一個區域網 那麼你的訪問包就發送給網關 由默認網關幫你處理了


王大鎚在系統初始化時會在全網廣播詢問:誰是王大鎚?
若無回應,則網路中僅有一個王大鎚,王大鎚順利上線。
若有回應,則王大鎚不唯一,王大鎚禁止上線。


推薦閱讀:

IP地址和MAC地址的區別和聯繫是什麼?
TCP連接建立後,下行和上行經過的路由器是一樣的嗎?
B類地址第一個可分派的網路號為什麼不是128.0?
ICMP報文要使用IP頭來發送報文,為什麼ICMP依然與IP在同一層-網路層?
ipv9是什麼,是騙局還是真的有其事?

TAG:路由器 | 計算機網路 | TCPIP |