什么是 ARP Flux?
ARP Flux 是一种网络现象,通常发生在具有多个网络接口(多宿主)的主机上,当主机对同一个 IP 地址的 ARP 请求做出多个不同 MAC 地址的响应时出现。这种情况可能导致网络通信异常,如数据包被错误地路由或丢弃。
ARP Flux 的原因:
-
多宿主主机(Multihomed Host)
如果一台主机有多个网络接口(如多个网卡或 VLAN 接口),并且这些接口位于同一子网,操作系统可能会通过多个接口响应 ARP 请求。
例如,主机有两个网卡(
eth0和eth1),IP 地址分别是192.168.1.10和192.168.1.11,但 ARP 请求查询192.168.1.10时,主机可能同时用eth0和eth1的 MAC 地址响应。 -
代理 ARP(Proxy ARP)
某些路由器或防火墙可能启用代理 ARP,导致它们代替其他设备响应 ARP 请求,从而产生多个 ARP 响应。
-
IP 地址冲突
如果同一子网内有两个设备使用相同的 IP 地址,它们都会响应 ARP 请求,导致 ARP Flux。
ARP Flux 的影响:
-
网络不稳定
交换机或路由器可能会收到多个 MAC 地址对应同一个 IP,导致数据包被错误地转发。
-
通信中断
某些设备可能缓存错误的 MAC 地址,导致数据包无法到达目标。
-
ARP 表抖动
网络设备的 ARP 表可能频繁变化,影响性能。
ARP Flux 案例分析
A 主机的 IP 配置如下(即存在 ARP Flux 的主机):
[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 主机上验证是否存在 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)
从测试结果来看,A 主机存在 ARP Flux 问题,因为:
10.1.88.94和10.1.88.95都返回了相同的 MAC 地址B0:4F:A6:7A:23:98(属于enp125s0f2)。- 但
10.1.88.94本应属于enp125s0f0(MACB0:4F:A6:7A:23:96)。 10.1.88.95本应属于enp125s0f1(MACB0:4F:A6:7A:23:97)。
- 但
- 这表明 ARP 响应被错误地代理或劫持。
服务器抓包:
# A主机抓包
tcpdump -i any -nn "arp" -w arp_capture.pcap
# B主机发送探测包
arping -f 10.1.88.94
arping -f 10.1.88.95
包分析:
可见都是返回 b0:4f:a6:7a:23:98 MAC 地址,该地址属于 enp125s0f2,发生了 ARP Flux。


ARP Flux 对业务影响?
原本客户端只想收到来自目标主机 10.1.88.94 对应网卡 enp125s0f0 的 MAC 地址 b0:4f:a6:7a:23:96(ARP 响应),而现在确收到的是 enp125s0f2 的 MAC 地址 b0:4f:a6:7a:23:98(ARP 响应)。
于是:
- 客户端就认为:
10.1.88.94对应的 MAC 是enp125s0f2的 MAC; - 接下来所有对
10.1.88.94的流量都会发给enp125s0f2; - 然而服务可能只绑定在
enp125s0f0上,或者路由表不匹配; - 导致请求进来了但服务不处理、或响应从错误网卡出去,最终连接失败或被丢弃。
如何避免 ARP Flux?
调整主机 ARP 行为
# 全局ARP规范
echo 'net.ipv4.conf.all.arp_ignore = 1' >> /etc/sysctl.conf # 禁止非本机接口IP的ARP响应
echo 'net.ipv4.conf.all.arp_announce = 2' >> /etc/sysctl.conf # 始终使用最佳本地IP响应ARP
# 单接口子网隔离,让每个接口只对自己拥有的 IP 发 ARP 回复,防止“越界抢答”(可选)
# 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
在路由器或防火墙上关闭不必要的代理 ARP 功能。
检查 IP 冲突
确保网络中不存在重复的 IP 地址。
网络分段
如果可能,将多宿主主机放在不同的子网中,避免 ARP 混乱。
3770

被折叠的 条评论
为什么被折叠?



