ARP 協(xié)議抓包解析

協(xié)議設(shè)計

場景

layer3 網(wǎng)絡(luò)中(網(wǎng)絡(luò)層)机打,IP 協(xié)議中 IPv4 使用32位地址

layer2 網(wǎng)絡(luò)中(鏈路層),機器間通訊尋址是用 MAC 48位地址咕痛,ARP 協(xié)議在這一層游走咽筋。

那么當(dāng) layer3 下發(fā)一個數(shù)據(jù)包時铃将,硬件需要知道目標(biāo)設(shè)備的 MAC 地址才能確定接收方,但報文中只給了一個 IP 地址庭砍,硬件設(shè)備玩不來 layer3 那一套裹虫,老頭子們就整出一套 ARP 協(xié)議。

報文內(nèi)容

我們直接通過 tshark 抓包后的字段信息學(xué)習(xí),更清晰易懂

有耐心的同學(xué)可以去 RFC 看看字段定義

Request

Address Resolution Protocol (request)
    Hardware type: Ethernet (1)
    Protocol type: IPv4 (0x0800)
    Hardware size: 6
    Protocol size: 4
    Opcode: request (1)
    Sender MAC address: Dell_aa:aa:aa (80:18:44:aa:aa:aa)
    Sender IP address: 10.0.2.123
    Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00)
    Target IP address: 10.0.2.251

Fields:

  1. Protocol: 請求轉(zhuǎn)換的地址協(xié)議類型,此處未 IPv4
  2. Size: 地址字段的字節(jié)數(shù)
  3. Sender: 發(fā)起方
  4. Target MAC address: all 0 broadcast
  5. Target IP address: 請求轉(zhuǎn)換的地址

Reply

Address Resolution Protocol (reply)
    Hardware type: Ethernet (1)
    Protocol type: IPv4 (0x0800)
    Hardware size: 6
    Protocol size: 4
    Opcode: reply (2)
    Sender MAC address: Dell_cc:cc:cc (f4:8e:38:cc:cc:cc)
    Sender IP address: 10.0.2.251
    Target MAC address: Dell_aa:aa:aa (80:18:44:aa:aa:aa)
    Target IP address: 10.0.2.123

字段含義同上,建議閱讀下方偽代碼急黎,就基本能理解 arp 的工作原理了。

Received arp frame

If I have Hardware type (mac addr) == False: exit
If I have Protocol (IPv4) == False: exit
# 上面兩個都沒的話侧到,沒得玩
Set Merge_flag = False
    # 更新舊記錄勃教,設(shè)置flag
    If <protocol type, sender protocol address> in arp_table:
        Update it
        Set Merge_flag = True
# 如果我是被請求方
If target target protocal(ip) address == mine:
    If Merge_flag == False: 
        # 新紀錄,直接添加
        arp_table.append(<protocol type, sender protocol address, sender hardware address>)
    If Opcode == Request:
        # 直接在原報文中互換字段匠抗,設(shè)置新值后發(fā)送故源。巧妙~
        Swap Mac and IP
        Set Sender info = mine
        Set Opcode = reply
        Send this arp

拓展信息: MAC Address Table

交換機有很多個端口,當(dāng)需要轉(zhuǎn)發(fā)幀給未知 mac 地址時汞贸,會 arp flood 所有的端口绳军,這顯然是比較浪費資源的印机。

因此交換機會維護一個 mac address table,當(dāng)從 a 端口收到來自 h 地址的廣播幀時门驾,會將 a-h 作為一條記錄加進 mac address table射赛。當(dāng)后續(xù)有發(fā)往 h 地址的廣播時,就能直接將廣播幀轉(zhuǎn)發(fā)給 a 端口奶是。

Arp Spoof 就是利用這一機制楣责,不停向交換機發(fā)送虛假的 mac 地址,塞滿它的 table聂沙,讓它在轉(zhuǎn)發(fā)時不得不 flood 所有端口秆麸,是比較常見的攻擊手段。

Tshark 抓包

