ARP,這個隱匿在計網背後的男人




這是程序員cxuan 的第 55 篇原創文章

更多文章見 

https://github.com/crisxuan/bestJavaer



只要確定了 IP 地址後,就能夠向這個 IP 地址所在的主機發送數據報,這是我們所熟知的事情。但是再往深了想,IP 地址只是標識網絡層的地址,那麼在網絡層下方數據鏈路層是不是也有一個地址能夠告訴對方主機自己的地址呢?是的,這個地址就是MAC 地址

認識 MAC 地址

MAC 地址的全稱是 Media Access Control Address,譯爲媒體訪問控制地址,它是網絡上以太網或網絡適配器的唯一標識符。MAC 地址能夠區分不同的網絡接口,並用於多種網絡技術,尤其是大多數 IEEE 802 網絡。

MAC 地址也稱爲物理地址,硬件地址和老化地址。

MAC 地址主要用於識別數據鏈路中互聯的節點,如下圖所示

MAC 地址長 48 bit,在使用網卡(NIC) 的情況下,MAC 地址一般都會燒入 ROM 中。因此,任何一個網卡的 MAC 地址都是唯一的。MAC 地址的結構如下

MAC 地址中的 3 - 24 位表示廠商識別碼,每個 NIC 廠商都有特定唯一的識別數字。25 - 48 位是廠商內部爲識別每個網卡而用。因此,可以保證全世界不會有相同 MAC 地址的網卡。

MAC 地址也有例外情況,即 MAC 地址也會有重複的時候,但是問題不大,只要兩個 MAC 地址是屬於不同的數據鏈路層就不會出現問題。

ARP 是什麼

ARP 協議的全稱是 Address Resolution Protocol(地址解析協議),它是一個通過用於實現從 IP 地址到 MAC 地址的映射,即詢問目標 IP 對應的 MAC 地址 的一種協議。ARP 協議在 IPv4 中極其重要。

注意:ARP 只用於 IPv4 協議中,IPv6 協議使用的是 Neighbor Discovery Protocol,譯爲鄰居發現協議,它被納入 ICMPv6 中。

簡而言之,ARP 就是一種解決地址問題的協議,它以 IP 地址爲線索,定位下一個應該接收數據分包的主機 MAC 地址。如果目標主機不在同一個鏈路上,那麼會查找下一跳路由器的 MAC 地址。

ARP 的工作機制

下面我們探討一下 ARP 的工作機制是怎樣的。假設 A 和 B 位於同一鏈路,不需要經過路由器的轉換,主機 A 向主機 B 發送一個 IP 分組,主機 A 的地址是 192.168.1.2 ,主機 B 的地址是 192.168.1.3,它們都不知道對方的 MAC 地址是啥,主機 C 和 主機 D 是同一鏈路的其他主機。

主機 A 想要獲取主機 B 的 MAC 地址,通過主機 A 會通過廣播 的方式向以太網上的所有主機發送一個 ARP 請求包,這個 ARP 請求包中包含了主機 A 想要知道的主機 B 的 IP 地址的 MAC 地址。

主機 A 發送的 ARP 請求包會被同一鏈路上的所有主機/路由器接收並進行解析。每個主機/路由器都會檢查 ARP 請求包中的信息,如果 ARP 請求包中的目標 IP 地址 和自己的相同,就會將自己主機的 MAC 地址寫入響應包返回主機 A

由此,可以通過 ARP 從 IP 地址獲取 MAC 地址,實現同一鏈路內的通信。

如果是不同鏈路怎麼辦呢?

這就要使用到 代理 ARP 了,通常 ARP 會被路由器隔離,但是採用代理 ARP (ARP Proxy) 的路由器可以將 ARP 請求轉發給臨近的網段。使多個網段中的節點像是在同一網段內通信。

ARP 緩存

現在你知道了發送一次 IP 分組前通過發送一次 ARP 請求就能夠確定 MAC 地址。那麼是不是每發送一次都得經過廣播 -> 封裝 ARP 響應 -> 返回給主機這一系列流程呢?

想想看,瀏覽器是如何做的呢?瀏覽器內置了緩存能夠緩存你最近經常使用的地址,那麼 ARP 也是一樣的。ARP 高效運行的關鍵就是維護每個主機和路由器上的 ARP 緩存(或表)。這個緩存維護着每個 IP 到 MAC 地址的映射關係。通過把第一次 ARP 獲取到的 MAC 地址作爲 IP 對 MAC 的映射關係到一個 ARP 緩存表中,下一次再向這個地址發送數據報時就不再需要重新發送 ARP 請求了,而是直接使用這個緩存表中的 MAC 地址進行數據報的發送。每發送一次 ARP 請求,緩存表中對應的映射關係都會被清除。

