proxy-arp引起的無法從DHCP獲取到IP地址

公司採用電信光纖,分配了5個IP地址,爲了方便使用,將光貓的網線直接接入到交換機中。

Cisco 2911路由器的的Outside和Inside的網絡都從交換機中接線。


因爲Cisco路由器默認是開啓proxy-arp,所以當Outside收到廣播的ARP信息後,因Inside的網段與廣播的網段處於同一個網段,於是路由器就返回了Outside的的MAC地址。


當電腦使用DHCP從服務器獲取IP後,檢查到此IP地址已經與路由器上的Outside MAC綁定,於是DHCP就錯誤地認爲此IP已經在使用,並標記爲Dirty IP。於是客戶端就無法獲取到IP地址。


關於proxy-arp相關資料如下:

https://learningnetwork.cisco.com/docs/DOC-10774

1.ARP
首先講到ARP,ARP是地址解析協議,它的作用是在以太網環境下,通過3層的IP地址來找尋2層的MAC地址,得到一張ARP緩存表。轉發數據的時候根據ARP緩存表來進行傳輸。下圖詳細說明數據傳輸時ARP是如何一步步操作的。
在配置IP地址後,不做任何ping操作,ARP緩存表是這樣的:

 

ARP1.bmp

 

當PC去ping R1的時候,你會發現第一個丟包了。像這樣
R1#ping 192.168.1.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.1.2, timeout is 2 seconds:
.!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 8/25/56 ms

 

第一個包其實是做ARP請求去了。PC發現ping的是本網段,會發出ARP廣播,向R1請求192.168.1.2的MAC地址。得到迴應後ARP表會添加ARP請求得來的相應內容。

 

ARP2.bmp

 


PC:這個時候PC再去ping 10.1.1.3會發現ping的不是本網段,由於PC沒有路由功能所以不知道該往哪裏發送,會按照之前已經配好的默認網關發送出去,一般默認網關會配置成路由器的接口IP,在這裏是192.168.1.2。查看ARP緩存表發現了192.168.1.2對應的MAC地址,就把包交給路由器處理了。

 

R1:路由器收到去往10.1.1.0網段的數據包會查詢路由表,首先查看路由表發現數據該發往FastEthernet 0/1
#show ip route
C       10.1.1.0 is directly connected, FastEthernet0/1
然後查看ARP表是否有下一跳10.1.1.3的MAC地址信息,如果有則按MAC把數據發到下一跳;如果沒有則發出ARP查詢,查詢後獲得下一跳地址10.1.1.3的MAC地址,存到ARP緩存表中,然後轉發。
ARP3.bmp

 

數據包發送到R2(已做好靜態路由)。同理數據包返回,成功ping通。

 

 

 

2.代理ARP
“什麼是代理ARP?代理ARP就是通過使用一個主機(通常爲router),來作爲指定的設備對另一設備的ARP請求作出應答。”這個可以說是一個官方解釋了。大家可以用同一個拓撲來驗證一下,在這裏我們最常使用Router關閉路由功能來模擬成PC完成這個實驗(左方PC爲路由器模擬,在做此實驗前請把前一實驗的ARP信息清除,建議重啓):
ARP4.bmp

 

PC上不配置默認網關,此時用PC去ping 192.168.1.2和10.1.1.3。會得到以下ARP表
ARP5.bmp
由此可見,PC發出ARP請求10.1.1.3的MAC地址,R2以自己的FastEthernet0/0口地址代理R3去迴應PC,告訴PC自己的FastEthernet0/0就是10.1.1.3的MAC地址。
結論:有默認網關的的時候PC按默認網關走,沒有默認網關的時候路由器通過代理ARP完成通信。
到目前爲止一切都看起來那麼的合理,那麼的順利。這個實驗是一些培訓班常做的實驗之一。其實,錯了!

 

