多網(wǎng)卡同網(wǎng)段IP引發(fā)的ARP Flux問題
什么是 ARP Flux?
ARP Flux 是一種網(wǎng)絡(luò)現(xiàn)象,通常發(fā)生在具有多個網(wǎng)絡(luò)接口(多宿主)的主機(jī)上,當(dāng)主機(jī)對同一個 IP 地址的 ARP 請求做出多個不同 MAC 地址的響應(yīng)時出現(xiàn)。
這種情況可能導(dǎo)致網(wǎng)絡(luò)通信異常,如數(shù)據(jù)包被錯誤地路由或丟棄。
ARP Flux 的原因:
1.多宿主主機(jī)(Multihomed Host)
- 如果一臺主機(jī)有多個網(wǎng)絡(luò)接口(如多個網(wǎng)卡或 VLAN 接口),并且這些接口位于同一子網(wǎng),操作系統(tǒng)可能會通過多個接口響應(yīng) ARP 請求。
- 例如,主機(jī)有兩個網(wǎng)卡(
eth0和eth1),IP 地址分別是192.168.1.10和192.168.1.11,但 ARP 請求查詢192.168.1.10時,主機(jī)可能同時用eth0和eth1的 MAC 地址響應(yīng)。
2.代理 ARP(Proxy ARP)
- 某些路由器或防火墻可能啟用代理 ARP
- 導(dǎo)致它們代替其他設(shè)備響應(yīng) ARP 請求,從而產(chǎn)生多個 ARP 響應(yīng)。
3.IP 地址沖突
- 如果同一子網(wǎng)內(nèi)有兩個設(shè)備使用相同的 IP 地址
- 它們都會響應(yīng) ARP 請求,導(dǎo)致 ARP Flux。
ARP Flux 的影響:
1.網(wǎng)絡(luò)不穩(wěn)定
- 交換機(jī)或路由器可能會收到多個 MAC 地址對應(yīng)同一個 IP,導(dǎo)致數(shù)據(jù)包被錯誤地轉(zhuǎn)發(fā)。
2.通信中斷
- 某些設(shè)備可能緩存錯誤的 MAC 地址,導(dǎo)致數(shù)據(jù)包無法到達(dá)目標(biāo)。
3.ARP 表抖動
- 網(wǎng)絡(luò)設(shè)備的 ARP 表可能頻繁變化,影響性能。
ARP Flux 案例分析
A 主機(jī)的 IP 配置如下(即存在 ARP Flux 的主機(jī)):
[root@ism ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp125s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether b0:4f:a6:7a:23:96 brd ff:ff:ff:ff:ff:ff
inet 10.1.88.94/24 brd 10.1.88.255 scope global noprefixroute enp125s0f0
valid_lft forever preferred_lft forever
inet6 fe80::b4a:6afe:afb9:3cf8/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: enp125s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether b0:4f:a6:7a:23:97 brd ff:ff:ff:ff:ff:ff
inet 10.1.89.3/24 brd 10.1.89.255 scope global dynamic noprefixroute enp125s0f1
valid_lft 29975sec preferred_lft 29975sec
inet 10.1.88.95/24 brd 10.1.88.255 scope global noprefixroute enp125s0f1
valid_lft forever preferred_lft forever
inet6 fe80::6115:6f6d:e709:dbaf/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: enp125s0f2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether b0:4f:a6:7a:23:98 brd ff:ff:ff:ff:ff:ff
inet 172.16.11.5/24 brd 172.16.11.255 scope global dynamic noprefixroute enp125s0f2
valid_lft 31573sec preferred_lft 31573sec
inet 172.16.11.94/24 brd 172.16.11.255 scope global secondary noprefixroute enp125s0f2
valid_lft forever preferred_lft forever
inet6 fe80::1c1:9d2a:5550:a9b3/64 scope link noprefixroute
valid_lft forever preferred_lft forever
在 B 主機(jī)上驗證是否存在 ARP Flux:
[root@arsen ~]# arping -f -I enp125s0f0 10.1.88.94 ARPING 10.1.88.94 from 172.16.11.97 enp125s0f0 Unicast reply from 10.1.88.94 [B0:4F:A6:7A:23:98] 0.604ms Sent 1 probes (1 broadcast(s)) Received 1 response(s) [root@arsen ~]# [root@arsen ~]# arping -f -I enp125s0f0 10.1.88.95 ARPING 10.1.88.95 from 172.16.11.97 enp125s0f0 Unicast reply from 10.1.88.95 [B0:4F:A6:7A:23:98] 0.571ms Sent 1 probes (1 broadcast(s)) Received 1 response(s) [root@arsen ~]# [root@arsen ~]# arping -f -I enp125s0f0 172.16.11.94 ARPING 172.16.11.94 from 172.16.11.97 enp125s0f0 Unicast reply from 172.16.11.94 [B0:4F:A6:7A:23:98] 0.596ms Sent 1 probes (1 broadcast(s)) Received 1 response(s)
從測試結(jié)果來看,A 主機(jī)存在 ARP Flux 問題,因為:
10.1.88.94 和 10.1.88.95 都返回了相同的 MAC 地址 B0:4F:A6:7A:23:98(屬于 enp125s0f2)。
- 但
10.1.88.94本應(yīng)屬于enp125s0f0(MACB0:4F:A6:7A:23:96)。 10.1.88.95本應(yīng)屬于enp125s0f1(MACB0:4F:A6:7A:23:97)。
這表明 ARP 響應(yīng)被錯誤地代理或劫持。
服務(wù)器抓包:
# A主機(jī)抓包 tcpdump -i any -nn "arp" -w arp_capture.pcap # B主機(jī)發(fā)送探測包 arping -f 10.1.88.94 arping -f 10.1.88.95
包分析:
可見都是返回 b0:4f:a6:7a:23:98 MAC 地址,該地址屬于 enp125s0f2,發(fā)生了 ARP Flux。


ARP Flux 對業(yè)務(wù)影響?
原本客戶端只想收到來自目標(biāo)主機(jī) 10.1.88.94 對應(yīng)網(wǎng)卡 enp125s0f0 的 MAC 地址 b0:4f:a6:7a:23:96(ARP 響應(yīng)),而現(xiàn)在確收到的是 enp125s0f2 的 MAC 地址 b0:4f:a6:7a:23:98(ARP 響應(yīng))。
于是:
- 客戶端就認(rèn)為:
10.1.88.94對應(yīng)的 MAC 是enp125s0f2的 MAC; - 接下來所有對
10.1.88.94的流量都會發(fā)給enp125s0f2; - 然而服務(wù)可能只綁定在
enp125s0f0上,或者路由表不匹配; - 導(dǎo)致請求進(jìn)來了但服務(wù)不處理、或響應(yīng)從錯誤網(wǎng)卡出去,最終連接失敗或被丟棄。
如何避免 ARP Flux?
調(diào)整主機(jī) ARP 行為
# 全局ARP規(guī)范 echo 'net.ipv4.conf.all.arp_ignore = 1' >> /etc/sysctl.conf # 禁止非本機(jī)接口IP的ARP響應(yīng) echo 'net.ipv4.conf.all.arp_announce = 2' >> /etc/sysctl.conf # 始終使用最佳本地IP響應(yīng)ARP # 單接口子網(wǎng)隔離,讓每個接口只對自己擁有的 IP 發(fā) ARP 回復(fù),防止“越界搶答”(可選) # echo 'net.ipv4.conf.enp125s0f0.arp_filter = 1' >> /etc/sysctl.conf # echo 'net.ipv4.conf.enp125s0f1.arp_filter = 1' >> /etc/sysctl.conf # 使配置生效(實時) sysctl -p
禁用不必要的代理 ARP
在路由器或防火墻上關(guān)閉不必要的代理 ARP 功能。
檢查 IP 沖突
確保網(wǎng)絡(luò)中不存在重復(fù)的 IP 地址。
網(wǎng)絡(luò)分段
如果可能,將多宿主主機(jī)放在不同的子網(wǎng)中,避免 ARP 混亂。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
linux系統(tǒng)下MongoDB單節(jié)點安裝教程
這篇文章主要給大家介紹了在linux系統(tǒng)下mongo在單節(jié)點安裝的方法教程,文中將實現(xiàn)的方法一步步介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧。2017-10-10
centOS7 下利用iptables配置IP地址白名單的方法
下面小編就為大家?guī)硪黄猚entOS7 下利用iptables配置IP地址白名單的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11
Ubuntu18.04系統(tǒng)安裝、配置Redis及phpredis擴(kuò)展操作詳解
這篇文章主要介紹了Ubuntu18.04系統(tǒng)安裝、配置Redis及phpredis擴(kuò)展操作,結(jié)合實例形式分析了Ubuntu18.04系統(tǒng)安裝、配置Redis及phpredis擴(kuò)展的相關(guān)原理、步驟、配置命令與操作注意事項,需要的朋友可以參考下2020-03-03
Centos7 iptables開放端口實現(xiàn)方式
排查MySQL遠(yuǎn)程連接失敗:先確認(rèn)安全組端口開放,再檢查FirewallD是否運(yùn)行,若未啟用則查看iptables規(guī)則,發(fā)現(xiàn)3306被DROP后修改為ACCEPT,測試連接成功,總結(jié)經(jīng)驗供參考2025-08-08
VMWare中CentOS ifcfg-eth0配置方法(親測直接可用)
本篇文章主要介紹了VMWare中CentOS ifcfg-eth0配置,這些配置是基于VMware Network Adapter VMnet8,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03
Linux使用tracepath進(jìn)行網(wǎng)絡(luò)診斷分析
tracepath?命令是?Linux?中的一個網(wǎng)絡(luò)診斷工具,類似于?traceroute,下面小編來為大家介紹一下如何使用tracepath進(jìn)行網(wǎng)絡(luò)診斷分析吧2025-02-02
Apache 內(nèi)容動態(tài)緩沖模塊 mod_cache應(yīng)用
mod_cache是apache中基于URI鍵的內(nèi)容動態(tài)緩沖(內(nèi)存或磁盤),從Apache2.2起,mod_cache和mod_file_cache將不再是試驗?zāi)K,它們已經(jīng)足夠穩(wěn)定,可以用于實際生產(chǎn)中了。2013-10-10
CentOS和Ubuntu系統(tǒng)使用shell腳本創(chuàng)建用戶和設(shè)置密碼
在Linux系統(tǒng)中,你可以使用useradd命令來創(chuàng)建新用戶,使用echo和chpasswd命令來設(shè)置密碼,本文寫了一個shell腳本,可以在?CentOS?和?Ubuntu?系統(tǒng)上直接創(chuàng)建用戶,運(yùn)行時會提示輸入賬號和密碼2025-05-05

