ARP:地址解析協議
在網路通訊中,主機和主機通訊的資料包需要依據 OSI 模型從上到下進行資料封裝,當資料封裝完整後,再向外發出。在網路層上,主機和路由器用邏輯地址來標誌,邏輯地址在本地是唯一的,但在全域性上不一定。在TCP/IP 協議族中稱為 IP 地址,現在常用的版本是IPv4,長度是32位。在鏈路層上,主機和路由器用他們的實體地址來標誌,即 48 位的實體地址,也是是我們通常所說的網絡卡地址(MAC地址)。
因此,需要能夠將邏輯地址和相應的實體地址之間進行對映,完成這樣的對映可以使用靜態對映和動態對映:
- 靜態對映:建立一個表,儲存邏輯地址和實體地址之間的關聯關係,然後將網路上的每個主機都儲存這張表。缺點是,對映表必須週期的更新,增加了網路的開銷。
- 動態對映:採用 ARP(Address Resolution Protocol,地址解析協議),它負責完成邏輯地址向實體地址的動態對映,將 32 位邏輯地址(IP地址)轉換為 48 位的實體地址(MAC地址)。
ARP 基本原理
ARP 通過一個查詢表(ARP快取)來執行地址轉換的。當在 ARP 快取中沒有找到地址時,則向網路傳送一個廣播請求,網路上所有的主機和路由器都接收和處理這個 ARP 請求,但是隻有相同 IP 地址的接收到廣播請求的主機或路由器,發回一個 ARP 應答分組,應答中包含它的 IP 地址和實體地址,並儲存在請求主機的 ARP 快取中。其他主機或路由器都丟棄此分組。
具體過程如下:
- 本地主機在區域網中廣播 ARP 請求,ARP 請求資料幀中包含目的主機的 IP 地址,意思是“如果你是這個 IP 地址的擁有者,請回答你的硬體地址”。
- 目的主機的 ARP 層解析這份廣播報文,識別出是詢問其硬體地址。於是傳送 ARP 應答包,裡面包含 IP 地址及其對應的硬體地址。
- 本地主機收到 ARP 應答後,知道了目的地址的硬體地址,之後的資料報就可以傳送了。
注意:點對點鏈路不使用 ARP 協議。APR 請求包是廣播的,但是 ARP 應答幀是單播的。
ARP 快取記憶體
ARP 高效執行的關鍵是由於每個主機上都有一個 ARP 快取記憶體。這個快取記憶體存放了最近 Internet 地址到硬體地址之間的對映記錄。快取記憶體中每一項的生存時間一般為20分鐘,起始時間從被建立時開始算起。
常用 ARP 快取記憶體操作命令:
- 快取檢視
arp -a# 引數-a的意思是顯示快取記憶體中所有的內容。
- 快取清空
arp -d
代理 ARP
如果 ARP 請求是從一個網路的主機發往另一個網路上的主機,可能需要經過很多路由器,而路由器隔離廣播域,每個介面/網段都是獨立的廣播域, ARP 請求又是二層廣播包,所以ARP 廣播包沒法通過過路由器。。因此,閘道器裝置收到此 ARP 請求,會用自己的 MAC 地址返回給請求者,這便是代理 ARP(Proxy ARP)。
上圖中,PC 傳送 ARP 請求伺服器 8.8.8.8 的 MAC 地址,路由器(閘道器)收到這個請求時會進行判斷,由於目標 8.8.8.8 不屬於本網段(即跨網段),此時便返回自己的介面 MAC 地址給 PC,後續電腦訪問伺服器時,目標 MAC 直接封裝為 MAC254。
實際網路中,無論是同網段還是跨網段通訊(例如訪問網際網路),絕大情況下都是使用正常的ARP,而不是代理ARP。
- 代理 ARP 僅僅是正常ARP的一個拓展使用,是可選項而不是必要項;
- 代理 ARP 有特定的應用場景,與閘道器/路由的設定有直接關係:當電腦沒有閘道器/路由功能時,並且需要跨網站通訊時,則會觸發代理 ARP 。換句話說,如果有閘道器/路由功能,則不需要代理 ARP;
- 正常環境下,當用戶接入網路時,都會通過 DHCP 協議或手工配置的方式得到 IP 和閘道器資訊(所以不需要代理ARP)。
那麼什麼時候使用正常 ARP ?什麼時候使用代理 ARP 呢?總結如下:
- 電腦沒有閘道器時,ARP 直接詢問目標 IP 對應的 MAC 地址(跨網段),採用代理 ARP;
- 電腦有閘道器時,ARP 只需詢問閘道器 IP 對應的 MAC 地址(同網段),採用正常 ARP;
- 無論是正常ARP還是代理 ARP,電腦最終都拿到同一個目標 MAC 地址:閘道器 MAC。
免費 ARP
免費 ARP 是指主機發送 ARP 查詢自己的 IP 地址,用於檢測區域網內的IP地址衝突。免費 ARP 可以有兩個方面的作用:
- 一個主機可以通過它來確定另一個主機是否設定了相同的 IP 地址。
- 如果傳送免費 ARP 的主機正好改變了硬體地址(很可能是主機關機了,並換了一塊介面卡,然後重新啟動),那麼這個分組就可以使其他主機快取記憶體中舊的硬體地址進行相應的更新。
免費 ARP 的報文發出去是不希望收到迴應的,只希望是起宣告作用;如果收到迴應,則證明對方也使用自己目前使用的 IP 地址。當電腦檢測到自己的IP地址跟其他電腦衝突時,它們會相互發送免費ARP,用來提醒對方:你的IP地址跟我的衝突啦!衝突方之間可能會一直髮送,直到有一邊做出讓步並修改IP地址(不同系統解決方法不同)。
ARP 攻擊與防禦
攻擊原理
ARP欺騙攻擊,考慮如下圖的情景,在局域網裡面,PC1、PC2、PC3三臺主機共同連線到交換機 SW1 上面,對應 3 個介面 port 1/2/3。
PC1 需要跟 PC2 通訊,通過 ARP 請求包詢問 PC2 的 MAC 地址,由於採用廣播形式,所以交換機將 ARP 請求包從介面 P1 廣播到 P2 和 PC3。
PC2 根據詢問資訊,返回ARP單播迴應包;此時 PC3 作為攻擊者,沒有返回 ARP 包,但是處於“監聽”狀態,為後續攻擊做準備。
PC1 和 PC2 根據 ARP 問答,將各自的 ARP 對映資訊(IP-MAC)儲存在本地 ARP 快取表。
交換機根據其學習機制,記錄 MAC 地址對應的介面資訊,儲存在 CAM 快取表(也稱為 MAC 地址表)。交換機收到資料包時,會解封裝資料包,根據目標 MAC 欄位進行轉發。
正常情況下,若收到的 ARP 請求不是給自己的,則直接丟棄;而攻擊者 PC3 在監聽之後,發起了 ARP 迴應包:我就是 PC2(IP2-MAC3)。PC1 收到兩個 ARP 迴應包,內容分別如下:
-
我是 PC2,我的IP地址是 IP2,我的 MAC 地址是 MAC2;
-
我是 PC2,我的IP地址是 IP2,我的 MAC 地址是 MAC3;
網路協議裡各種表在處理快取資訊的方式要麼是”先到先得”,要麼”後到優先”。上面提到的 ARP 和 CAM 表,就是遵循”後到優先”原則。因此,作為攻擊者,只要持續不停發出 ARP 欺騙包,就一定能夠覆蓋掉正常的ARP迴應包。
根據資料封裝規則,此後,當 PC1 要跟 PC2 進行通訊時,無論是傳送 PING 包還是傳送其他資料,首先要查詢 ARP 表,然後在網路層打上源目 IP,在鏈路層打上源目 MAC,然後將資料包傳送給交換機。交換機收到之後對資料進行解封裝,並且檢視 CAM 表(基於目的 MAC 轉發),由於目標 MAC3 對應 Port3,所以交換機自然而然將其轉發給 PC3。就這樣,PC1 本來要發給 PC2 的資料包,落到了攻擊者 PC3 手裡,這就完成了一次完整的 ARP 攻擊。
防禦原理
ARP攻擊的罪魁禍首就是 ARP 欺騙包,處理這種欺騙行為的兩個解決方法:
-
保證電腦不接收欺騙包。
-
保證電腦收到欺騙包之後不相信。
ARP防禦可以在網路裝置上實現,也可以在使用者端實現,更可以在網路裝置和使用者端同時實現。區域網安全裡比較常用的 ARP 防禦技術被稱為 DAI(Dynamic ARP Inspection)- 動態ARP檢測 ,原理可以簡單概括:
-
交換機記錄每個介面對應的 IP 地址和 MAC,即 port<->mac<->ip,生成 DAI 檢測表;
-
交換機檢測每個介面傳送過來的 ARP 迴應包,根據 DAI 表判斷是否違規,若違規則丟棄此資料包並對介面進行懲罰。
DAI 是目前防禦ARP攻擊最有效的方法之一,但是大部分能支援這種動態ARP監測技術的交換機或者無線路由器,都基本是企業級的產品。簡單的交換機不具備動態ARP監測技術。普通使用者(電腦或手機)可以通過安裝ARP防火牆做安全防禦,可使用360安全衛士、騰訊電腦管家等軟體來實現 ARP 攻擊的防禦。
參考資料:
[1] Fall K R, Stevens W R. TCP/IP illustrated, volume 1: The protocols[M]. addison-Wesley, 2011.
[2] ofollow,noindex">圖解ARP協議(一)
[3] 圖解ARP協議(二)ARP攻擊篇