Case1 - 同子網(wǎng)

  • host-a: 10.0.0.123
  • gateway:
  • host-b: 10.0.0.125
  • 拓撲結(jié)構(gòu)圖


Tips:

  1. layer2 switch 是二層交換機及汉,只有二層網(wǎng)絡(luò)功能的交換機
  2. layer3 switch 是含有部分路由功能(三層網(wǎng)絡(luò))的交換機

host-a ping host-b 捕捉 ARP 協(xié)議

# 清除 arp 緩存內(nèi)容
host-a$ sudo ip -s neigh flush all
host-b$ sudo ip -s neigh flush all
# 抓包開始
host-a$ sudo tshark -i eno1 -f 'arp host 10.0.0.125 or icmp'
host-a$ ping 10.0.0.125 -c1

# 抓包結(jié)果
# host-a 發(fā)出 arp request沮趣,尋求 host-b mac addr
    1 0.000000000 Dell_aa:aa:aa → Broadcast    ARP 42 Who has 10.0.0.125? Tell 10.0.0.123
# host-b 響應(yīng)了
    2 0.000158010 Dell_bb:bb:bb → Dell_aa:aa:aa ARP 60 10.0.0.125 is at 80:18:44:f0:ea:38
# 開始通訊
    3 0.000168966   10.0.0.123 → 10.0.0.125   ICMP 98 Echo (ping) request  id=0x2017, seq=1/256, ttl=64
    4 0.000328873   10.0.0.125 → 10.0.0.123   ICMP 98 Echo (ping) reply    id=0x2017, seq=1/256, ttl=64 (request in 3)
# 來自網(wǎng)絡(luò)中其他節(jié)點的廣播~~
    5 1.008209509 Dell_cc:cc:cc → Broadcast    ARP 60 Who has 10.0.0.4? Tell 10.0.0.251
# 很奇怪,怎么 host-b 又發(fā)了一個 unicast
    6 5.150301642 Dell_bb:bb:bb → Dell_aa:aa:aa ARP 60 Who has 10.0.0.123? Tell 10.0.0.125
    7 5.150311419 Dell_aa:aa:aa → Dell_bb:bb:bb ARP 42 10.0.0.123 is at 80:18:44:aa:aa:aa

現(xiàn)象及疑問

發(fā)現(xiàn)一個有趣的現(xiàn)象坷随,原本設(shè)想只會抓到兩個包(request from 123 + reply from 125)房铭,但實際抓到了 4 個(125 主動發(fā)起一次 request)。

ARP RFC 中提到甸箱,在完成 reply 后 target host 節(jié)點應(yīng)該是記下了 source mac 地址了,為何還發(fā)起了一次查詢 10.0.0.123 的迅脐。

猜想

有可能是以下原因:

  • ARP spoofing (我的網(wǎng)絡(luò)挺安全吧种场)
  • Directed ARP (跨子網(wǎng),路由會向相鄰路由發(fā)起 ARP)
  • ARP 的 Refresh 行為谴蔑,通過發(fā)起 Unicast Poll

簡單排除:

  • 125 發(fā)起的是 Unicast ARP Request豌骏,且兩臺機器同子網(wǎng),不需要借助路由可直接訪問隐锭,因此可以排除交換機行為

驗證

Linux APR:
前兩種情況都與我們的網(wǎng)絡(luò)環(huán)境不相符窃躲,所以搜了下 Linux arp(7) table cache refresh 機制。

When there is no positive feedback for an existing mapping after some
time (see the /proc interfaces below), a neighbor cache entry is
considered stale. Positive feedback can be gotten from a higher
layer; for example from a successful TCP ACK.

  • arp 將一個 ip 標(biāo)記為 stale 后钦睡,會在間隔 delay_first_probe_time(5s) 后發(fā)起 Request 探針蒂窒。
  • arp 會為可用 record 基于 base_reachable_time_ms(30s) 參數(shù)生成一個隨機有效時間。
