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