通過 ARP 緩存,降低了網絡流量的使用,在一定程度上防止了 ARP 的大量廣播。

一般來說,發送過一次 ARP 請求後,再次發送相同請求的機率比較大,因此使用 ARP 緩存能夠減少 ARP 包的發送,除此之外,不僅僅 ARP 請求的發送方能夠緩存 ARP 接收方的 MAC 地址,接收方也能夠緩存 ARP 請求方的 IP 和 MAC 地址,如下所示

不過,MAC 地址的緩存有一定期限,超過這個期限後,緩存的內容會被清除

我們可以在 Linux 或者 Windows 中使用 arp 命令查看 ARP 緩存。選項 -a 用於顯示兩個系統緩存中所有的緩存項。

在 Linux 中使用 arp 查詢緩存

主要包含五項

  • 主機名 --- 對應一個 IP 地址

  • 硬件地址類型

  • 硬件地址

  • 標誌

  • 本地網絡接口

標誌主要分爲三類: C 、M 或 P,C 表示的是由 ARP 協議動態學習。M 類可以通過 arp -s 增加一條。P 類表示的是 發佈,對於任何 P 類項目,主機對輸入的 ARP 請求都返回一個 ARP 響應。這個選項用於配置代理 ARP。

比如我們在 Windows 中進行 ARP 緩存查詢

Windows 中的 ARP 程序顯示了 IPv4 的地址,它的接口是十六進制數,Windows 版本還指出地址是手動輸入還是 ARP 動態學習的。在上面的例子中,既有靜態的也有動態的。48 位的 MAC 地址被顯示爲 6 個十六進制數,在 Linux 中使用 : 號,在 Windows 中使用 - 進行分隔。

ARP 結構

我們上面說到,ARP 對想要知道 MAC 地址的目標主機會首先發送 ARP 請求,那麼這個請求中都攜帶哪些信息呢?下面 cxuan 就來和你聊一下。下面是在以太網中轉換一個 IPv4 的地址常用的 ARP 請求或響應的報文格式。

前面 14 個字節構成標準以太網的首部,前兩個字段 DST 和 SRC 分別表示 以太網的目的地址 和 以太網的源地址,以太網的目的地址如果是 ff:ff:ff:ff:ff:ff 全部爲 1 表示廣播地址,在同一廣播域中的所有以太網接口可以接收這些幀。後面緊跟着的是 ARP 請求的長度/類型,ARP 請求 和 ARP 應答這個值爲 0x0806

  • 硬件類型表示硬件地址的類型,硬件地址常見的有 MAC 物理或者以太網地址,對於以太網來說,此值爲 1。

  • 協議類型 指出映射的協議地址類型,對於 IPv4 地址,這個值是 0x0800

  • 硬件大小和 協議大小 分別指出硬件地址和協議地址的字節數。對於以太網中使用 IPv4 的 ARP 請求或應答,它們的值分別是 6 和 4。

  • Op 字段指出如果是 ARP 請求,Op = 1,ARP 應答 ,Op = 2,RARP 請求 Op = 3,RARP 應答,Op = 4。

  • 緊跟在 Op 之後的是 發送方硬件地址(MAC 地址)發送方的協議地址(IPv4 地址)目的硬件地址 和 目的協議地址

ARP 抓包實戰

我們分別演示在 Mac 和 Linux 下的 ARP 報文的截獲

在 Mac 環境下,我這邊使用的是 WireShark 進行抓包,你可以從官網下載,地址如下

https://www.wireshark.org/download.html

下載完成後閱讀安裝說明的手冊,閱讀後會發現需要安裝兩個插件,根據提示安裝即可,然後我們打開 WireShark ,開始報文攔截,下面是我解惑的 ARP 數據包

這款軟件很好的一個地方是對不同的數據包會有不同的顏色標識,這點非常好。

然後我們查看 ARP 請求

可以看到,這就是一個完整的 ARP 請求包,我們使用的硬件類型是以太網,協議類型是 IPv4 ,默認值是 0x0800,然後硬件大小是 6 個字節,協議大小佔用 2 個字節,Op 的全稱是 Opcode ,Op = 1 表示這是一個 ARP 請求,然後是發送方的硬件地址和協議地址,接收方的硬件地址和協議地址。

ARP 響應如下

可以看到 Op = 2,表示這是 ARP 響應。

在 Linux 環境下,你可以使用 tcpdump 截獲 ARP 數據包,如果 tcpdump not found 的話,你可以使用 yum install -y tcpdump 安裝。

使用 tcpdump -i ens33 可以打印出在 ens33 地址下的數據包,下面是我截取的 ARP 數據包。

更多關於 tcpdump 的用法,你可以參考這篇博客

https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html