# 查看第一次 probe 發(fā)起的延遲
host-b$ cat /proc/sys/net/ipv4/neigh/eno1/delay_first_probe_time 
5
# 發(fā)現(xiàn)跟我們抓包時的間隔時間很像荞怒,修改成 10 試一試
host-b# echo 10 > cat /proc/sys/net/ipv4/neigh/eno1/delay_first_probe_time
# 真的間隔變成 10s洒琢,這里就不放結(jié)果了~~信我就是了!

# 再看一下記錄的狀態(tài)轉(zhuǎn)換
# 清理兩端的 apr cache
host-a$ ping host-b -c1
host-b$ ip neigh
10.0.0.123 dev eno1 lladdr 80:18:44:f0:bb:7c DELAY

# host-b probe request 發(fā)起后
host-b$ ip neigh
10.0.0.123 dev eno1 lladdr 80:18:44:f0:bb:7c REACHABLE

# 等一段比較長時間 >60s
host-b$ ip neigh
10.0.0.123 dev eno1 lladdr 80:18:44:f0:bb:7c STALE

# 這時候從 125 發(fā)起 ping (arp 表內(nèi)已存在)
host-b$ ping host-a -c1
# host-a 收到 ping褐桌,但沒有 arp request
# host-b 上的記錄變?yōu)?DELAY
host-b$ ip neigh
10.0.0.123 dev eno1 lladdr 80:18:44:f0:bb:7c DELAY

# 10s 后 probe 發(fā)起并受到 reply
host-b$ ip neigh
10.0.0.123 dev eno1 lladdr 80:18:44:f0:bb:7c REACHABLE

# 以上行為與 linux arp 文檔描述一致

總結(jié)

  1. 同子網(wǎng)通訊衰抑,發(fā)起端廣播 arp 請求目標(biāo)機 mac 地址
  2. 等待 arp 請求得到回應(yīng),取得 10.0.0.125 的 mac-address
  3. 與目標(biāo)建立通訊
  4. Probe request 是 linux 下行為荧嵌,非 arp 協(xié)議定義行為呛踊。

Case2 - 跨子網(wǎng)

  • host-a: 10.0.2.123 (改了下 ip 和 gateway)
  • host-b: 10.0.0.125
  • Gatway: 10.0.2.251砾淌、10.0.0.251 (同一臺三層交換機)
  • 拓撲結(jié)構(gòu)圖

Tips:

  • 跨子網(wǎng)時,ping 包會發(fā)給默認網(wǎng)關(guān)谭网,網(wǎng)關(guān)幫忙轉(zhuǎn)發(fā)
  • 改了 ip 需要調(diào)通交換機上的 vlan汪厨,該例子中兩個網(wǎng)關(guān)是同一臺物理交換機

需要做如下配置:

  1. host-a 的 ip 和 gateway 修改成 10.0.2.123 和 10.0.2.251
  2. layer2 switch 要將 host-a 所連端口的 vlan10 改成 vlan12(10.0.2.xxx 網(wǎng)段所屬vlan)
  3. layer3 switch 要允許 vlan12 的幀通過 layer2 switch 所在的端口(port-channel or port)

抓包

host-a ping host-b,捕捉 ARP 協(xié)議
# 清除 arp 緩存內(nèi)容
host-a$ sudo ip -s neigh flush all
host-b$ sudo ip -s neigh flush all

# 因為無法在交換機上抓包蜻底,所以在兩個節(jié)點分別抓包
host-a$ sudo tshark -i eno1 -f 'arp host 10.0.0.125 or arp host 10.0.0.251 or arp host 10.0.2.251 or icmp'
host-b$ sudo tshark -i eno1 -f 'arp host 10.0.0.125 or arp host 10.0.0.251 or arp host 10.0.2.251 or icmp'

host-a$ ping 10.0.0.125 -c1

