ARP 協議

1. ARP 協議簡介

Address Resolution Protocol,用於建立和維護 IPv4(IPv6 使用 NDP 協議)地址和 MAC 地址的動態映射。在一個局域網中(LAN),數據包通過 MAC 地址來尋址的(網絡層的數據包被封裝在二層數據幀中進行傳輸),但是 IPv4 是用 IP 地址來尋址。只知道 IP 地址,不知道 MAC 地址,數據包是無法發送(不能尋址)的,這個時候就使用 ARP 協議獲得 IP 地址對應的 MAC 地址。

ARP 協議要求鏈路層支持廣播

2. ARP 協議工作的一般過程

假設現在有一個 LAN,LAN 的網段是 202.117.15.0/24

主機 A 的 IP 地址:202.117.15.10,MAC 地址 00:00:00:00:00:10

主機 B 的 IP 地址:202.117.15.11,MAC 地址 00:00:00:00:00:11

A 此時要給 B 發送一個 UDP 包(三層包),A 不知道 B 的 MAC 地址,過程如下:

1. A 發送一個 ARP request(廣播包,目的 MAC 全 1),LAN 中的所有主機(不考慮 VLAN)都會收到這個 ARP request。這個 ARP request 的內容主要是:哪位小哥的 IP 地址是 202.117.15.11 啊,告訴我唄,我的 IP 地址是 202.117.15.10,MAC 地址是 00:00:00:00:00:11

2. B 收到了這個 ARP request 後,發現 ARP request 詢問的 IP 地址是自己,B 做了 N 件事: 1)更新自己的 ARP 映射,即把 MAC 地址 00:00:00:00:00:10 映射到 202.117.15.10 上。(不考慮靜態映射)。2)給主機 A 發送 ARP reply(單播,A 的 MAC 地址已知),主要內容是:哎呀,A你好啊,我就是你要找的那個 B(202.117.15.11) 啊,我的 MAC 地址是 00:00:00:00:00:11。其他主機收到這個廣播後,會執行步驟 1),更新自己的 ARP 映射(不考慮存在靜態映射的情況)

3. A 收到 B 發來的 ARP reply,更新自己的 ARP 映射,即把 MAC 地址 00:00:00:00:00:11 映射到 202.117.15.11 上。

4. 此時 A 知道了 B 的 MAC 地址,B 也知道 A 的 MAC 地址,於是 A 和 B 就可以沒羞沒臊地聊天了(互相發送三層數據包),只要某個時刻其中一個主機的 MAC 地址 - IP 地址映射過期了,就再次重複 1 到 3 的過程,然後繼續愉快地聊天,一點都不影響興致呢。

3. ARP 包的格式

ARP 在 OSI 七層模型中和 TCP/IP 四層模型中都被放在了數據鏈路層(二層),但是又有點像三層的,ARP 有 ethtype(0x0806),IP 的 ethtype 是 0x0800,貌似有稱爲 2.5 層的

下面是 Ethernet & IPv4 網絡中的 ARP 包的格式

ARP 包是封裝在以太幀中,和 IP 包在以太幀中的位置是一樣一樣的

字段說明:

Hardware type: MAC 地址類別,Ethernet 中該值爲 1。通常所說的 MAC 地址,物理地址,數據鏈路層地址都指的同一個東西,以太網中的 MAC 地址又成爲以太網地址。

Protocol type: 協議地址類別,IPv4 網絡中該值爲 0x0800(是的,和 ethtype 的值是一樣的,這不是巧合,用的就是 Ethtype 的值)

Hardware address length:MAC 地址長度,Ethernet 中該值爲 6

Protocol address length: 協議地址長度,IPv4 中該值爲 4

Operation: 說明 ARP 包的類型,request 時值爲 1,reply 爲 2

Sender hardware address 發送者的 MAC 地址

Sender protocol address: 發送者的協議地址(IPv4 地址)

Target hardware address: 目標 MAC 地址,ARP request 中爲廣播地址(全 1)

Target protocol address: 目標協議地址,

發送者會在 ARP request 中填入自己的 MAC 地址,IP 地址(Sender 地址),目標 MAC 填入二層廣播地址,目的 IP 地址填入詢問的 IP 地址,目標主機收到 ARP request 後,發送 ARP reply 包,ARP reply 中的 Target 地址是 ARP request 的 Sender MAC 地址和 IP 地址,ARPreply 的 Sender 地址是主機自己的 MAC 地址和 IP 地址。

4. ARP 映射的類別和超時時間

C: 動態的映射,動態學習獲得的,就是通過上述的那個一般過程獲得的,一般超時時間爲 20 分鐘(RFC1122 中規定的)

