圖解ARP協議(六)RARP與IARP:被遺忘的兄弟協議
一、概述
在我第一次接觸ARP協議的時候,發現這協議挺簡單的,"一去一回通過IP拿到MAC地址",整個過程在1s內就搞定了。後面學到了代理ARP,發現也不過是變了個法子,做了次"欺騙",本質還是一樣。接下來又學到了免費ARP,頓時覺得網路協議設計者太牛了,一個協議居然能折騰出這麼多玩法,連"地址檢測"都能實現。等學到了ARP嗅探和欺騙,又發現其實黑帽子更愛折騰,誰能想到這麼簡單的協議,居然能製造工具出來做內網探測和欺騙攻擊,引發這麼大的危害。
當我以為ARP這一知識點在我的技術旅途中應該就此翻篇了的時候,又冒出了RARP和IARP這兩,對比其他ARP協議的研究,當時學這兩個協議是心不甘情不願的:
第一,無論學習還是工作,極少碰到,真正"翻篇"了的協議;
第二,名字記不住,"翻轉""反轉""逆向""反向",不同技術文檔的中文翻譯有時候完全相反,沒法記。畢竟漢語這麼博大精深,就記住英文就好了,後面發現更加糟糕,因為reverse和inverse這兩個單詞僅僅2個字母之差,老外太欺負人了,這根本沒法記。
我在想,肯定也有很多朋友學到這個時候遇到了上面同樣的問題和糾結,有些堅持研究通透有些中途離開。然後我又思考了一番:ARP協議通過幾個欄位的細微調整,便能夠適用於這麼多不同場景,例如ARP、PARP、GARP、RARP、IARP,這是不是證明了它在TCP/IP協議棧裡面獨特的位置,有哪個協議能做到這一點,有這麼多花樣?所以,我的建議是:既然到了這一步了,就繼續搞清楚吧,否管它是否用的上。
那麼,什麼是RARP和IARP?中文叫法是什麼?它們各自的應用場景在哪裡?數據包又是怎樣的?
二、RARP原理與實踐
RARP(Reverse ARP)即反向ARP或者翻轉ARP,顧名思義,它跟常規的ARP功能恰恰是相反的,ARP是實現IP到MAC地址的映射,而RARP是實現MAC到IP地址的映射。
什麼樣的設備或者場景需要用到RARP呢?其實RARP原先在設計的時候,是適用於大部分終端設備的,不僅僅是無盤工作站,它的功能就是根據MAC獲取IP地址,功能跟DHCP是一樣的。
例如,一個電腦剛接入網路,沒有IP地址就無法上網,此時它便會通過本地MAC地址,對外發送RARP Request廣播請求,看看區域網裡面是否有RARP Server,若Server上面有關於此MAC地址的映射IP,則會向此電腦返回RARP Reply回應,電腦便獲取了IP地址=>
RARP通過非常精簡的交互實現了IP地址的獲取,但同時也暴露了一些問題:
①RARP Server必須提前將MAC和IP的映射靜態綁定在本地;若沒有提前綁定,則電腦用自己MAC詢問時,Server也不會回應;
②RARP Server只能給電腦分配IP地址,不包括其他信息,包括網關、DNS等信息;
③RARP基於二層封裝,只能運行在同一網段;每個網段分配地址,都需要一個RARP Server。
在RARP的基礎上,後面又有了Bootp協議,直譯過來便是"啟動協議",功能同RARP,也是用於電腦接入網路時,用來獲取IP地址的。但是畢竟做了增強,Bootp協議能讓電腦啟動時,不僅僅獲取IP地址,而且能獲取到網關地址,從而讓電腦實現跨網段通信。
Bootp協議雖然讓電腦能夠獲取到更多的信息,但是仍然沒有解決最大的問題:
伺服器仍然需要提前手工綁定MAC和IP地址,而對於現在的移動網路或者公共網路而言,這根本無法實現。
因為用戶什麼時候接入,接入的MAC是多少,管理員沒法提前知道。這就有了後面的DHCP,DHCP通過動態分配的方式解決了這個詬病,並且通過DHCP中繼技術實現了跨網段地址分配,實現了全網IP地址的統一管理。
小結:RARP是一種逝去的地址分配技術,是Bootp和DHCP的鼻祖,目前我們的電腦基本不會用到這個協議,只有部分無盤工作站等情況需要用到。
為了讓大家更深入理解RARP,這裡我們從數據包結構來解構它的功能。RARP的數據包比較難抓取,不像常規的ARP和DHCP協議,這裡給大家提供一個思路:對於比較難找的協議數據包,除了搭建特殊的實驗環境抓取之外,也可以藉助一些[數據包生成工具]來實現,例如nmap掃描器裡面集成的nping工具,可以生成非常多的協議包,包括arp、icmp、udp、tcp等等。
nmap的安裝以及nping的使用,可以到https://nmap.org/nping下查詢。這裡給大家演示如何用nping生成rarp數據包,下圖是我們要"人為"構造出來的交互場景=>
我的Macbook已經安裝了nmap,自帶了nping工具,跟ARP/RARP相關的幫助命令如下:
jayking:~ jaykingchen$ npingNping 0.7.60 ( https://nmap.org/nping )Usage: nping [Probe mode] [Options] {target specification}TARGET SPECIFICATION: Targets may be specified as hostnames, IP addresses, networks, etc. Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.*.1-24ARP/RARP PROBE MODE: --arp-type <type> : Type: ARP, ARP-reply, RARP, RARP-reply. --arp-sender-mac <mac> : Set sender MAC address. --arp-sender-ip <addr> : Set sender IP address. --arp-target-mac <mac> : Set target MAC address. --arp-target-ip <addr> : Set target IP address.
為了能夠抓取到rarp的請求和回復包,首先打開wireshark抓取電腦網卡流量並設置arp過濾,然後採用兩條命令:第一條命令模擬我的電腦發起的RARP請求包,第二條命令模擬區域網網關設備(極路由)返回的RARP回復包。
jayking:~ jaykingchen$ sudo nping --arp-type RARP --arp-sender-mac ac:bc:32:8b:56:df --arp-sender-ip 0.0.0.0 --arp-target-mac ac:bc:32:8b:56:df --arp-target-ip 0.0.0.0 192.168.199.255Starting Nping 0.7.60 ( https://nmap.org/nping ) at 2017-09-04 23:57 CSTSENT (0.0077s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DFSENT (1.0079s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DFSENT (2.0084s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DFSENT (3.0111s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DFSENT (4.0159s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DFMax rtt: N/A | Min rtt: N/A | Avg rtt: N/ARaw packets sent: 5 (210B) | Rcvd: 0 (0B) | Lost: 5 (100.00%)Nping done: 1 IP address pinged in 5.02 seconds
jayking:~ jaykingchen$ sudo nping --arp-type RARP-reply --arp-sender-mac d4:ee:07:54:c1:9e --arp-sender-ip 192.168.199.1 --arp-target-mac ac:bc:32:8b:56:df --arp-target-ip 192.168.199.153 192.168.199.153Starting Nping 0.7.60 ( https://nmap.org/nping ) at 2017-09-05 00:03 CSTSENT (0.8094s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153SENT (1.8107s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153SENT (2.8114s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153SENT (3.8138s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153SENT (4.8159s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153Max rtt: N/A | Min rtt: N/A | Avg rtt: N/ARaw packets sent: 5 (210B) | Rcvd: 0 (0B) | Lost: 5 (100.00%)Nping done: 1 IP address pinged in 5.82 seconds
此時,從Wireshark抓取到的RARP請求和回復包如下=>
至此,關於RARP的原理和數據包分析便完成了。
三、IARP原理與實踐
IARP(Inverse ARP)即逆向ARP,這個沒法"顧名思義",因為它既不是IP到MAC的映射,也不是MAC到IP的映射,而是DLCI到IP的映射。相比前面所有其他ARP協議,IARP的應用場景不是在乙太網(區域網)裡面,而是在幀中繼網路(廣域網)裡面。
要真正理解DLCI和IARP,需要有一些幀中繼網路技術背景,這裡簡單說下:
DLCI(Data Link Connection Identifier)數據鏈接連接標識,是幀中繼網路裡面的二層地址,好比乙太網裡面的MAC地址,用於標記幀中繼網路裡面的虛擬專線。示圖如下:
圖中R1和R2通過專線連接到幀中繼交換機,對應的DLCI號分別是102和201。交換機通過轉發表進行數據交換:根據介面收到數據包的DLCI,查看對應的介面,轉發到匹配的線路。
所以說,幀中繼網路裡面,DLCI類似MAC,決定了數據包的去向。那麼,DLCI和IP的映射關係又是如何的呢?我們來看下幀中繼網路裡面的數據封裝,以R1 ping R2為例:
從這裡我們可以看到幀中繼網路的數據封裝和轉發模式都不同於乙太網:
①二層封裝的時候,不需要源目地址,只需要本地DLCI;例如10.1.1.1 ping 10.1.1.2,源目IP地址這個跟乙太網的封裝是一樣的,但是鏈路層封裝不需要目標DLCI 201。
②交換機會改變二層地址信息,例如這裡的DLCI從左邊的102,變成了右邊的201。
理解了這些差異,我們才能得到這裡DLCI和IP的映射關係:即目標IP地址與本地DLCI的映射。例如R1要訪問10.1.1.2,此時需要映射到本地的102;而R2要訪問10.1.1.1,則需要映射到本地的201。
更完整的說明:逆向ARP解決幀中繼網路里目標IP地址與本地DLCI的映射,並且讓通信雙方生成幀中繼映射表(frame-relay map)。好比ARP解決了乙太網裡面目的IP與目標MAC的映射,並且讓通信方生成ARP映射表。
接下來,我們通過實驗環境來驗證,這裡可以通過GNS3模擬器搭建以上環境,並且抓包驗證=>
①為R1和R2打開介面,封裝幀中繼,並配置IP地址:
R1(config)#int s0/0R1(config-if)#no shutdownR1(config-if)#encapsulation frame-relayR1(config-if)#ip address 10.1.1.1 255.255.255.0R2(config)#int s0/0R2(config-if)#no shutdownR2(config-if)#encapsulation frame-relayR2(config-if)#ip address 10.1.1.2 255.255.255.0
② 開啟wireshark抓包,抓取IARP請求和回復包:
③查看R1和R2本地生成的IARP映射表:
R1#show frame-relay mapSerial0/0 (up): ip 10.1.1.2 dlci 102(0x66,0x1860), dynamic, broadcast,, status defined, activeR2#show frame-relay mapSerial0/0 (up): ip 10.1.1.1 dlci 201(0xC9,0x3090), dynamic, broadcast,, status defined, active
④測試R1和R2之間的聯通並抓取ICMP包:
R1#ping 10.1.1.2Type escape sequence to abort.Sending 5, 100-byte ICMP Echos to 10.1.1.2, timeout is 2 seconds:!!!!!Success rate is 100 percent (5/5), round-trip min/avg/max = 68/75/88 ms
至此,IARP的原理與實踐並完成了。那麼,既然IARP能夠實現幀中繼的通信,為什麼在文章開頭,我們提到說IARP跟RARP一樣,在工作中已經不常見了呢?
①幀中繼作為一種廣域網遠程連接技術,正在慢慢被其他技術代替;
②IARP不像ARP協議可以實時交互,它是周期性運行的,通信雙方若丟失IARP映射表,則需要等待到固定的時間交互才能重新生成並通信。另外不同廠商不同型號對IARP的兼容性也可能不同。基於這些原因,一般建議直接關閉IARP協議,採用靜態綁定的方式生成映射表,這裡不再深入。(有興趣的小夥伴可以觀看我之前的技術視頻教程,有深入講解了如何關閉IARP和靜態綁定的做法。)
四、RARP與IARP協議總結
①RARP用於實現MAC到IP的映射,本質就是為了獲取IP地址,是Bootp和DHCP協議的鼻祖;
②IARP用於實現幀中繼網路中DLCI到IP地址的映射,生成幀中繼映射表(類似ARP表),實現數據封裝與通信;
③相比ARP、免費ARP、代理ARP、ARP攻防等技術,RARP和IARP隨著技術的更新迭代正在退出歷史舞台,成為"被遺忘的兄弟協議" 。(對於初學者來說,也算是個好事,因為終於不用"翻轉""反向""逆向"各種分不清了)
ARP協議大總結及下一階段預告
到這裡,我們通過六篇文章終於搞定了ARP協議的方方面面,包括它們的應用場景、設計思想、數據包結構、實驗驗證等等。
另外,為什麼這次圖解系列的開頭是從ARP協議開始寫,而不是從Ethernet、IP、TCP、HTTP或其他呢?
主要是因為"ARP太簡單了",簡單到大家在學網路和安全的時候,都容易去忽略協議背後的很多細節,例如很多人認為[ARP的請求就一定是廣播的,回復就一定是單播的],但"常識"背後也有另外一些特殊的情況。所以,通過這一個足夠簡單的協議,為大家解構背後相對複雜的機制,為後續深入研究開個好頭。
另外一個原因就是"ARP很有趣",例如協議設計者通過不同的操作代碼(opcode),做了非常多的變種(arp是1和2,rarp是3和4,iarp是8和9),做一個模型便可以多處應用;而且通過精巧的構造,就可以在內網造成極大的殺傷力。
anyway,圖解ARP協議只是整個系列的開篇,下一階段,我們將進入IP協議,探討IP協議原理、數據包結構、優缺點、地址結構、IP攻擊與防禦(分片攻擊、欺騙攻擊)……
-------------------
知乎專欄:跟傑哥學網路與安全
新浪微博:@拼客學院陳鑫傑
微信公眾號:拼客院長陳鑫傑(搜索"pingsec"即可關注,大牛都在看)
拼客學院:http://www.pinginglab.net(專註網路|安全|運維的IT學院)
推薦閱讀: