TCP/IP協(xié)議簇中ARP協(xié)議
1、ARP協(xié)議簡(jiǎn)介
在《IP協(xié)議》中我們講解了IP地址相關(guān)內(nèi)容,IP協(xié)議中包含了目的IP地址和源IP地址,但是當(dāng)一臺(tái)主機(jī)把以太網(wǎng)數(shù)據(jù)幀發(fā)送到位于同一局域網(wǎng)上的另一臺(tái)主機(jī)時(shí),是根據(jù)48bit的以太網(wǎng)地址來確定目的接口的。設(shè)備驅(qū)動(dòng)程序從不檢查IP數(shù)據(jù)報(bào)中的目的IP地址。
還記得數(shù)據(jù)鏈路層的以太網(wǎng)的協(xié)議中,每一個(gè)數(shù)據(jù)包都有一個(gè)MAC地址頭么?我們知道每一塊以太網(wǎng)卡都有一個(gè)MAC地址,這個(gè)地址是唯一的,那么IP包是如何知道這個(gè)MAC地址的?這就是ARP協(xié)議的工作。
在OSI模型中ARP協(xié)議屬于鏈路層;而在TCP/IP模型中,ARP協(xié)議屬于網(wǎng)絡(luò)層。ARP協(xié)議數(shù)據(jù)哪一層,不同的資料有不同的說法,這里不作重點(diǎn)討論。
ARP(地址解析)協(xié)議是一種解析協(xié)議,本來主機(jī)是完全不知道這個(gè)IP對(duì)應(yīng)的是哪個(gè)主機(jī)的哪個(gè)接口,當(dāng)主機(jī)要發(fā)送一個(gè)IP包的時(shí)候,會(huì)首先查一下自己的ARP高速緩存(就是一個(gè)IP-MAC地址對(duì)應(yīng)表緩存),如果查詢的IP-MAC值存不存在,那么主機(jī)就向網(wǎng)絡(luò)發(fā)送一個(gè)ARP協(xié)議廣播包,這個(gè)廣播包里面就有待查詢的IP地址,而直接收到這份廣播的包的所有主機(jī)都會(huì)查詢自己的IP地址,如果收到廣播包的某一個(gè)主機(jī)發(fā)現(xiàn)自己符合條件,那么就準(zhǔn)備好一個(gè)包含自己的MAC地址的ARP包傳送給發(fā)送ARP廣播的主機(jī),而廣播主機(jī)拿到ARP包后會(huì)更新自己的ARP緩存(就是存放IP-MAC對(duì)應(yīng)表的地方)。發(fā)送廣播的主機(jī)就會(huì)用新的ARP緩存數(shù)據(jù)準(zhǔn)備好數(shù)據(jù)鏈路層的的數(shù)據(jù)包發(fā)送工作。
2、ARP協(xié)議結(jié)構(gòu)
之前的文章《以太網(wǎng)數(shù)據(jù)包結(jié)構(gòu)》可以看出圖表示ARP協(xié)議的數(shù)據(jù)結(jié)構(gòu)。
這里先看一下典型的ARP包的組成結(jié)構(gòu)。
前面12個(gè)字節(jié)是MAC地址,在《以太網(wǎng)數(shù)據(jù)包結(jié)構(gòu)》文章中講解過,接下來是幀類型,其中0806表示是ARP協(xié)議幀。接下來,就是ARP數(shù)據(jù)包部分了,第一個(gè)硬件類型字段表示發(fā)送方想要知道的硬件接口類型硬件,對(duì)于以太網(wǎng)MAC地址,它的值應(yīng)該為1。協(xié)議類型字段表示要映射的協(xié)議地址類型,它的值為0x0800時(shí),即表示要映射為IP地址,可以看出,該值與以太網(wǎng)數(shù)據(jù)幀頭中類型字段的值使用相同的一組值。
接下來的兩個(gè)單字節(jié)長度的字段,稱為硬件地址長度和協(xié)議地址長度,它們分別指出硬件地址和協(xié)議地址的長度,長度單位為字節(jié)。對(duì)于以太網(wǎng)上ARP請(qǐng)求或應(yīng)答來說,它們的值分別為6和4,代表MAC地址的長度和IP地址的長度。在ARP協(xié)議包中留出硬件地址長度字段和協(xié)議地址長度字段可以使得ARP協(xié)議在任何網(wǎng)絡(luò)中被使用,而不僅僅只在以太網(wǎng)中。
操作字段op指出ARP數(shù)據(jù)包的類型,它們可以是ARP請(qǐng)求(值為1)、ARP應(yīng)答(值為2)、RARP請(qǐng)求(值為3)和RARP應(yīng)答(值為4),這里我們只關(guān)心前兩個(gè)類型。RARP為逆地址解析協(xié)議,這里簡(jiǎn)單說一下,RARP用于主機(jī)啟動(dòng)時(shí)獲得自己的IP地址。這個(gè)過程很簡(jiǎn)單:主機(jī)啟動(dòng)時(shí),廣播發(fā)送一個(gè)RARP請(qǐng)求數(shù)據(jù)包,數(shù)據(jù)包中包含了自身的MAC地址,然后等待響應(yīng)。網(wǎng)絡(luò)中另一臺(tái)主機(jī)必須設(shè)置為監(jiān)聽RARP請(qǐng)求狀態(tài),并在收到請(qǐng)求后為該主機(jī)分配一個(gè)IP地址并返回RARP應(yīng)答給主機(jī),一旦收到應(yīng)答,主機(jī)就有了IP地址,就可以在后續(xù)中使用了。
接下來的四個(gè)字段是發(fā)送端的以太網(wǎng)MAC地址、發(fā)送端的IP地址、目的端的以太網(wǎng)MAC地址和目的端的IP地址。
關(guān)于PAD填充字節(jié),請(qǐng)看《以太網(wǎng)數(shù)據(jù)包結(jié)構(gòu)》有講解。
注意:在以太網(wǎng)的數(shù)據(jù)幀頭部中和ARP數(shù)據(jù)包中都有發(fā)送端的以太網(wǎng)MAC地址。對(duì)于一個(gè)ARP請(qǐng)求包來說,除接收方以太網(wǎng)地址外的所有字段都應(yīng)該被填充相應(yīng)的值。當(dāng)接收方主機(jī)收到一份給自己的ARP請(qǐng)求報(bào)文后,它就把自己的硬件地址填進(jìn)去,然后將該請(qǐng)求數(shù)據(jù)包的源主機(jī)信息和目的主機(jī)信息交換位置,并把操作字段op置為2,最后把該新構(gòu)建的數(shù)據(jù)包發(fā)送回去,這就是ARP應(yīng)答。
3、wireshark抓包分析
假設(shè)查詢IP為192.168.0.103的MAC地址,使用如下命令
- arp -a 192.168.0.103
抓包分析
這里分享下wireshark的抓包文件
鏈接:https://pan.baidu.com/s/1AWPj85Jb4nmLY8h2yJucUA 提取碼:bxjq
4、ARP協(xié)議分類
ARP數(shù)據(jù)包的種類有兩種:
一是ARP請(qǐng)求包,它是通過以太網(wǎng)廣播的方式發(fā)送的,用于向具有某個(gè)IP地址的主機(jī)發(fā)送請(qǐng)求,希望該主機(jī)返回其MAC地址;
二是ARP應(yīng)答包,收到ARP請(qǐng)求的主機(jī)會(huì)比對(duì)該數(shù)據(jù)包中的IP地址與自己的IP地址是否符合,若是,則該主機(jī)向源主機(jī)返回一個(gè)ARP應(yīng)答包,向源主機(jī)報(bào)告自己的MAC地址。源主機(jī)通過提取ARP應(yīng)答包中的相關(guān)字段來更新ARP緩存表。
一個(gè)典型的arp緩存信息如下,在任意一個(gè)系統(tǒng)里面用“arp-a”命令:
都會(huì)得到這樣的結(jié)果。這樣的高速緩存是有時(shí)限的,一般是20分鐘(伯克利系統(tǒng)的衍生系統(tǒng))。
5、ARP協(xié)議應(yīng)用
基礎(chǔ)知識(shí):路由下有兩個(gè)設(shè)備,他們相互知道對(duì)方IP和MAC,但是他們不能直接通訊,需要路由做轉(zhuǎn)發(fā),如果兩個(gè)設(shè)備直接用網(wǎng)線連起來,就是直接通訊。
舉個(gè)栗子
路由下有兩個(gè)設(shè)備,首先一點(diǎn):每個(gè)設(shè)備(包括路由),都有自己的ARP緩存表。設(shè)備A向局域網(wǎng)下設(shè)備B通訊(A設(shè)備知道B設(shè)備的IP)
情況1:A知道B的MAC地址,也就是在自己的ARP緩存表有設(shè)備B,直接封包,交給路由就好。
情況2:A不知道B的MAC地址,也就是在自己的ARP緩存表沒有設(shè)備B,此時(shí)比較不幸,發(fā)送數(shù)據(jù)需要延時(shí)發(fā)送,首先設(shè)備A會(huì)向網(wǎng)關(guān)(就是路由)ARP請(qǐng)求包(以太網(wǎng)目的地址是FF-FF-FF-FF-FF-FF),這時(shí)候分情況A和B。
情況A:路由知道設(shè)備B的MAC,也就是自己的ARP緩存表有設(shè)備B,把自己的知道的設(shè)備B的IP和MAC返給設(shè)備A,設(shè)備A更新一下,自己的ARP緩存表,按情況1處理。
情況B:路由不知道設(shè)備B的MAC,路由就在自己的局域網(wǎng)發(fā)送,ARP請(qǐng)求包,去問設(shè)備B的MAC。得到之后,再發(fā)送給A。A得到MAC地址后按照情況1處理。
上述情況說明,想要網(wǎng)絡(luò)設(shè)備第一次就通訊流暢,必須要局域網(wǎng)內(nèi)的設(shè)備都知道自己的MAC地址,在網(wǎng)絡(luò)設(shè)備開發(fā)中我們一般在網(wǎng)絡(luò)設(shè)備首次接入網(wǎng)絡(luò)后,首先向局域網(wǎng)廣播自己的地址信息,稱為無回報(bào)(gratuitous)ARP請(qǐng)求,這樣的一個(gè)ARP數(shù)據(jù)包將告訴其他主機(jī)關(guān)于自己的信息,其他主機(jī)根據(jù)各自收到的ARP包更新自己的ARP表項(xiàng)。上文中提到的伯克利系統(tǒng)的衍生系統(tǒng),ARP的緩存表一般存儲(chǔ)20分鐘,如果不及時(shí)更新,主機(jī)會(huì)刪除“離線”設(shè)備的ARP表,因?yàn)橹鳈C(jī)ARP緩存表內(nèi)存有限,不可能存儲(chǔ)無限的ARP表信息。針對(duì)這種情況,我們開發(fā)網(wǎng)絡(luò)設(shè)備,需要每隔一段時(shí)間廣播一下自己的地址信息,表示自己“還活著”。但是不能太過頻繁發(fā)送,頻繁發(fā)送會(huì)被部分型號(hào)的路由認(rèn)為是病毒。
6、ARP攻擊
ARP協(xié)議有一個(gè)很大的漏洞,如果網(wǎng)絡(luò)中的所有用戶都規(guī)規(guī)矩矩,按照上述流程使用ARP就不會(huì)存在任何問題。但如果有惡意的設(shè)備收到一個(gè)ARP請(qǐng)求包(ARP請(qǐng)求包是廣播形式發(fā)送的,局域網(wǎng)所有主機(jī)都可以收到),它不管包中的IP地址是否和自己相同,都會(huì)產(chǎn)生一個(gè)ARP應(yīng)答包,告訴請(qǐng)求的用戶:我這臺(tái)主機(jī)的MAC地址就是你請(qǐng)求的目的IP地址匹配的MAC地址。另一方面,由于發(fā)送ARP請(qǐng)求的源主機(jī)不具備任何容錯(cuò)、認(rèn)證功能(ARP協(xié)議未提供任何機(jī)制實(shí)現(xiàn)這些功能),這樣它便會(huì)輕易地相信這條ARP應(yīng)答,并把它加入到了自己的ARP緩存表中。這樣做的后果可想而知,源主機(jī)在以后都會(huì)將具有該目的P地址的數(shù)據(jù)包發(fā)送到那個(gè)惡意的主機(jī)上。這樣,它能輕松地實(shí)現(xiàn)數(shù)據(jù)的竊聽,這也就是我們常常聽說的ARP攻擊的基本原理。
當(dāng)PC1發(fā)送ARP協(xié)議詢問PC2的MAC地址時(shí),由于是廣播的,PC3也收到了這個(gè)ARP請(qǐng)求包,PC3把不屬于自己的廣播包接收,同時(shí)回應(yīng)一個(gè)虛假的回應(yīng)包,告訴PC1我就是PC2。這樣PC1會(huì)收到兩個(gè)回應(yīng)包(一個(gè)正確的IP2-MAC2,一個(gè)虛假的IP2-MAC3),但是PC1并不知道到底哪個(gè)是真的,所以PC1會(huì)做出判斷,并且判斷后到達(dá)的為真,那么怎么讓虛假的回應(yīng)包后到達(dá)呢,PC3可以連續(xù)不斷的發(fā)送這樣的回應(yīng)包,總會(huì)把哪個(gè)正確的回應(yīng)包覆蓋掉。
而后PC1會(huì)建立IP2-MAC3這樣一條ARP緩存條目,以后當(dāng)PC1給PC2發(fā)送信息的時(shí)候,PC1依據(jù)OSI模型從上至下在網(wǎng)絡(luò)層給數(shù)據(jù)封裝目的IP為IP2的包頭,在鏈路層通過查詢ARP緩存表封裝目的MAC為MAC3的數(shù)據(jù)幀,送至交換機(jī),根據(jù)查詢CAM表,發(fā)現(xiàn)MAC3對(duì)應(yīng)的接口為Port3,就這樣把信息交付到了PC3,完成了一次ARP攻擊。
如果ARP攻擊嚴(yán)重的話,惡意的網(wǎng)絡(luò)設(shè)備只要在網(wǎng)絡(luò)內(nèi)閱讀送上門的所有廣播的ARP請(qǐng)求數(shù)據(jù)包,就能偷聽到網(wǎng)內(nèi)所有地址信息,進(jìn)而監(jiān)聽多臺(tái)網(wǎng)絡(luò)設(shè)備。
防止辦法:
我們可以使用靜態(tài)ARP緩存表防止ARP攻擊,但是缺點(diǎn)是違背了ARP協(xié)議的動(dòng)態(tài)地址解析原則。
本文轉(zhuǎn)載自微信公眾號(hào)「知曉編程」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系知曉編程公眾號(hào)。