這是程序員 cxuan 的第 55 篇原創(chuàng)文章
只要確定了 IP 地址后,就能夠向這個(gè) IP 地址所在的主機(jī)發(fā)送數(shù)據(jù)報(bào),這是我們所熟知的事情。但是再往深了想,IP 地址只是標(biāo)識(shí)網(wǎng)絡(luò)層的地址,那么在網(wǎng)絡(luò)層下方數(shù)據(jù)鏈路層是不是也有一個(gè)地址能夠告訴對(duì)方主機(jī)自己的地址呢?是的,這個(gè)地址就是MAC 地址
。
認(rèn)識(shí) MAC 地址
MAC 地址的全稱是 Media Access Control Address
,譯為媒體訪問控制地址,它是網(wǎng)絡(luò)上以太網(wǎng)或網(wǎng)絡(luò)適配器的唯一標(biāo)識(shí)符。MAC 地址能夠區(qū)分不同的網(wǎng)絡(luò)接口,并用于多種網(wǎng)絡(luò)技術(shù),尤其是大多數(shù) IEEE 802 網(wǎng)絡(luò)。
MAC 地址也稱為物理地址,硬件地址和老化地址。
MAC 地址主要用于識(shí)別數(shù)據(jù)鏈路中互聯(lián)的節(jié)點(diǎn),如下圖所示
MAC 地址長 48 bit,在使用網(wǎng)卡(NIC)
的情況下,MAC 地址一般都會(huì)燒入 ROM 中。因此,任何一個(gè)網(wǎng)卡的 MAC 地址都是唯一的。MAC 地址的結(jié)構(gòu)如下
MAC 地址中的 3 - 24 位表示廠商識(shí)別碼,每個(gè) NIC 廠商都有特定唯一的識(shí)別數(shù)字。25 - 48 位是廠商內(nèi)部為識(shí)別每個(gè)網(wǎng)卡而用。因此,可以保證全世界不會(huì)有相同 MAC 地址的網(wǎng)卡。
MAC 地址也有例外情況,即 MAC 地址也會(huì)有重復(fù)的時(shí)候,但是問題不大,只要兩個(gè) MAC 地址是屬于不同的數(shù)據(jù)鏈路層就不會(huì)出現(xiàn)問題。
ARP 是什么
ARP 協(xié)議的全稱是 Address Resolution Protocol(地址解析協(xié)議)
,它是一個(gè)通過用于實(shí)現(xiàn)從 IP 地址到 MAC 地址的映射,即詢問目標(biāo) IP 對(duì)應(yīng)的 MAC 地址 的一種協(xié)議。ARP 協(xié)議在 IPv4 中極其重要。
注意:ARP 只用于 IPv4 協(xié)議中,IPv6 協(xié)議使用的是 Neighbor Discovery Protocol,譯為鄰居發(fā)現(xiàn)協(xié)議,它被納入 ICMPv6 中。
簡而言之,ARP 就是一種解決地址問題的協(xié)議,它以 IP 地址為線索,定位下一個(gè)應(yīng)該接收數(shù)據(jù)分包的主機(jī) MAC 地址。如果目標(biāo)主機(jī)不在同一個(gè)鏈路上,那么會(huì)查找下一跳路由器的 MAC 地址。
ARP 的工作機(jī)制
下面我們探討一下 ARP 的工作機(jī)制是怎樣的。假設(shè) A 和 B 位于同一鏈路,不需要經(jīng)過路由器的轉(zhuǎn)換,主機(jī) A 向主機(jī) B 發(fā)送一個(gè) IP 分組,主機(jī) A 的地址是 192.168.1.2 ,主機(jī) B 的地址是 192.168.1.3,它們都不知道對(duì)方的 MAC 地址是啥,主機(jī) C 和 主機(jī) D 是同一鏈路的其他主機(jī)。
主機(jī) A 想要獲取主機(jī) B 的 MAC 地址,通過主機(jī) A 會(huì)通過廣播
的方式向以太網(wǎng)上的所有主機(jī)發(fā)送一個(gè) ARP 請(qǐng)求包
,這個(gè) ARP 請(qǐng)求包中包含了主機(jī) A 想要知道的主機(jī) B 的 IP 地址的 MAC 地址。
主機(jī) A 發(fā)送的 ARP 請(qǐng)求包會(huì)被同一鏈路上的所有主機(jī) / 路由器接收并進(jìn)行解析。每個(gè)主機(jī) / 路由器都會(huì)檢查 ARP 請(qǐng)求包中的信息,如果 ARP 請(qǐng)求包中的目標(biāo) IP 地址
和自己的相同,就會(huì)將自己主機(jī)的 MAC 地址寫入響應(yīng)包返回主機(jī) A
由此,可以通過 ARP 從 IP 地址獲取 MAC 地址,實(shí)現(xiàn)同一鏈路內(nèi)的通信。
如果是不同鏈路怎么辦呢?
這就要使用到 代理 ARP
了,通常 ARP 會(huì)被路由器隔離,但是采用代理 ARP (ARP Proxy) 的路由器可以將 ARP 請(qǐng)求轉(zhuǎn)發(fā)給臨近的網(wǎng)段。使多個(gè)網(wǎng)段中的節(jié)點(diǎn)像是在同一網(wǎng)段內(nèi)通信。
ARP 緩存
現(xiàn)在你知道了發(fā)送一次 IP 分組前通過發(fā)送一次 ARP 請(qǐng)求就能夠確定 MAC 地址。那么是不是每發(fā)送一次都得經(jīng)過廣播 -> 封裝 ARP 響應(yīng) -> 返回給主機(jī)這一系列流程呢?
想想看,瀏覽器是如何做的呢?瀏覽器內(nèi)置了緩存能夠緩存你最近經(jīng)常使用的地址,那么 ARP 也是一樣的。ARP 高效運(yùn)行的關(guān)鍵就是維護(hù)每個(gè)主機(jī)和路由器上的 ARP 緩存(或表)
。這個(gè)緩存維護(hù)著每個(gè) IP 到 MAC 地址的映射關(guān)系。通過把第一次 ARP 獲取到的 MAC 地址作為 IP 對(duì) MAC 的映射關(guān)系到一個(gè) ARP 緩存表中,下一次再向這個(gè)地址發(fā)送數(shù)據(jù)報(bào)時(shí)就不再需要重新發(fā)送 ARP 請(qǐng)求了,而是直接使用這個(gè)緩存表中的 MAC 地址進(jìn)行數(shù)據(jù)報(bào)的發(fā)送。每發(fā)送一次 ARP 請(qǐng)求,緩存表中對(duì)應(yīng)的映射關(guān)系都會(huì)被清除。
通過 ARP 緩存,降低了網(wǎng)絡(luò)流量的使用,在一定程度上防止了 ARP 的大量廣播。
一般來說,發(fā)送過一次 ARP 請(qǐng)求后,再次發(fā)送相同請(qǐng)求的幾率比較大,因此使用 ARP 緩存能夠減少 ARP 包的發(fā)送,除此之外,不僅僅 ARP 請(qǐng)求的發(fā)送方能夠緩存 ARP 接收方的 MAC 地址,接收方也能夠緩存 ARP 請(qǐng)求方的 IP 和 MAC 地址,如下所示
不過,MAC 地址的緩存有一定期限,超過這個(gè)期限后,緩存的內(nèi)容會(huì)被清除。
我們可以在 Linux 或者 Windows 中使用 arp 命令查看 ARP 緩存。選項(xiàng) -a 用于顯示兩個(gè)系統(tǒng)緩存中所有的緩存項(xiàng)。
在 Linux 中使用 arp 查詢緩存
主要包含五項(xiàng)
主機(jī)名 --- 對(duì)應(yīng)一個(gè) IP 地址
硬件地址類型
硬件地址
標(biāo)志
本地網(wǎng)絡(luò)接口
標(biāo)志主要分為三類
: C 、M 或 P,C 表示的是由 ARP 協(xié)議動(dòng)態(tài)學(xué)習(xí)。M 類可以通過 arp -s 增加一條。P 類表示的是 發(fā)布
,對(duì)于任何 P 類項(xiàng)目,主機(jī)對(duì)輸入的 ARP 請(qǐng)求都返回一個(gè) ARP 響應(yīng)。這個(gè)選項(xiàng)用于配置代理 ARP。
比如我們?cè)?Windows 中進(jìn)行 ARP 緩存查詢
Windows 中的 ARP 程序顯示了 IPv4 的地址,它的接口是十六進(jìn)制數(shù),Windows 版本還指出地址是手動(dòng)輸入還是 ARP 動(dòng)態(tài)學(xué)習(xí)的。在上面的例子中,既有靜態(tài)的也有動(dòng)態(tài)的。48 位的 MAC 地址被顯示為 6 個(gè)十六進(jìn)制數(shù),在 Linux 中使用 :
號(hào),在 Windows 中使用 -
進(jìn)行分隔。
ARP 結(jié)構(gòu)
我們上面說到,ARP 對(duì)想要知道 MAC 地址的目標(biāo)主機(jī)會(huì)首先發(fā)送 ARP 請(qǐng)求,那么這個(gè)請(qǐng)求中都攜帶哪些信息呢?下面 cxuan 就來和你聊一下。下面是在以太網(wǎng)中轉(zhuǎn)換一個(gè) IPv4 的地址常用的 ARP 請(qǐng)求或響應(yīng)的報(bào)文格式。
前面 14 個(gè)字節(jié)構(gòu)成標(biāo)準(zhǔn)以太網(wǎng)的首部,前兩個(gè)字段 DST 和 SRC 分別表示 以太網(wǎng)的目的地址
和 以太網(wǎng)的源地址
,以太網(wǎng)的目的地址如果是 ff:ff:ff:ff:ff:ff
全部為 1 表示廣播地址,在同一廣播域中的所有以太網(wǎng)接口可以接收這些幀。后面緊跟著的是 ARP 請(qǐng)求的長度 / 類型,ARP 請(qǐng)求 和 ARP 應(yīng)答這個(gè)值為 0x0806
。
硬件類型
表示硬件地址的類型,硬件地址常見的有 MAC 物理或者以太網(wǎng)地址,對(duì)于以太網(wǎng)來說,此值為 1。
協(xié)議類型
指出映射的協(xié)議地址類型,對(duì)于 IPv4 地址,這個(gè)值是 0x0800
。
硬件大小
和 協(xié)議大小
分別指出硬件地址和協(xié)議地址的字節(jié)數(shù)。對(duì)于以太網(wǎng)中使用 IPv4 的 ARP 請(qǐng)求或應(yīng)答,它們的值分別是 6 和 4。
Op
字段指出如果是 ARP 請(qǐng)求,Op = 1,ARP 應(yīng)答 ,Op = 2,RARP 請(qǐng)求 Op = 3,RARP 應(yīng)答,Op = 4。
緊跟在 Op 之后的是 發(fā)送方硬件地址(MAC 地址)
,發(fā)送方的協(xié)議地址(IPv4 地址)
,目的硬件地址
和 目的協(xié)議地址
。
ARP 抓包實(shí)戰(zhàn)
我們分別演示在 Mac 和 Linux 下的 ARP 報(bào)文的截獲
在 Mac 環(huán)境下,我這邊使用的是 WireShark
進(jìn)行抓包,你可以從官網(wǎng)下載,地址如下
https://www.wireshark.org/download.html
下載完成后閱讀安裝說明的手冊(cè),閱讀后會(huì)發(fā)現(xiàn)需要安裝兩個(gè)插件,根據(jù)提示安裝即可,然后我們打開 WireShark ,開始報(bào)文攔截,下面是我解惑的 ARP 數(shù)據(jù)包
這款軟件很好的一個(gè)地方是對(duì)不同的數(shù)據(jù)包會(huì)有不同的顏色標(biāo)識(shí),這點(diǎn)非常好。
然后我們查看 ARP 請(qǐng)求
可以看到,這就是一個(gè)完整的 ARP 請(qǐng)求包,我們使用的硬件類型是以太網(wǎng),協(xié)議類型是 IPv4 ,默認(rèn)值是 0x0800,然后硬件大小是 6 個(gè)字節(jié),協(xié)議大小占用 2 個(gè)字節(jié),Op 的全稱是 Opcode ,Op = 1 表示這是一個(gè) ARP 請(qǐng)求,然后是發(fā)送方的硬件地址和協(xié)議地址,接收方的硬件地址和協(xié)議地址。
ARP 響應(yīng)如下
可以看到 Op = 2,表示這是 ARP 響應(yīng)。
在 Linux 環(huán)境下,你可以使用 tcpdump
截獲 ARP 數(shù)據(jù)包,如果 tcpdump not found 的話,你可以使用 yum install -y tcpdump
安裝。
使用 tcpdump -i ens33
可以打印出在 ens33 地址下的數(shù)據(jù)包,下面是我截取的 ARP 數(shù)據(jù)包。
更多關(guān)于 tcpdump 的用法,你可以參考這篇博客
https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html
大佬寫的很詳細(xì),這里就不再說明了。
ARP 緩存超時(shí)
緩存超時(shí)通常與 ARP 緩存中的項(xiàng)有關(guān)系,arp 命令可以允許管理員設(shè)置永不超時(shí)。ARP 把保存在高速緩存中的每一映射地址都設(shè)置生存時(shí)間,一般為 20 分鐘。如果是不完整的映射,那么緩存超時(shí)時(shí)間為 3 分鐘,不完整的映射通常會(huì)強(qiáng)制發(fā)送一條不存在主機(jī)的 ARP 請(qǐng)求。
RARP
與 ARP 相對(duì)的,RARP(Reverse Address Resolution Protocol)
是將 ARP 反過來,從 MAC 地址定位 IP 地址的一種協(xié)議,將打印機(jī)服務(wù)器等小型嵌入式設(shè)備接入網(wǎng)絡(luò)時(shí)會(huì)使用到。
平常我們?cè)O(shè)置 IP 地址一般會(huì)有兩種方式,手動(dòng)設(shè)置
和 DHCP 動(dòng)態(tài)獲取
但是對(duì)于嵌入式設(shè)備來說,它沒有任何輸入接口,也無法通過 DHCP 獲取動(dòng)態(tài)地址。
在這種情況下,就要使用到 RARP 了,你需要準(zhǔn)備一個(gè) RARP 服務(wù)器,在這個(gè)服務(wù)器上注冊(cè)設(shè)備的 MAC 地址和 IP 地址,然后將設(shè)備接入網(wǎng)絡(luò),設(shè)備會(huì)發(fā)出一條 IP 和 MAC 地址的查詢請(qǐng)求給服務(wù)器,服務(wù)器會(huì)告訴設(shè)備其 IP 地址和 MAC 地址。
ARP 攻擊
ARP 是一種非常不安全的協(xié)議,目前已經(jīng)有很多涉及 ARP 的攻擊,最主要的就是使用代理 ARP 功能假扮主機(jī),對(duì) ARP 請(qǐng)求作出應(yīng)答,通過偽造 ARP 數(shù)據(jù)包來竊取合法用戶的通信數(shù)據(jù),造成影響網(wǎng)絡(luò)傳輸速率和盜取用戶隱私信息等嚴(yán)重危害。
ARP 攻擊分類
ARP 主要攻擊方式分為下面這幾種
ARP 泛洪攻擊
:通過向網(wǎng)關(guān)發(fā)送大量 ARP 報(bào)文,導(dǎo)致網(wǎng)關(guān)無法正常響應(yīng)。首先發(fā)送大量的 ARP 請(qǐng)求報(bào)文,然后又發(fā)送大量虛假的 ARP 響應(yīng)報(bào)文,從而造成網(wǎng)關(guān)部分的 CPU 利用率上升難以響應(yīng)正常服務(wù)請(qǐng)求,而且網(wǎng)關(guān)還會(huì)被錯(cuò)誤的 ARP 緩存表充滿導(dǎo)致無法更新維護(hù)正常 ARP 緩存表,消耗網(wǎng)絡(luò)帶寬資源。
ARP 欺騙主機(jī)攻擊
:ARP 欺騙主機(jī)的攻擊也是 ARP 眾多攻擊類型中很常見的一種。攻擊者通過 ARP 欺騙使得局域網(wǎng)內(nèi)被攻擊主機(jī)發(fā)送給網(wǎng)關(guān)的流量信息實(shí)際上都發(fā)送給攻擊者。主機(jī)刷新自己的 ARP 使得在自己的 ARP 緩存表中對(duì)應(yīng)的 MAC 為攻擊者的 MAC,這樣一來其他用戶要通過網(wǎng)關(guān)發(fā)送出去的數(shù)據(jù)流就會(huì)發(fā)往主機(jī)這里,這樣就會(huì)造成用戶的數(shù)據(jù)外泄。
欺騙網(wǎng)關(guān)的攻擊
: 欺騙網(wǎng)關(guān)就是把別的主機(jī)發(fā)送給網(wǎng)關(guān)的數(shù)據(jù)通過欺騙網(wǎng)關(guān)的形式使得這些數(shù)據(jù)通過網(wǎng)關(guān)發(fā)送給攻擊者。這種攻擊目標(biāo)選擇的不是個(gè)人主機(jī)而是局域網(wǎng)的網(wǎng)關(guān),這樣就會(huì)攻擊者源源不斷的獲取局域網(wǎng)內(nèi)其他用戶韻數(shù)據(jù).造成數(shù)據(jù)的泄露,同時(shí)用戶電腦中病毒的概率也會(huì)提升。
中間人攻擊
: 中間人攻擊是同時(shí)欺騙局域網(wǎng)內(nèi)的主機(jī)和網(wǎng)關(guān),局域網(wǎng)中用戶的數(shù)據(jù)和網(wǎng)關(guān)的數(shù)據(jù)會(huì)發(fā)給同一個(gè)攻擊者,這樣,用戶與網(wǎng)關(guān)的數(shù)據(jù)就會(huì)泄露。
IP 地址沖突攻擊
: 通過對(duì)局域網(wǎng)中的物理主機(jī)進(jìn)行掃描,掃描出局域網(wǎng)中的物理主機(jī)的 MAC 地址,然后根據(jù)物理主機(jī)的 MAC 進(jìn)行攻擊,導(dǎo)致局域網(wǎng)內(nèi)的主機(jī)產(chǎn)生 IP 地址沖突,影響用戶的網(wǎng)絡(luò)正常使用。
總結(jié)
ARP 是 TCP/IP 實(shí)現(xiàn)中的一個(gè)基本協(xié)議,它通常在應(yīng)用程序或用戶沒有察覺到的情況下運(yùn)行。ARP 可以用于映射 IP 地址為 MAC 地址。
這篇文章我們主要講了 ARP 的基本原理,ARP 的幀結(jié)構(gòu),ARP 的工作機(jī)制,以及 ARP 代理、ARP 攻擊、RARP 和 ARP 的區(qū)別等
如果這篇文章讀者們覺得還不錯(cuò),跪求點(diǎn)贊、在看、留言、分享,你的支持將是我繼續(xù)肝文的動(dòng)力!