# host-a Dell_aa:aa:aa 抓包結(jié)果
# 1.arp 請求網(wǎng)關(guān) 10.0.2.251 mac 地址
# 2.網(wǎng)關(guān)回復(fù) arp
# 3.icmp 目的地址是 host-b骄崩。但其數(shù)據(jù)幀目的地其實是網(wǎng)關(guān),網(wǎng)關(guān)再轉(zhuǎn)發(fā)給 host-b
# 4.收到 icmp 回復(fù)
    1 0.000000000 Dell_aa:aa:aa → Broadcast    ARP 42 Who has 10.0.2.251? Tell 10.0.2.123
    2 0.010917102 Dell_cc:cc:cc → Dell_aa:aa:aa ARP 60 10.0.2.251 is at f4:8e:38:cc:cc:cc
    3 5.005604716   10.0.2.123 → 10.0.0.125   ICMP 98 Echo (ping) request  id=0x24a8, seq=1/256, ttl=64
    4 5.006708884   10.0.0.125 → 10.0.2.123   ICMP 98 Echo (ping) reply    id=0x24a8, seq=1/256, ttl=63 (request in 3)

# host-b Dell_bb:bb:bb 抓包結(jié)果
# 1.收到 icmp 請求
# 2.arp 請求網(wǎng)關(guān) 10.0.0.251 mac 地址
# 3.網(wǎng)關(guān)回復(fù) arp
# 4.回復(fù) icmp薄辅,數(shù)據(jù)幀是發(fā)給網(wǎng)關(guān)要拂,網(wǎng)關(guān)負責(zé)轉(zhuǎn)發(fā)
    1 0.000000000   10.0.2.123 → 10.0.0.125   ICMP 98 Echo (ping) request  id=0x24a8, seq=1/256, ttl=63
    2 0.000028673 Dell_bb:bb:bb → Broadcast    ARP 42 Who has 10.0.0.251? Tell 10.0.0.125
    3 0.000937934 Dell_cc:cc:cc → Dell_bb:bb:bb ARP 60 10.0.0.251 is at f4:8e:38:cc:cc:cc
    4 0.000948037   10.0.0.125 → 10.0.2.123   ICMP 98 Echo (ping) reply    id=0x24a8, seq=1/256, ttl=64 (request in 1)

總結(jié)

  • 跨網(wǎng)段通訊,arp 會請求默認網(wǎng)關(guān) mac 地址站楚,由網(wǎng)關(guān)負責(zé)轉(zhuǎn)發(fā)數(shù)據(jù)幀
  • layer2 數(shù)據(jù)幀和 layer3 數(shù)據(jù)包的 destination 可能是不同節(jié)點脱惰,容易混淆
  • layer2:mac layer3:ip layer4:port,區(qū)分各層網(wǎng)絡(luò)的雙端通訊標(biāo)識窿春,能在日常調(diào)試中幫助理解網(wǎng)絡(luò)問題
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拉一,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旧乞,更是在濱河造成了極大的恐慌蔚润,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尺栖,死亡現(xiàn)場離奇詭異嫡纠,居然都是意外死亡,警方通過查閱死者的電腦和手機延赌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門除盏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挫以,你說我怎么就攤上這事者蠕。” “怎么了掐松?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵踱侣,是天一觀的道長。 經(jīng)常有香客問我大磺,道長泻仙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任量没,我火速辦了婚禮玉转,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘殴蹄。我一直安慰自己究抓,他們只是感情好猾担,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刺下,像睡著了一般绑嘹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上橘茉,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天工腋,我揣著相機與錄音,去河邊找鬼畅卓。 笑死擅腰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翁潘。 我是一名探鬼主播趁冈,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拜马!你這毒婦竟也來了渗勘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤俩莽,失蹤者是張志新(化名)和其女友劉穎旺坠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扮超,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡取刃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞒津。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝉衣。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡括尸,死狀恐怖巷蚪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情濒翻,我是刑警寧澤屁柏,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站有送,受9級特大地震影響淌喻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雀摘,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一裸删、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阵赠,春花似錦涯塔、人聲如沸肌稻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爹谭。三九已至,卻和暖如春榛搔,著一層夾襖步出監(jiān)牢的瞬間诺凡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工践惑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腹泌,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓童本,卻偏偏與公主長得像真屯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子穷娱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容