1. 代理ARP(Proxy ARP)是什么?
顧名思義,它指通過中間設備(通常為Router)代替其他主機響應ARP請求。對於沒有配置默認網關的主機想要與其他網絡的另一台主機通信時,網關收到源主機的ARP請求時,會使用自己的MAC地址和目的主機的IP對源主機的ARP請求進行應答。 (可能當你讀到這里時,腦子里對Proxy ARP這個東西還不太明白,不要急,慢慢來)
2. 一個拓撲
圖中,假設路由器左邊接口是子網A,路由器右邊接口是子網B,且路由器上沒有NAT
3. 細心的讀者可能發現,PC2掩碼是16位,同時沒有網關,而其他的PC和路由器的兩個接口都是24位掩碼。
3.1 PC2 ping PC3
PC2組裝ICMP報文(源IP是192.168.1.3,目的IP是192.168.2.2),此時組裝會失敗,因為PC2不知道PC3的MAC地址。
PC2就會想辦法得到PC3的MAC地址。因為PC2是16位掩碼,因此它認為PC3與自己是同一網段的,因此它會直接廣播ARP請求,去詢問PC3的MAC地址。ARP請求部分格式如下:
字 段: |Serder MAC| |Serder IP| |Target MAC| |Target IP|
值 : MAC2 192.168.1.3 00:00:00:00:00:00 192.168.2.2
然而,這里我們會發現,這個ARP請求報文壓根就不能到達PC3,因為路由器不會轉發廣播包,因此這個ARP請求廣播包只能到達路由器(路由器會更新ARP表: 192.168.1.3---MAC2)。
若是路由器支持ARP代理功能,且啟用ARP代理后,路由器會查看ARP請求,發現IP地址192.168.2.2屬於它連接的另一個網絡(子網B),因此路由器用自己左邊接口的MAC地址(MAC4)代替PC2的MAC地址,向PC2發送了一個ARP應答。ARP應答部分格式如下:
字 段: |Serder MAC| |Serder IP| |Target MAC| |Target IP|
值 : MAC4 192.168.2.2 MAC2 192.168.1.3
當PC2收到這個ARP應答,會認為PC3的MAC地址是MAC4,根本不會感知到Proxy ARP的存在。PC1會更新自己的ARP表: 192.168.2.2----MAC4 。 此時路由器的行為就叫代理ARP,這實質上是一種ARP欺騙----善意的謊言(瞧瞧,這多有意思)。
接着PC2重新組裝ICMP報文(源IP為192.168.1.3,目的IP為192.168.2.2;源MAC為MAC2,目的MAC為MAC4),這個報文會先到路由器,之后再由路由器轉發到PC3上,同樣道理,路由器會尋求PC3的MAC地址,這個ARP請求的部分格式如下:
字 段: |Serder MAC| |Serder IP| |Target MAC| |Target IP|
值 : MAC5 192.168.2.1 00:00:00:00:00:00 192.168.2.2
當PC3收到這個ARP請求報文時,會記錄下路由器右邊接口的IP(192.168.2.1)和MAC(MAC5)地址映射(即更新ARP表: 192.168.2.1----MAC5),之后單播回復APR應答到路由器。此時ARP應答部分格式如下:
字 段: |Serder MAC| |Serder IP| |Target MAC| |Target IP|
值 : MAC3 192.168.2.2 MAC5 192.168.2.1
當路由器收到這個ARP應答,更新自己的ARP表: 192.168.2.2----MAC3,此時ICMP包能夠到達PC3
最后就是PC3回應ICMP應答報文給PC1,這個報文同樣會經過路由器轉發,只是這次不會再經歷ARP過程了。
3.2 PC1 ping PC3
PC1發現和PC3不在同一網段,會先把報文扔向網關(192.168.1.1)。這里PC1廣播ARP請求獲取網關的MAC地址時,ARP請求報文部分格式為:
字 段: |Serder MAC| |Serder IP| |Target MAC| |Target IP|
值 : MAC1 192.168.1.2 00:00:00:00:00:00 192.168.1.1
這個ARP請求包到達路由器后,路由器會進行ARP應答,回復PC1自己的MAC地址,此時ARP應答報文部分格式為:
字 段: |Serder MAC| |Serder IP| |Target MAC| |Target IP|
值 : MAC4 192.168.1.1 MAC1 192.168.1.2
當這個ARP應答到達PC1時,PC1更新自己的ARP表: 192.168.1.1----MAC4
接下來的過程和3.1中相同,這里不一一贅述。
可以看出,PC1和PC2的ARP表項不一樣。其實這一切都是為了通信而服務的。
4. Proxy ARP的好處和缺點
好處: 最主要的一個優點就是能夠在不影響其他路由器的路由表的情況下在網絡上添加一個新的路由器,這樣使得子網的變化對主機是透明的。用戶的路由器和客戶端不用做任何修改,用戶甚至感覺不到透明接入的路由器的存在
缺點: 1. 安全問題,Proxy ARP本身就是利用ARP欺騙,所以自己也很容易被ARP欺騙(其實ARP協議本身就有這個缺陷); 2. 整個網絡看起來是透明的,不利於概括和推廣網絡拓撲;3. 若是路由器不支持ARP代理,會導致PC2不能訪問其他網絡
5. FAQ
5.1 為什么會有ARP代理?
ARP Request是個廣播包(當然也有單播的ARP請求,不在這里討論),它詢問的對象若在同一個局域網內,就會回答。但如果查詢對象不在同一個局域網,那怎么辦呢?為了解決這個問題,路由器就提供一個服務:Proxy ARP
5.2 Proxy ARP會自動響應到哪些網段的ARP請求
代理ARP只響應那些自己知道網段(路由表中能找到的),而不是會用自己的MAC響應主機所有的arp請求。如PC2去ping 192.168.3.2/24,此時路由器不會響應這個ARP請求
5.3 Proxy ARP適用於哪些場景
Proxy ARP應該使用在主機沒有配置默認網關或沒有任何路由策略的網絡上。具體的場景我也沒找到合適的,大家可以探討
5.4 還有什么方法來解決跨局域網的地址查詢?
其實默認網關完全可以解決這個問題,直接將報文扔到網關上,讓網關去轉發。
5.5 如果存在多個ARP代理設備(這些設備的左邊接口與PC2接在同一個傻瓜交換機上;右邊接口與PC3接在同一個交換機上,PC3此時也使用16位掩碼,不設置網關),那么PC2訪問PC3時,PC2的ARP緩存表是怎樣的?
我使用模擬器搭建環境,發現每個設備都會回復ARP應答,這些ARP應答都是以自己左邊接口的MAC對應PC3的IP,且這些ARP應答都會達到交換機,但是交換機只會轉發一個到PC2上(至於選哪一個,這里沒有去深究),因此PC2只會收到一個ARP應答, PC2的緩存表中,關於PC3的ARP條目只有一條。
6. 總結
Proxy ARP其實就是中間設備利用ARP欺騙,代替某個主機響應ARP請求;
實際應用的場合很少,用默認網關就可以解決這個問題,而且很多時候主機都支持DHCP自動獲取地址,不會出現拓撲中的情況‘;
很多設備都不支持Proxy ARP功能。我本來想使用實際的設備來搭建這個拓撲,卻未找到合適的路由器,最后無奈,只好使用Cisco Packet Tracer工具來模擬(目前知道思科路由器支持這個功能)