問題出在哪裏?問題就出在我們是用一臺路由器去模擬PC。不管是否關閉路由功能,它始終不是PC,它處理數據的方式與PC也不一樣。請大家思考一下,如果是一臺PC,在沒有默認網關的情況下去ping一個非本網段地址,會出現什麼情況?
ARP6.bmp
在沒有默認網關的情況下ping一個非本網段地址,顯示目標網絡不可達,然後直接丟包,根本不會發出ARP查詢。
PC在什麼時候會發出ARP查詢呢?ping一個本網段地址的時候(大家可以抓包來驗證一下)。其實就是思科文檔的這種情況了:
ARP7.bmp

 

看清楚了,PC-A的IP地址是/16位,PC-D的IP地址是/24位,所以當PC-A去ping PC-D的時候,PC-A認爲是ping同一個網段,會發出ARP請求,這個時候ARP請求就到了路由器上了。路由器如果開啓了代理ARP功能,會代替PC-D給PC-A迴應,告訴PC-A路由器的e0口MAC地址00-00-0c-94-36-ab就是PC-D的MAC地址,完成代理ARP操作,保護了PC-D的MAC地址隱私。

 

我認同這種說法,是合情合理的。但是不禁有個問題,誰會用這麼腦殘的方法配置IP地址呢?好吧,就當是有。
以下轉自鳥哥的Linux私房菜:
“如果你一開始設計的網路環境就是同一個 C class 的網域,例如 192.168.10.0/24 , 後來因為某些因素必須要將某些主機搬到比較內部的環境中,例如圖一的 PC2 ~ PC4 。 然後又因為某些因素,所以你不能變更 PC2 ~ PC4 的 IP ,也就是說,有點像底下這樣的圖示:”
arp_proxy.bmp

 

代理ARP作爲這種特殊情況的解決方案是無可厚非的,但是按道理說這種情況萬中無一。既然這種情況出現的概率那麼低,爲什麼要把代理ARP設置爲默認啓動?這不是浪費資源嗎?還存在ARP欺騙等安全隱患,完全可以把代理ARP功能設置爲默認關閉。個人意見,有朋友知道原因請告知。

 


3.三層交換機不同網段關閉路由互通問題
破爛熊的問題:
一個三層交換機,f0/1設置成指定爲pc同網段的網關的IP,f0/2指定爲另一個網段的ip,關閉交換機的路由功能.pc可以ping通f0/2嗎?

 

破爛熊的答案:
我用dy做實驗是可以通的,
pc的目的和自己是不同網段的,pc通過arp學習到網關的mac後,發ping請求給網關,這個ping請求包是一個三層包,這個數據包的格式是 目標mac(網關的),源mac(pc的), 源IP(pc的),目標ip(f0/2的IP)    網關收到此包後檢測數據幀的頭部,發現是給自己的,於是解封裝,除去幀頭部,然後查看ip頭部,網關發現目標IP和自己不是處於同一網段,由於三層已經沒有了路由功能,所以沒有去查找路由表,正常情況下是先查找路由表的.在有過第一次的轉發數據記錄後纔會去查看arp表而不是路由表,要不然一收到和自己不網段的包就去找路由表,那arp表有啥用?於是通過查找找到了此IP已經被解析的mac,因爲是交換機自身的接口配的IP的地址,當然是存在在路由器arp中的.也就是說這個目標的ip是不需要學習就可以找到的.查找到後就對幀進行重新封裝.然後返回給pc,
純個人見解,有不同看法的請指證......

 


個人認爲非常正確,說的很透徹。但是有一點保留意見,“在有過第一次的轉發數據記錄後纔會去查看arp表而不是路由表,要不然一收到和自己不網段的包就去找路由表,那arp表有啥用?”
這裏我已經修正過來了.路由器收到數據包還是先查路由表,然後查看發出去的下一跳地址ARP緩存表中是否有MAC地址,有則轉發.

 

還想補充一點的是,三層交換機只有一個MAC地址。所以以上問題的情況在三層交換機中的ARP緩存表會這樣顯示:
ARP8.bmp
F0/1和F0/2對應的MAC地址是相同的。

 


最後留個問題:同樣關閉路由功能的情況下,我在三層交換機上用F0/1去ping F0/2口能否通?


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章