Windows採用何種協議判斷IP地址衝突(arp衝突)呢?

如圖,區域網中,路由器下面的同網段兩台windows終端配置了相同ip地址(或者arp攻擊)時,一般會彈出衝突提示。
而ip衝突歸根結底就是路由器的arp表項衝突。
那麼windows是怎麼知道網段中存在衝突的呢
----------------------------------------------------------------------------
舉個例子:
假設終端1終端2都設192.168.1.2/24 網關192.168.1.1
那麼網關發arp包 who is 192.168.1.2,兩台終端都回包。則導致網關arp表衝突。
那麼終端1和終端2怎麼知道有區域網中衝突呢。


居然還有邀請我答題(=?ω?=)
ipv4防止IP地址衝突是依賴於免費ARP
原理如下:
我的名字叫王大鎚,然後我向著人群里大喊一聲:誰叫王大鎚("▔□▔)/
如果人群里有人回我說:是我是我(°?°)?,那就說明有人和我是重名的。
反之,沒有人回復我,那就證明我這個名字是唯一的。
這個方法是不是很機智( ̄▽ ̄)


先說結論:

①無論是Windows,還是MacOS,或者是其他網路設備(路由/交換/防火牆),判斷IP地址衝突,都是基於免費ARP(Gratuitous ARP)技術來實現的。

② 這項技術不需要電腦和伺服器安裝什麼安全軟體或產品例如防火牆之類的,也不需要交換機和路由器購買什麼license,只要設備具備聯網功能(有網卡)就內置了這項功能,由於免費ARP本質是ARP協議的實現,所以只要有TCP/IP協議棧的網卡,就能支持。相比其他安全防禦技術,免費ARP是一項輕量級的"用戶無感知"的技術。

③下面的文章我使用了真實網路(Windows和Macos)以及虛擬網路(cisco ios)構造IP地址衝突的場景,跟題主的情況一模一樣,然後通過wireshark抓取數據包,反向驗證免費ARP的功能。有興趣的小夥伴可以看下面我的文章,不過內容較多,圖片有28張左右。

參考文章:圖解ARP協議(五)免費ARP:地址衝突了腫么辦?

-------------長文分割線--------------

一、免費ARP概述

網路世界紛繁複雜,除了各種黑客攻擊行為對網路能造成實際破壞之外,還有一類安全問題或泛安全問題,看上去問題不大,但其實仍然可以造成極大的殺傷力。今天跟大家探討的,也是技術原理比較簡單,但實際防範比較頭疼的一個問題:地址衝突

這個區域網中,大家所在IP網段是192.168.1.0/24,PC1的地址是192.168.1.1,而PC2和PC3的地址發生衝突,都是192.168.1.2。那麼,如果PC1需要將數據包發送給192.168.1.2,數據包最終到了PC2還是PC3手裡?還是負載均衡?不管結果如何,這裡的地址衝突肯定會對正常通信造成麻煩。

上面這個電腦/手機之間的地址衝突,大家可能覺得沒什麼太大的問題,那麼接下來再看下面這個圖片=&>

這裡的Server1和Server2處在 [服務集群]中,提供著企業的某種服務,例如Web網站、郵箱系統、FTP文件伺服器等,此時伺服器的地址發生了衝突,都是10.1.1.1。這種地址衝突則會影響大規模的用戶無法訪問這個伺服器,若伺服器承載的是核心業務,對於企業則會造成極大的影響

所以,地址衝突問題可大可小,可能網路運維人員部署上的疏忽,也可能是普通電腦小白無意導致的,更有可能是主動的黑客行為,例如攻擊者製造地址衝突場景,擾亂正常業務,導致業務服務中斷。

因此,如何在IP地址衝突的時候及時檢測,並且做出解決方案呢?

二、免費ARP原理

Gratuitous ARP,被翻譯為『免費ARP』也被稱為『無故ARP』,用於檢測區域網內的IP地址衝突,在一定程度上能夠給用戶和網路運維人員提供幫助。相比『免費』這個翻譯,『無故』這個詞其實會更加好理解:"在沒有人問自己的情況下,無緣無故自問自答"。

這項技術不需要電腦和伺服器安裝什麼安全軟體或產品例如防火牆之類的,也不需要交換機和路由器購買什麼license,只要設備具備聯網功能(有網卡)就內置了這項功能,由於免費ARP本質是ARP協議的實現,所以只要有TCP/IP協議棧的網卡,就能支持。相比其他安全防禦技術,免費ARP是一項輕量級的"用戶無感知"的技術。

接下來,我們來回顧下之前的圖片=&>

當用戶發送數據包給192.168.1.2的時候,交換機會將數據包轉發給誰呢?

①根據我們之前學過的ARP原理,交換機會拆開這個數據包,並且根據目的MAC進行轉發

②那麼PC1在數據封裝的時候,目的MAC是封裝PC2還是PC3的MAC

目標MAC則取決於電腦本地的ARP緩存表,所以PC1最終把數據包給PC2還是PC3,則取決於收到的ARP回應,並且根據"後到優先"原則作出選擇。

所以,若PC2提前回應ARP,則PC1一直發給PC3;若PC3提前回應ARP,則PC1一直發送給PC2。還有一種情況,PC2和PC3交替回應ARP,PC1有可能將部分數據給PC2,部分數據給PC3(而PC1則處於懵逼狀態,因為關於192.168.1.2的MAC映射一直在變動)。這個更多是理論推導,實際情況不同設備測試出來的效果有些差異,後面章節我會帶大家做真實和虛擬網路的實驗

我們來看看免費ARP是如何工作的並介入這場衝突的?

當電腦檢測到自己的IP地址跟其他電腦衝突時,它們會相互發送免費ARP("互懟"),用來提醒對方:你的IP地址跟我的衝突啦! 這裡要注意一點:免費ARP是以ARP Request或Reply廣播形式發送,將IP和MAC地址信息綁定,並宣告到整個區域網。如果在宣告的過程中,其他電腦監聽到,並且地址跟自己一樣,也會直接參与這個"互懟"過程。

上面PC2和PC3一直不停地對外發送免費ARP:我的地址是192.168.1.2,MAC是xxx。與此同時,同一區域網的其他主機,則根據這兩個免費ARP信息不斷的修改本地ARP表,192.168.1.2一會映射到MAC2,一會映射到MAC3。

那麼,這個混亂的爭搶過程,會不會停下來呢?

可能會持續一段時間,也可能一直持續下去(後面有實驗驗證)。衝突方之間可能會一直發送,直到有一邊做出讓步並修改IP地址。(不同系統解決方法不同)

很多人在這裡開始有疑惑,即便免費ARP幫我們檢測到了地址衝突,但是也是在協議底層在"互懟",我們作為"主人",如何收到地址衝突提示,並且做出修改和讓步呢?因為無論是普通用戶還是專業工程師,也不可能天天掛在wireshark這種抓包軟體,時時刻刻盯著免費ARP包,判斷是否有人跟我們地址衝突了。所以,這又涉及到電腦(操作系統)如何根據免費ARP的地址衝突檢測,更好的提示或幫助用戶了。

目前行業的解決方案是這樣的:如果是圖形化操作系統,例如Windows或者MacOS,是通過系統彈框的方式提示用戶;而如果是命令行操作系統(交換機/路由器/防火牆),則通過日誌報錯信息提示用戶。

也就是說,無論普通電腦還是專業的防火牆設備,通過免費ARP檢測到地址衝突之後,設備都會彈出來跟他說:喂,主人,你地址跟人家衝突了,該改改了!

這是Windows和MacOS的地址衝突彈框告警,引導用戶修改本機IP地址=&>

這是思科路由器IOS(網際操作系統)的地址衝突日誌信息,引導網路運維人員修改IP地址=&>

%IP-4-DUPADDR: Duplicate address 192.168.1.2 on FastEthernet0/0, sourced by cc02.394f.0000

所以,當地址發生衝突時,根據免費ARP引起的彈框和日誌告警,用戶或者管理員便可以對IP地址進行修改,從而解決通信問題。例如,下面的PC2和PC3,只要一方修改了地址即可 =&>

三、免費ARP實戰指南

免費ARP出現的場景非常多,例如地址衝突時、地址修改或變更時、DHCP分發地址時、網關冗餘協議交互時(例如HSRP)、TFTP傳輸數據時……

不同的場景,抓到的免費ARP數據包,底層結構都會有所差異,可能是基於ARP請求廣播發送的,也可能是基於ARP回應廣播發送的(沒看錯!ARP回應這裡是廣播方式)

為了讓大家"親眼所見",同時可跟著我一起實踐,更好吸收這塊的知識,這裡我設計了真實和虛擬網路來進行實戰,並抓取免費ARP數據包,通過數據包解構原理。

(一)真實網路下 免費ARP實戰

① 跟上一篇文章中代理ARP的真實網路一樣,我的網路拓撲是這樣的:

為了讓這個實驗更有通用性,我加入了一台Windows電腦。此時登錄無線路由器(極路由)查看區域網主機列表:

還是原來的配方.... 蘋果全家桶和一台Windows電腦。實物圖大概是這樣的:

② 接下來,為了看到地址衝突時,免費ARP的數據包交互,我們在Windows和MacOS同時開啟Wireshark並抓包本機電腦的數據包,設置arp過濾。

macbook端截圖如下:

Windows端截圖如下:(Windows 10跟無線路由器一直在交互)

③在Mac端,將IP地址設置為跟Windows地址一樣從192.168.199.177改為192.168.199.152

點擊應用之後,開始觀察兩邊電腦彈框和wireshark的ARP包交互過程=&>

上圖可以看到macbook的彈框告警了,接下來我們來分析下此時Mac和windows抓到的數據交互過程=&>

我的windows電腦很明確的回應Mac電腦:這個地址199.152,已經被我用了。這個過程重複了3次。根據抓包,這個過程後面還在不斷的持續中,不管在win還是mac,都能抓到類似的問答過程

由於macbook電腦此刻不能上網,所以還"不屈不撓"的詢問著,它在想:沒準windows下線了,沒有回應了呢?(如果win沒有回應,則說明它下線了或改為其他地址了,那麼mac就可以使用)

④ 接下來,我們將windows的網路斷開,然後在macbook這端觀察arp交互和網路連接狀態:

此時,macbook跟往常一樣發生三個arp請求,詢問152這個地址是否有人使用,由於windows已經下線,所以三次都沒有應答。緊接著有三個gratuitous arp數據包,跟上面三個請求包幾乎是一樣的,只有一個區別,就是發送者的IP地址此時從0.0.0.0修改為192.168.199.152。這意味著mac確認了152沒有其他人使用,並且認為此刻自己有資格用上152這個地址了

從wireshark抓包來看,之前的arp請求好像沒有標記"gratuitous"這個關鍵詞,那麼算不是是免費arp或者無故arp呢?這個其實也是比較多討論和爭議。如果從"自己問自己的角度"出發,這兩種arp都算是免費arp,因為都是在問自己配置的這個新地址192.168.199.152,而且目的都是一致的,都是為了檢測是否地址可用是否存在衝突

當然,更嚴謹的的免費arp包,則是需要"發送方ip"和"接收者ip"是一致的,就是下面這種arp請求包,都有192.168.199.152這個地址。所以,這一小知識點的話,我個人覺得不用太糾結,通過數據包結構還原整個免費arp工作原理才是最重要的。

從wireshark截圖可以看到,經過了上面這些免費ARP的請求之後,由於一直沒有其他設備回應152這個地址,所以macbook電腦再次詢問網關192.168.199.1的物理地址,拿到網關的ARP回應之後,我的macbook便可以正常通信了。

⑤【接下來是拓展內容,涉及dhcp協議,新手的話可暫時忽略這一小段...】

這個實驗還可以繼續深挖下來,此時讓windows電腦重新接入這個wifi網路,之後同樣會出現免費arp的交互過程,只不過多了一個dhcp協議交互,並且最終windows使用了192.168.199.153這個地址接入wifi網路。先整理下流程再截核心數據包=&>

  1. 當windows重新接入網路之後,會通過dhcp重新獲取192.168.199.152這個地址(由於macbook的152這個地址是由我手工靜態指定的而不是路由器分配,所有路由器仍然通過dhcp地址池分配);
  2. windows收到這個地址之後,第一時間便發送免費arp包進行地址檢測,但是發現這個地址已經被macbook佔用了!因此,通過dhcp decline數據包向無線路由器取消這個地址;
  3. windows重新獲取192.168.199.153這個地址,通過免費arp重新檢測,發現沒有人回應了,說明這個地址可用,後續用這個地址接入wifi網路。

windows重新接入網路的dhcp交互包=&>

windows獲取地址後通過免費arp檢測到macbook=&>

windows通過dhcp decline放棄152,並重新獲取153這個地址=&>

windows通過免費arp檢測,發現153地址沒其他人用,所以接入了網路=&>

總結:通過這個真實網路,我們構造了windows和macbook地址衝突的環境,通過wireshark抓取免費arp數據包,學習了免費arp的地址檢測功能以及數據包結構。

①當電腦(手工)修改的地址跟區域網其他主機地址一樣的時候,通過免費arp協議,電腦會彈框提醒並無法上網;

②當相同地址的電腦其中一台下線時,通過免費arp可以證明此地址可使用(沒人爭搶/回應),此時便可接入網路;

③當電腦通過DHCP獲取地址時,會通過免費arp檢測這個地址是否可用,若已經被使用,則重新通過dhcp獲取新的地址,再接入互聯網。

④這裡抓取的免費ARP包是請求廣播包,並且特徵是"自己問自己"。("自己答自己"的回應廣播包,在下面的實驗有)

(二)虛擬網路下 免費ARP實戰

網路拓撲採用GNS3搭建,採用C3640操作系統鏡像=&>

①為每個路由器配置IP地址,所在網段為192.168.1.0/24=&>

R1(config)#int f0/0

R1(config-if)#no sh

R1(config-if)#ip add 192.168.1.1 255.255.255.0

R2(config)#int f0/0

R2(config-if)#no sh

R2(config-if)#ip add 192.168.1.2 255.255.255.0

R3(config)#int f0/0

R3(config-if)#no sh

R3(config-if)#ip add 192.168.1.3 255.255.255.0

②在路由器相連鏈路上抓包,路由器相互PING通,並查看ARP表=&>

(這裡用R1舉例,其他類似)

R1#ping 192.168.1.2

Type escape sequence to abort.

Sending 5, 100-byte ICMP Echos to 192.168.1.2, timeout is 2 seconds:

!!!!!

Success rate is 100 percent (5/5), round-trip min/avg/max = 64/64/64 ms

R1#ping 192.168.1.3

Type escape sequence to abort.

Sending 5, 100-byte ICMP Echos to 192.168.1.3, timeout is 2 seconds:

!!!!!

Success rate is 100 percent (5/5), round-trip min/avg/max = 64/64/68 ms

R1#show arp

Protocol Address Age (min) Hardware Addr Type Interface

Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0

Internet 192.168.1.3 0 cc02.394f.0000 ARPA FastEthernet0/0

Internet 192.168.1.2 0 cc01.394f.0000 ARPA FastEthernet0/0

③讓R3和R2的地址衝突,例如將R3的地址從192.168.1.3配置為192.168.1.2,在R2和R3上面開啟arp調試"debug arp",在R1上面查看ARP表,通過wireshark觀察底層免費ARP包交互過程=&>

R3(config)#int f0/0

R3(config-if)#ip add 192.168.1.2 255.255.255.0

一旦R3設置了上面的地址,跟R2衝突之後,此時R2和R3的命令行界面開始不停斷"刷屏"=&>

核心日誌信息:

R2#

*Mar 1 00:13:25.519: %IP-4-DUPADDR: Duplicate address 192.168.1.2 on FastEthernet0/0, sourced by cc02.394f.0000

R2#

*Mar 1 00:13:56.259: %IP-4-DUPADDR: Duplicate address 192.168.1.2 on FastEthernet0/0, sourced by cc02.394f.0000

R2#

*Mar 1 00:14:27.167: %IP-4-DUPADDR: Duplicate address 192.168.1.2 on FastEthernet0/0, sourced by cc02.394f.0000

雖然網路設備沒法像Windows或者Macos彈框告警,但是通過日誌提示同樣可以達到同樣的目的,讓網路運維人員作出修改。

Cisco IOS通過免費ARP檢測到地址衝突之後,解決的方法相對"暴力",例如,R2和R3直接會持續發送免費ARP(reply廣播包),直到地址衝突問題被解決掉。可以通過wireshark數據包觀察=&>

此時再觀察R1上面的ARP表,關於192.168.1.2這個地址的映射信息:

R1#show arp

Protocol Address Age (min) Hardware Addr Type Interface

Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0

Internet 192.168.1.3 6 cc02.394f.0000 ARPA FastEthernet0/0

Internet 192.168.1.2 0 cc02.394f.0000 ARPA FastEthernet0/0

R1#show arp

Protocol Address Age (min) Hardware Addr Type Interface

Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0

Internet 192.168.1.3 6 cc02.394f.0000 ARPA FastEthernet0/0

Internet 192.168.1.2 0 cc01.394f.0000 ARPA FastEthernet0/0

R1#show arp

Protocol Address Age (min) Hardware Addr Type Interface

Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0

Internet 192.168.1.3 6 cc02.394f.0000 ARPA FastEthernet0/0

Internet 192.168.1.2 0 cc02.394f.0000 ARPA FastEthernet0/0

R1#show arp

Protocol Address Age (min) Hardware Addr Type Interface

Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0

Internet 192.168.1.3 6 cc02.394f.0000 ARPA FastEthernet0/0

Internet 192.168.1.2 0 cc01.394f.0000 ARPA FastEthernet0/0

……

可以看到,由於免費ARP是一種廣播的形式,所以R1同處一個區域網可以收到,並且ARP信息被不斷修改,一會將192.168.1.2指向R2的MAC地址,一會指向R3的MAC地址

這個過程會一種持續下去,直到地址做了修改,這裡我們將R3的IP地址重新修改為192.168.1.3,之後網路便恢復了平靜。

總結:通過這個虛擬網路,我們構造了路由器地址衝突的環境,同樣驗證了免費ARP能夠檢測IP地址衝突的功能,當然,這裡跟Windows和Macos的處理方式有一些差別,例如Cisco路由器檢測到免費ARP之後,會保持非常高頻率的"互懟"過程,然後不斷報出錯日誌,督促管理員感覺修改地址。除此之外,數據包結構也有差異,Windows和Macos是"自己問自己"的arp request包,而cisco ios是"自己答自己"的arp reply包

四、總結:地址衝突了怎麼辦?

①對於普通用戶而言,當看到電腦彈框告警說明地址有衝突時,在不懂技術的情況下,可以嘗試重啟家裡的路由器,這樣可以重新為區域網的電腦分配地址;

②路由器不是自己的,接入的是租房網路、校園網路等第三方網路,當看到電腦彈框告警說明地址有衝突時並且無法管理路由器的時候,可以嘗試手工修改本機電腦的IP地址,無論是Windows還是Macos,直接進入網卡設置修改即可,怎麼做手工修改呢?例如電腦地址是192.168.1.1,提示衝突的話,那麼可以在原有數字的基礎上遞增1或者10,直到顯示不衝突,例如修改為192.168.1.2、192.168.1.3或者192.168.1.11、192.168.1.21,以此類推..... (這種方法未必能保證解決,但是在管理員介入之前,至少算是一種解決方案);

③對於專業的網路和安全運維人員而言,當看到網路地址衝突,則需要考慮自己的DHCP部署、IP地址規劃有沒有問題,或者找出網路中是否有"搗蛋鬼"自己私設IP之類的;

④通過本章節的學習,我們掌握了免費ARP不同網路環境下的實現,例如"自己問自己"和"自己答自己"兩種廣播包方式,也了解了電腦和網路設備的不同機制。

【相關推薦】

圖解ARP協議(三)ARP防禦篇-如何揪出"內鬼"並"優雅的還手"?

知乎專欄:跟傑哥學網路與安全

微信公眾號:拼客院長陳鑫傑(搜索"pingsec",即刻關注)

新浪微博:@拼客學院陳鑫傑


Gratuitous ARP 免費arp

懶得手打,下面是介紹

https://m.baidu.com/sf?word=%E5%85%8D%E8%B4%B9arpmod=0tn=normalpd=mms_mipactname=act_sf_miptitle=360doc%E4%B8%AA%E4%BA%BA%E5%9B%BE%E4%B9%A6%E9%A6%86top=%7B%22sfhs%22%3A4%7Dext=%7B%22url%22%3A%22%252F%252Fmipcache.bdstatic.com%252Fc%252Fwww.360doc.cn%252Fmip%252F369177690.html%22%2C%22lid%22%3A%2212356081852206252133%22%7Dlid=12356081852206252133ms=1frsrcid=1599frorder=1

免費ARP包是標準ARP請求包的特例,目的MAC地址仍是二層廣播地址FFFF-FFFF-FFFF,源MAC地址是發送ARP請求主機的MAC地址,然而,源IP和目的IP都是發送主機的IP。這就是免費ARP包和標準ARP請求包的區別。

免費ARP包一般產生於系統引導時,網路模塊用於確定當前使用的IP地址,同段內是否還有其他人在使用。當主機發送一個免費ARP包後,未收到應答,說明IP無衝突,反之則報錯。


免費ARP報文是一種特殊的ARP報文,該報文中攜帶的發送者IP地址和目標IP地址都是本機IP地址,發送者MAC地址是本機MAC地址,目標MAC地址是廣播地址。
這個就是用來發現有沒有衝突的,當然只是功能之一。


地址解析協議,我再補充幾點,可能和其他答案略有重複。_(′?`」 ∠)_
舉個栗子:
喜羊羊在羊村裡找美羊羊,但是喜羊羊並不知道美羊羊在那裡。只有美羊羊知道自己的位置。於是喜羊羊通過羊村的大喇叭廣播尋找美羊羊。廣播里提供了自己的身份,自己的位置,以及美羊羊的身份。同時,這個廣播里有些信息只有美羊羊聽了才知道是在叫自己(匹配IP目的地址)。然後美羊羊會掏出羊牌手機給喜羊羊發消息,達到兩者結合。
如果有多個美羊羊回復喜羊羊,則會變成ARP衝突。

ARP協議大概過程為:
兩個設備在同一區域網內A設備尋找B設備的MAC地址來進行聯繫

  1. 自己的IP作為源地址
  2. B設備的IP作為目的MAC地址
  3. 自己的MAC地址作為源MAC地址
  4. 廣播地址作為目的地址
  5. 封裝一個二層數據包

區域網廣播後,所有在區域網內的設備都能收到廣播數據包,但只有B設備在解壓時才會發現目的IP是自己的IP。
B設備向A發送自己的MAC地址

  1. 自己的IP作為源地址
  2. B設備的IP作為目的地址
  3. 自己的MAC地址作為源MAC地址
  4. A設備的MAC地址作為目的MAC地址

為了防止ARP衝突,一般會將IP和Mac地址綁定
或者在ARP攻擊的時候將欺騙數據包直接丟掉∠( ? 」∠)_


因為ARP也是通過廣播形式進行發包,所以Pc1pc2都會相互知道


載波監聽多路訪問


推薦閱讀:

Windows Phone 7 開發的第三方平台除了 OpenxLive,大家還知道哪些?
Windows 系統下,硬碟要不要分區,為什麼?
怎樣命名工作文件可以高效便利?
如何優雅地布置PC桌面?
Vmware虛擬機內存要怎麼分配?

TAG:MicrosoftWindows | 網路攻擊 | 計算機網路 | IP地址 | 網路工程師 |