必须在RS上抑制ARP响应,否则RS会应答VIP的ARP请求,导致交换机ARP表错误更新,客户端流量直发RS绕过Director,负载均衡失效;需配置arp_ignore=1、arp_announce=2到lo接口并添加host路由。

为什么必须在RS上抑制ARP响应
DR模式下,VIP(虚拟IP)同时出现在Director和所有Real Server的lo接口上。如果RS对ARP请求正常应答,交换机会把VIP对应的MAC地址更新为某台RS的物理MAC,后续客户端流量就直接发给这台RS,绕过Director——负载均衡失效,还可能引发服务中断。这不是配置没生效,而是网络层行为失控。
arp_ignore=1 和 arp_announce=2 必须配在 lo 接口上
这两个参数控制的是“谁来应答ARP”和“从哪个接口通告”,不是全局开关。只设all或default不够,因为VIP是绑在lo上的,内核判断是否应答时,会按接收ARP请求的接口(通常是eth0)去查对应接口的arp_ignore值。而lo本身不收二层帧,所以必须显式设置lo的参数,让内核知道:“虽然VIP在我身上,但它不在eth0上,我不应答”。
-
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore:只在请求目标IP恰好配置在接收接口上时才响应——VIP在lo,请求从eth0来,不匹配,拒绝应答 -
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce:通告ARP时,只用跟目标IP在同一子网的接口——lo没有子网,自然不参与通告 - 别漏掉
all和default:加这两项是为了兜底,防止未来新增接口或路由变化导致意外应答
配置后必须加一条route add -host VIP dev lo
很多教程只讲ARP抑制,却跳过这条路由。原因在于:RS收到目的为VIP的IP包时,内核要查路由表决定交给哪个接口处理。如果没有这条主机路由,包可能被丢弃(因VIP不是直连网段),或者触发反向路径过滤(rp_filter)被拦下。这条命令强制把VIP视为本地主机地址,交由lo处理。
- 示例:
route add -host 192.168.1.250 dev lo - 必须用
-host,不能用-net;掩码隐含是/32,否则无效 - 开机自启需写进
/etc/rc.local或systemd service,不能只靠ifconfig或ip addr命令临时添加VIP
验证ARP抑制是否真正生效
别只看sysctl输出值,要抓包确认行为。最可靠的方式是在Director或交换机镜像端口上监听ARP:
- 在Director执行:
tcpdump -i eth0 arp and host VIP -nn - 从客户端执行:
arping -c 2 VIP或先ping -c1 VIP再清空本地ARP缓存 - 如果输出里出现来自任何RS的
ARP Reply,说明抑制失败——大概率是lo参数没设,或路由没加,或rp_filter开启干扰 - 在RS上运行:
arp -n | grep VIP,结果应为空;若有条目,说明它已经应答过,交换机ARP表已污染
ARP抑制不是“设了就完事”的静态配置,它依赖lo绑定、路由、内核参数三者协同。少一个环节,VIP就会在二层网络里“说话”,整个DR集群就处于不可控状态。

















