)
ARP協議這東西說它簡單是真簡單總共就兩個報文類型抓包看兩眼就能明白個大概可說它坑多也是真坑多我見過太多人配置完靜態(tài)綁定就以為萬事大吉結果換個網段、加個VLAN故障照舊。更別提那些能ping通網關但上不了外網的經典問題十有八九最后都繞回到ARP表上。這篇內容我打算把ARP從報文結構到排障實操完整捋一遍既講清楚它為什么這么設計也把我在實際網絡環(huán)境里踩過的坑和驗證過的排查手法都攤開說。不管你是剛接觸網絡協議的新手還是已經做了幾年運維、想系統(tǒng)梳理一遍底層機制的老手應該都能從里面找到能直接拿去用的東西。1. 為什么ARP值得單獨拎出來講1.1 一個看起來不需要存在的協議很多人學網絡協議的時候會有個疑問IP地址已經能定位一臺主機了為什么還要MAC地址為什么不能直接拿IP地址發(fā)數據這個問題不搞清楚ARP就永遠只是個背了忘、忘了背的知識點。原因在于網絡分層。IP地址是邏輯地址它的設計目標是可路由——讓數據包能跨越不同網絡找到目的地。但真正在物理鏈路上傳輸數據幀的時候網卡只認MAC地址不認IP。你可以把IP地址理解成快遞單上的收件地址MAC地址理解成這棟樓里具體的門牌號。快遞員交換機只負責把包裹送到樓里但最后送到哪個房間得看門牌號。ARP干的事情就是根據收件地址問出具體門牌號——已知對方IP求出對方MAC。這個類比雖然不完美但足夠說明問題ARP是邏輯地址到物理地址的翻譯官沒有它IP層的數據根本落不了地。1.2 ARP在整個通信鏈路中的位置一次完整的局域網通信數據從應用層往下走到網絡層封裝成IP包再到數據鏈路層封裝成幀。封裝幀的時候必須填源MAC和目的MAC源MAC是自己的目的MAC從哪來就是從ARP表里查。查到了直接填查不到就發(fā)ARP請求去問。這里有個關鍵點很多人忽略ARP表是緩存的不是永久的。它有老化時間動態(tài)學習的條目過一段時間不用就會被清掉。這個設計是為了適應網絡變化——萬一對方換了網卡、換了IP緩存不老化就會一直往錯誤的地方發(fā)數據。但反過來老化也帶來一個問題如果老化時間設置不當或者網絡里ARP請求太頻繁就會造成廣播風暴或者表項震蕩。這些細節(jié)后面會展開。1.3 適合誰來讀這篇內容如果你屬于下面幾類人這篇內容應該對你有直接幫助剛學完TCP/IP四層模型想知道協議之間怎么協作的入門者做網絡運維經常遇到間歇性斷網能ping通但訪問不了這類問題的從業(yè)者準備考網絡相關認證需要把ARP機制吃透的備考者做安全相關工作想了解ARP欺騙原理和防御手段的技術人員。我盡量不堆砌RFC原文而是用為什么這么設計和實際怎么排查兩條線穿插著講讀起來不會太枯燥。2. ARP報文結構拆解28字節(jié)里藏了什么2.1 報文格式逐字段說明ARP報文本身很短固定長度28字節(jié)以太網環(huán)境下。別看它短每個字段都有明確用途理解這些字段是后面分析抓包和排查故障的基礎。字段長度作用說明硬件類型2字節(jié)標識鏈路層類型以太網填1協議類型2字節(jié)標識網絡層協議IPv4填0x0800硬件地址長度1字節(jié)MAC地址長度以太網為6協議地址長度1字節(jié)IP地址長度IPv4為4操作碼2字節(jié)1表示請求2表示應答發(fā)送方MAC6字節(jié)請求方的物理地址發(fā)送方IP4字節(jié)請求方的邏輯地址目標MAC6字節(jié)請求時全0未知應答時填對方MAC目標IP4字節(jié)要查詢的邏輯地址這張表建議記牢尤其是操作碼和兩個目標字段。抓包的時候判斷一個ARP包是請求還是應答看操作碼最快判斷請求方想找誰看目標IP。2.2 請求與應答的差異在哪ARP請求是廣播發(fā)送的目的MAC填全FFF:FF:FF:FF:FF:FF意思是這個網段里所有設備都收一下。為什么必須廣播因為請求方還不知道目標MAC只能廣而告之。而ARP應答是單播發(fā)送的直接回給請求方因為請求方的MAC在請求報文里已經帶上了。這里有個容易被忽略的細節(jié)ARP請求報文里的目標MAC字段是全0不是全F。全F是幀頭里的目的MAC全0是ARP報文內部的目標MAC字段。這兩個位置不一樣抓包的時候別搞混。我第一次看ARP報文的時候就犯過這個迷糊盯著報文里的全0字段納悶了半天。2.3 免費ARP和ARP探測除了常規(guī)的請求和應答實際網絡里還有兩種特殊ARP免費ARPGratuitous ARP發(fā)送方主動廣播一個ARP請求目標IP就是自己的IP。目的有兩個——一是檢測網段內有沒有IP沖突如果有人回應說明IP被占用了二是通知網段內其他設備更新ARP表比如自己換了MAC讓大家趕緊改過來。設備剛上線、IP地址變更、主備切換的時候經常會發(fā)免費ARP。ARP探測ARP Probe在正式使用某個IP之前先發(fā)一個源IP為0.0.0.0的ARP請求目標IP是要用的那個IP。如果收到應答說明這個IP已經被別人用了不能直接用。這個機制在DHCP分配地址的時候會用到是防止IP沖突的第一道防線。注意免費ARP和ARP探測的區(qū)別在于源IP。免費ARP的源IP是自己的IPARP探測的源IP是0.0.0.0。抓包分析IP沖突問題時這個區(qū)別很關鍵。3. ARP工作流程從不知道到知道的完整過程3.1 同網段通信的ARP交互全過程假設主機A192.168.1.10要ping主機B192.168.1.20兩臺機器在同一網段A的ARP表里沒有B的記錄。整個過程是這樣的A查自己的ARP緩存沒找到192.168.1.20對應的MACA構造ARP請求源MAC是A的MAC源IP是192.168.1.10目標MAC全0目標IP是192.168.1.20以廣播形式發(fā)出網段內所有設備都收到這個廣播但只有IP為192.168.1.20的設備會處理它B收到請求后先把A的IP-MAC映射記到自己的ARP表里這是被動學習然后構造ARP應答單播回給AA收到應答把B的IP-MAC映射記到自己的ARP表里然后就可以正常封裝數據幀發(fā)數據了。這個流程里有個很重要的機制被動學習。B在收到A的請求時順手就把A的映射記下來了不需要額外再發(fā)一次請求。這意味著一次ARP交互雙方都完成了地址解析效率很高。但也正因為被動學習的存在ARP欺騙才有了可乘之機——攻擊者發(fā)一個偽造的ARP應答接收方不做驗證就更新表項。這個后面講安全的時候會細說。3.2 跨網段通信時ARP扮演什么角色跨網段通信的時候ARP的作用范圍就變了。主機A192.168.1.10要訪問192.168.2.20A發(fā)現目標IP不在自己網段于是把數據包發(fā)給網關192.168.1.1。這時候A發(fā)的ARP請求目標IP是網關的IP不是最終目的地的IP。也就是說跨網段通信時ARP解析的是網關的MAC不是目標主機的MAC。數據包到了網關之后網關再根據自己的路由表和ARP表決定下一跳發(fā)給誰。每一跳都做一次ARP解析逐跳轉發(fā)。這個機制解釋了一個常見現象如果網關的ARP表項出問題即使目標主機完全正常你也訪問不了。排查跨網段故障的時候先確認網關的ARP表再看目標主機的ARP表順序別搞反。3.3 ARP緩存表的老化與更新機制ARP緩存表不是一成不變的。動態(tài)學習的表項有老化時間不同系統(tǒng)的默認值不一樣系統(tǒng)類型默認老化時間說明Linux約60秒可調通過內核參數控制Windows約15-45秒不同版本有差異網絡設備通常300秒廠商實現不同老化時間到了之后表項會被標記為待刪除下次要用的時候重新發(fā)起ARP請求。這個機制保證了網絡變化能被及時感知但也帶來一個問題如果老化時間太短ARP請求頻繁增加廣播流量太長網絡變化感知慢。實際調優(yōu)的時候要根據網絡規(guī)模權衡。實操心得在終端設備密集的辦公網里適當延長ARP老化時間能減少廣播風暴的風險但在設備頻繁上下線的環(huán)境比如無線接入場景老化時間太長反而會導致幽靈表項表現為能ping通但實際設備已經下線。4. 實操親手抓一次ARP交互4.1 抓包環(huán)境準備要直觀理解ARP最好的辦法是自己抓一次包。我用的是最普通的家庭網絡環(huán)境一臺筆記本通過無線連到路由器另一臺設備在同一網段。抓包工具用Wireshark這個沒什么爭議免費且功能足夠。準備工作很簡單確認兩臺設備在同一網段比如都是192.168.1.x在筆記本上啟動Wireshark選擇正在使用的網卡抓包過濾器填arp只看ARP報文避免被其他流量淹沒先清空本機ARP緩存確保能抓到完整的請求-應答過程。清空ARP緩存的命令按系統(tǒng)不同# Linux系統(tǒng) sudo ip neigh flush all # Windows系統(tǒng)管理員權限 arp -d *清空之后去ping一下同網段的另一臺設備然后回Wireshark看抓到的包。4.2 抓包結果解讀正常情況下應該能看到一對報文一個廣播的ARP請求一個單播的ARP應答。在Wireshark里點開請求報文展開Address Resolution Protocol部分能看到前面表格里那些字段的實際值。重點看幾個地方Opcode請求是1應答是2Sender IP/MAC請求方自己的地址Target IP要查詢的地址Target MAC請求報文里是全0應答報文里是對方的MAC。應答報文里Sender和Target的角色互換了——原來請求方的信息變成了Target應答方的信息變成了Sender。這個角色互換是理解ARP交互的關鍵看懂了這一點整個流程就通了。4.3 用命令行查看ARP表抓包看的是過程看結果用命令行更直接# Linux ip neigh show # Windows arp -a # 網絡設備以常見命令行為例 display arp輸出里能看到IP地址、MAC地址、接口、狀態(tài)動態(tài)/靜態(tài)。狀態(tài)這一列很重要——動態(tài)表示學習來的靜態(tài)表示手動綁定的。排查故障的時候先看狀態(tài)對不對再看MAC對不對。注意不同廠商網絡設備的ARP表查看命令有差異但核心字段都是IP、MAC、接口、類型、老化時間這幾項。記不住具體命令的時候用問號補全或者查手冊別憑記憶瞎敲。5. ARP相關的典型故障與排查實錄5.1 能ping通網關但上不了外網怎么查這是最經典的ARP相關故障之一?,F象是ping網關正常ping外網地址不通DNS解析也失敗。很多人第一反應是DNS問題或者路由問題但有時候根子在ARP上。排查思路是這樣的先確認本機ARP表里網關的表項是否正確。如果網關的MAC顯示不全或者明顯不對比如全0說明ARP解析有問題清空ARP緩存重新學習看能否恢復正常如果重新學習后還是不對檢查網關側是否有ARP抑制或者靜態(tài)綁定配置檢查網段內是否有IP沖突——兩臺設備用了同一個IPARP應答會打架表現為表項頻繁變化。我遇到過一次這種情況用戶機器能ping通網關但訪問任何外網地址都超時。最后查出來是網段內有人手動配了和網關相同的IP導致網關的ARP應答被干擾。這種問題用抓包最容易定位——看ARP應答是不是來自兩個不同的MAC。5.2 ARP表項異常增多或頻繁變化ARP表項異常增多通常意味著網段內有大量設備在頻繁發(fā)ARP請求或者有掃描行為。表項頻繁變化可能是IP沖突也可能是ARP欺騙。排查手法連續(xù)多次查看ARP表觀察同一IP的MAC是否在變化抓包看ARP請求的來源統(tǒng)計哪些IP發(fā)得最頻繁檢查交換機端口的安全配置看是否有端口安全或者DAI動態(tài)ARP檢測功能可以啟用。這里要提一句ARP表項數量是有上限的不同設備上限不同。表滿了之后新的ARP學習會失敗表現為部分設備通信異常。網絡規(guī)模大的時候要關注這個上限必要時調整或者做網段拆分。5.3 常見問題速查表現象可能原因排查動作ping網關不通本機ARP表無網關表項或表項錯誤清空ARP緩存重學抓包看請求是否有應答能ping通但訪問慢ARP表項老化頻繁反復解析檢查老化時間設置觀察ARP請求頻率間歇性斷網IP沖突或ARP欺騙抓包看應答來源MAC是否唯一跨網段訪問失敗網關ARP表異常登錄網關查看ARP表確認下一跳解析正常新設備接入后老設備異常IP地址沖突檢查新設備IP配置用ARP探測確認6. ARP安全欺騙原理與防御手段6.1 ARP欺騙為什么能成功ARP協議設計之初就沒考慮安全驗證——收到ARP應答不管是不是自己請求的直接更新表項。這個無條件信任的設計在可信網絡里沒問題但在開放環(huán)境里就是漏洞。攻擊者發(fā)一個偽造的ARP應答聲稱網關IP對應的MAC是我的MAC接收方不做驗證就更新了表項之后所有發(fā)往網關的數據都發(fā)給了攻擊者。這就是中間人攻擊的基礎。更惡劣的是攻擊者可以同時欺騙通信雙方實現雙向流量劫持。這個問題的根源在于ARP沒有認證機制。要徹底解決得靠協議層面的改造但實際部署中更多是用檢測和防護手段來緩解。6.2 靜態(tài)綁定最直接但最笨的辦法最直接的防御是靜態(tài)綁定——手動把IP和MAC的映射寫死不接受動態(tài)更新。命令示例如下# Linux添加靜態(tài)ARP表項 sudo ip neigh add 192.168.1.1 lladdr AA:BB:CC:DD:EE:FF dev eth0 nud permanent # Windows添加靜態(tài)表項 netsh interface ipv4 add neighbors 以太網 192.168.1.1 AA-BB-CC-DD-EE-FF靜態(tài)綁定的優(yōu)點是簡單可靠缺點是維護成本高。設備多了綁不過來設備換網卡了還得手動改。所以實際環(huán)境里通常只對關鍵設備網關、服務器做靜態(tài)綁定終端設備還是靠動態(tài)學習。6.3 動態(tài)ARP檢測與端口安全規(guī)模大一點的網絡更常用的是交換機側的防護功能DAI動態(tài)ARP檢測結合DHCP Snooping的綁定表檢查ARP報文的合法性非法的直接丟棄端口安全限制每個端口允許學習的MAC數量防止MAC泛洪ARP限速限制單位時間內ARP報文的數量防止ARP風暴。這些功能需要在交換機上配置具體命令因廠商而異。配置之前要確認DHCP Snooping已經啟用并且綁定表準確否則DAI可能誤殺正常流量。我見過有人只開了DAI沒開DHCP Snooping結果整個網段ARP全被丟棄排查了半天才發(fā)現是配置順序問題。實操心得部署DAI之前先在鏡像端口抓一段時間的ARP流量確認綁定表覆蓋了所有合法設備再正式啟用。直接上線風險太大一旦誤殺就是大面積斷網。7. 幾個容易被忽略的ARP細節(jié)7.1 ARP代理與跨網段解析ARP代理Proxy ARP是個有意思的機制路由器收到ARP請求時如果目標IP不在本網段但路由可達路由器可以用自己的MAC代答讓請求方以為目標就在本地。這個機制在早期網絡里用來做透明子網劃分現在用得少了但在某些場景下還會遇到。啟用Proxy ARP要謹慎它會讓網絡拓撲變得不直觀——明明跨網段看起來卻像同網段。排查故障的時候如果不知道有Proxy ARP很容易被誤導。7.2 免費ARP在雙機熱備中的作用雙機熱備場景里主備切換的時候備用設備會發(fā)免費ARP通知網段內所有設備這個VIP的MAC變了趕緊更新。如果免費ARP沒發(fā)出去或者被過濾了切換后流量還是往舊設備發(fā)表現為切換不生效。排查這類問題的時候重點看切換瞬間有沒有免費ARP發(fā)出以及接收方有沒有正確更新表項。有些安全設備會過濾免費ARP這個要提前確認。7.3 虛擬化環(huán)境下的ARP特殊性虛擬化環(huán)境里虛擬機的MAC是虛擬的ARP行為受虛擬交換機影響。常見的問題包括MAC地址沖突克隆虛擬機沒改MAC、虛擬交換機不轉發(fā)廣播導致ARP請求收不到、安全組規(guī)則攔截ARP等。在云環(huán)境里排查網絡問題ARP往往是第一個要看的點。先確認虛擬機的ARP表能不能正常學習到網關再看安全組和網絡ACL有沒有放行ARP。這個順序能省不少時間。8. 寫在最后的實操體會ARP這個協議單獨看每個知識點都不難難的是把它放到真實網絡環(huán)境里去理解。我剛開始做運維的時候遇到網絡故障總是先懷疑路由、懷疑DNS后來發(fā)現很多問題的根子就在ARP表上——表項錯了、表項老了、表項被欺騙了。現在我的排查習慣是先看本機ARP表再看網關ARP表最后抓包確認交互過程。這個順序看起來笨但覆蓋了絕大多數局域網通信問題。尤其是能ping通但訪問異常這類模糊現象從ARP入手往往最快定位。還有一個體會是抓包這件事不能偷懶。命令行看ARP表只能看到結果看不到過程。很多問題比如應答來自多個MAC、請求發(fā)了沒回應答只有抓包才能看清楚。Wireshark的ARP過濾器用熟了排查效率會高很多。最后提一個容易被忽略的點不同廠商設備對ARP的實現有差異老化時間、表項上限、免費ARP的發(fā)送時機都可能不一樣。做跨廠商組網的時候這些差異要提前確認別想當然地按一個標準來配。我吃過這個虧兩臺設備老化時間差了一倍結果一邊表項還在、一邊已經老化通信時通時斷查了很久才發(fā)現是參數不一致。