大佬寫的很詳細,這裏就不再說明了。

ARP 緩存超時

緩存超時通常與 ARP 緩存中的項有關係,arp 命令可以允許管理員設置永不超時。ARP 把保存在高速緩存中的每一映射地址都設置生存時間,一般爲 20 分鐘。如果是不完整的映射,那麼緩存超時時間爲 3 分鐘,不完整的映射通常會強制發送一條不存在主機的 ARP 請求。

RARP

與 ARP 相對的,RARP(Reverse Address Resolution Protocol) 是將 ARP 反過來,從 MAC 地址定位 IP 地址的一種協議,將打印機服務器等小型嵌入式設備接入網絡時會使用到。

平常我們設置 IP 地址一般會有兩種方式,手動設置 和 DHCP 動態獲取

但是對於嵌入式設備來說,它沒有任何輸入接口,也無法通過 DHCP 獲取動態地址。

在這種情況下,就要使用到 RARP 了,你需要準備一個 RARP 服務器,在這個服務器上註冊設備的 MAC 地址和 IP 地址,然後將設備接入網絡,設備會發出一條 IP 和 MAC 地址的查詢請求給服務器,服務器會告訴設備其 IP 地址和 MAC 地址。

ARP 攻擊

ARP 是一種非常不安全的協議,目前已經有很多涉及 ARP 的攻擊,最主要的就是使用代理 ARP 功能假扮主機,對 ARP 請求作出應答,通過僞造 ARP 數據包來竊取合法用戶的通信數據,造成影響網絡傳輸速率和盜取用戶隱私信息等嚴重危害。

ARP 攻擊分類

ARP 主要攻擊方式分爲下面這幾種

  • ARP 泛洪攻擊:通過向網關發送大量 ARP 報文,導致網關無法正常響應。首先發送大量的 ARP 請求報文,然後又發送大量虛假的 ARP 響應報文,從而造成網關部分的 CPU 利用率上升難以響應正常服務請求,而且網關還會被錯誤的 ARP 緩存表充滿導致無法更新維護正常 ARP 緩存表,消耗網絡帶寬資源。

  • ARP 欺騙主機攻擊:ARP 欺騙主機的攻擊也是 ARP 衆多攻擊類型中很常見的一種。攻擊者通過 ARP 欺騙使得局域網內被攻擊主機發送給網關的流量信息實際上都發送給攻擊者。主機刷新自己的 ARP 使得在自己的ARP 緩存表中對應的 MAC 爲攻擊者的 MAC,這樣一來其他用戶要通過網關發送出去的數據流就會發往主機這裏,這樣就會造成用戶的數據外泄。

  • 欺騙網關的攻擊: 欺騙網關就是把別的主機發送給網關的數據通過欺騙網關的形式使得這些數據通過網關發送給攻擊者。這種攻擊目標選擇的不是個人主機而是局域網的網關,這樣就會攻擊者源源不斷的獲取局域網內其他用戶韻數據.造成數據的泄露,同時用戶電腦中病毒的概率也會提升。

  • 中間人攻擊: 中間人攻擊是同時欺騙局域網內的主機和網關,局域網中用戶的數據和網關的數據會發給同一個攻擊者,這樣,用戶與網關的數據就會泄露。

  • IP地址衝突攻擊: 通過對局域網中的物理主機進行掃描,掃描出局域網中的物理主機的 MAC 地址,然後根據物理主機的 MAC 進行攻擊,導致局域網內的主機產生 IP 地址衝突,影響用戶的網絡正常使用。

總結

ARP 是 TCP/IP 實現中的一個基本協議,它通常在應用程序或用戶沒有察覺到的情況下運行。ARP 可以用於映射 IP 地址爲 MAC 地址。

這篇文章我們主要講了 ARP 的基本原理,ARP 的幀結構,ARP 的工作機制,以及 ARP 代理、ARP 攻擊、RARP 和 ARP 的區別等

如果這篇文章讀者們覺得還不錯,跪求點贊、在看、留言、分享,你的支持將是我繼續肝文的動力!





 往期推薦 

🔗

我畫了 40 張圖就是爲了讓你搞懂計算機網絡層

衝吧!考研人!

閱片無數的 cxuan 給你推薦比某 hub 更爽的網站

路由器你竟然是這樣的...

搞懂這 10 張腦圖後,我膨脹了。

程序員cxuan 原來不是寫代碼的。

40 張圖帶你搞懂 TCP 和 UDP

拿下計網協議後,我就是公園裏最靚的仔

TCP/IP 基礎知識總結

計算機網絡基礎知識總結


另外,cxuan 肝了六本 PDF,公號回覆 cxuan ,領取全部。


本文分享自微信公衆號 - 程序員cxuan(cxuangoodjob)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章