M: 靜態的映射,手動靜態配置的 ARP 映射,沒有超時時間,但是大多數的實現中 ARP reply 會更改靜態的 ARP 映射(不管本主機是否發送過 ARP request),沒有做過這個實驗,不清楚替換後的 ARP 映射是靜態的還是動態的。

P:publish,主要用於代理 ARP,代理 ARP 讓主機迴應(發送 ARP reply)不是指向自己 IP 地址的 ARP request,讓 Sender 以爲自己是要找的 MAC 地址。這個現在很少用了

5. Gratuitous ARP

無理由 ARP(請無視我的翻譯),GratuitousARP 是指主機發送一個目標 IP 爲自己 IP 的 ARP request。Gratuitous ARP 一般在系統 bootstrap(引導程序)時間執行(這裏我不太理解,計算不是系統啓動時間,只要是網卡啓動時應該都會發送的吧)網卡發送一個目標 IP 爲自己 ARP request。

這個 ARP 包主要有兩個作用:

1. 主機確定當前網絡中是否有主機的 IP 和自己的 IP 是一樣的。如果這個 ARPrequest 發出後,收到了 ARP reply,說明當前 LAN(或者 VLAN)有主機用了和本機一樣的 IP。這個時候系統通常會提醒用戶 IP 地址衝突。如果沒有收到 ARP reply,說明 LAN(或者 VLAN)中沒有主機和自己 IP 地址一樣。

2. 主機的 MAC 地址可能發生了變化(比如修改了 MAC 地址,或者換了網卡)。ARP request 可以讓 LAN(或者 VLAN) 中所有主機更新 ARP request 發送者的 IP 和 MAC 的映射關係。(靜態的 ARP 映射關係應該不會被 ARP reqeust 更新,通常只會被 ARP reply 更新——這個是我根據上下文推測的,還沒有試驗過)

6. 地址衝突檢測(ACD)

Gratuitous ARP 發現地址衝突後什麼都不能做,只能提示用戶發生了地址衝突。所以 RFC5227 提出了一個新的機制:ACD(Address Conflict Detection)

ACD 可以對地址衝突做出反應,ACD 定義了 ARP probe 和 ARP announcement 兩種 ARP 包(都是 ARP request,只是填充內容不太一樣)

ARP probe:用於檢測 IP 地址衝突,Sender IP 填充爲 0,填充爲 0 是爲了避免對其他主機的 ARP cache 造成污染(因爲可能已經有主機正在使用候選 IP 地址了,不要影響別人的正常通行嘛),Target IP 是候選 IP 地址(即本機想要使用的 IP 地址)

ARP announcement:用於昭示天下(LAN)本機要使用某個 IP 地址了,是一個 SenderIP 和 Traget IP 填充的都是本機 IP 地址的 ARP request。這會讓 LAN(VLAN) 中所有主機都會更新自己的 ARP cache,將 IP 地址映射到發送者的 MAC 地址。

6.1 ACD 流程
1. 網卡啓動時(或者從睡眠狀態恢復,或者鏈接建立時)會發送一個 ARP probe。(爲了避免多個網卡同時啓動同時發 ARP probe 造成擁塞,有一個擁塞避免策略,不會立刻發送 ARP probe,單個網卡的多個 probe 也不會連續發送,會有間隔時間)

2. 發送主機可能收到 ARP reply 或者 ARP probe,如果收到了 ARP reply,說明候選 IP 地址已經有主機在用了。如果收到了一個 Target IP 地址爲候選 IP 的 ARPprobe,說明另外一個主機也同時想要使用該候選 IP 地址。這種情況下,兩個主機都會提醒用戶出現了 IP 地址衝突。然後進行地址衝突處理(見後面)

3. 如果上述兩種 ARP 包都沒有收到,說明候選 IP 地址可用。主機發送一個 ARP announcement,告訴其他主機這個候選 IP 有人用了,這個 ARP request 會讓 LAN(VLAN)中其他主機更新 ARP cache。

4. 系統運行期間,ACD 是一直在運行的,這點與 Gratuitous ARP 不同。主機會一直檢測收到的 ARP reqeust 和 ARP reply,判斷 Sender IP 域是否和本機 IP 地址一樣,如果一樣說明有主機也在用這個 IP 地址了。然後需要進行地址衝突處理。(見下面)

7. TODO:

1. 實驗 ARP reqeust 和 ARP reply 是否可以更新靜態 IP-MAC 映射

2. 實驗不斷髮送 ARP reqeust 進行攻擊

3. 實驗不斷髮送 ARP reply 進行攻擊

4. 實驗使用 ARP 欺騙 LAN 中的其他主機(讓主機以爲自己是網關,或者讓網關以爲自己是目的主機,或者 both),並在主機無法察覺的情況下查看主機數據。嘗試去篡改用戶數據

來源:https://blog.csdn.net/xiaopeng_thriller/article/details/108200717

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/wqBkrCFTOhamwMC1pumD_w