HI END


一种永不妥协,追求极致与完美的精神与态度。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

有关arp_ignore 与arp_announce 参数的设置(转)

Posted on 2012-08-20 16:10  HI END  阅读(1261)  评论(0编辑  收藏  举报

来源:http://www.linuxfly.org/post/539

早上看到一篇关于arp_ignore 设置值不同引起的故障问题:由于arp_ignore 为默认值0(即对ARP请求时,只要该IP在本地的机器任意网卡设备上存在都会响应)。当某机器同时通过一条以上路径到达相同的目标时,该默认值可能会引起故障。

一、现象描述
该故障的处理,由zzniu#redflag-linux.com提供。
网络架构:

问题描述:
管理服务器为一HP刀片服务器,双网卡,一个外网,一个内网。外网IP在某些时候ping不通网关外的服务器,但网关外的服务器可以ping通此服务器的外网IP。

问题分析:
经过抓包分析,发现在交换机更新arp时,外网首先回应,交换机更新到了服务器外网的arp信息,过一会服务器的内网arp信息又再次到达,把之前正确arp信息替换掉了,造成arp信息错误,导致网络故障,一般重新拔线或重启网络服务,故障即可排除,但过一段时间就会再次出现故障。

解决方法:
通过对比不同版本红旗系统以及proc文件系统下的arp相关设置,找到系统默认设置中的arp_ignore参数为关闭的,造成了系统会在本机不打开proxy_arp的情况下也做arp代理。打开此参数(echo 1 > /proc/sys/net/ipv4/conf/ethX/arp_ignore,X为网卡index),避免arp代理即可解决此问题。

问题原理:
因为防火墙为透明VPN,所以可以忽略VPN的影响,简化后的网络结构如下图:



HP刀片上的管理服务器接入两个子网时SW-1和SW-2都会对其进行arp询问,因为管理服务器没都打开arp_ignore选项,所以两块网卡都会对两个交换机做arp应答,因为SW-1是二层交换机,而SW-2是三层交换机,经由eth0(172.16.*.*)的arp包会比eth1(10.5.*.*)的先到达SW-1,考虑SW-1上的arp表项,先到达的正确的arp包,会被后到达的封装了eth1的macaddr的错误arp包冲刷掉。由于SW具有自动学习功能,之后外网试图访问eth0的这条线路时,SW-1会根据arp表项直接将数据包发送到(SW-2, eth1)的线路上,而SW-2识别到这个包的IP不是本网段的,会将包丢掉,故外网机器无法访问到该管理机。而该机再次ping其他主机时会导致arp更新,使得外网主机又能暂时访问到该主机。

二、补充
1、我的观点
在查看上述问题分析报告时,我第一个反应是,该架构存在网络中常见的冗余链路问题。在由交换机构成的交换网络中通常设计有冗余链路和设备。这种设计的目的是防止一个点的失败导致整个网络功能的丢失。虽然冗余设计可能消除的单点失败问题,但也导致了交换回路的产生,它会带来如下问题:

引用
A.广播风暴
B.同一帧的多份拷贝
C.不稳定的MAC地址表


因此,在交换网络中必须有一个机制来阻止回路,而生成树协议(Spanning Tree Protocol)的作用正是在于此。故此,我怀疑在该案例中,是否已打开交换机中的生成树协议支持,打开后能否解决,存疑?

2、类似问题
在LVS环境中,常会遇到与arp_ignore、arp_announce参数相关的问题,例如:

引用
Disable ARP for VIP
To disable ARP for VIP at real servers, we just need to set arp_announce/arp_ignore sysctls at the interface connected to the VIP network. For example, real servers have eth0 connected to the VIP network with the VIP at interface lo, we will have the following commands.

echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

Or, if /etc/sysctl.conf is used in the system, we have this config in /etc/sysctl.conf

net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2

Note that the arp_announce/arp_ignore sysctls must be setup correctly, before the VIP address is brought up at a logical interface at real servers.


3、内核文档中的说明
关于这两个参数,在kernel-doc 包中有详细的说明,其位于:

引用
/usr/share/doc/kernel-doc-2.6.18/Documentation/networking/ip-sysctl.txt