一次arp_ignore配置引起的故障

一、ARP简介
        IP地址是网络层和以上各层使用的地址,是一种逻辑地址。物理地址MAC是数据链路层和物理层使用的地址。上层数据交给数据链路层传输时,需要知道目的硬件地址。在数据传输时,已知目的IP地址,如何找出对应的硬件地址使数据正确转发?地址解析协议ARP就是来解决这个问题的。
        其方法是在主机缓存一个从IP到硬件地址的表,并且这个映射表会动态更新(默认60s)。当主机A需要向本局域网的主机B发送IP数据报时,先在ARP缓存中查找对应B的IP地址,若有则获取对应的硬件地址并把硬件地址写入MAC帧,然后通过局域网把MAC帧发往此硬件地址。若不存在运行ARP找出B的硬件地址。
        简单的找出硬件地址过程为:A发送广播ARP分组,B的IP地址与A查找的一致,将自己的MAC地址写入响应分组并向主机A发送ARP响应,A收到后记录MAC地址到本地缓存。当A再次向B发送请求时,直接从ARP缓存中获取对应的MAC地址进行转发。找到后,若能正常通信,则之后一直通过点对点维持,不再发送广播包。

二、arp_ignore配置
该选项是控制上述B主机将哪个MAC写入ARP响应分组的。其取值有01/2/3~8较少用。
0:响应任意网卡上收到的对本机IP地址的ARP请求,而不管目的IP是否在接收网卡上;
1:只响应目的IP地址为接收网卡的本地地址ARP请求;
2:只响应目的IP地址为接收网卡的本地地址ARP请求且要求源IP必须和接收网卡同网段;
3:如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包
4~7:保留;
8:不响应所有ARP请求;

临时配置:sysctl net.ipv4.conf.eth3.arp_ignore=1,永久配置echo "net.ipv4.conf.eth0.arp_ignore = 1" >> /etc/sysctl.conf

三、环境与故障
单个主机一个网卡,网卡有两个口port1、port2配置不同网段的ip,分别为192.168.101.x,192.168.102.x,网络拓扑如下

期望当交换机A断电时,主机A与主机B通过交换机B通信;反之通过A通信。以保证网络高可用。
初始时,交换机AB正常。主机A的101.1与主机B的101.2、 102.1 与 102.2分别建立TCP连接,两个连接通信正常。
1、关闭交换机A,此时主机AB通信正常;
2、启动交换机A,待101.1与101.2建立连接后,关闭交换机B,发现关闭B后101.1与101.2连接(长连接)发送数据失败。但是B对101.1的ping依旧正常,且对102.1的ping在4分钟后居然自动恢复了。所以这里出现两个问题:

  1. 交换机A工作正常,ping也正常,为什么101网段发送数据为什么失败?
  2. 102网段交换机关闭后,为什么ping在4分钟后恢复?


四、原因及解决方法
1、使用arping 对102网络执行ping:arping  -I eth3 192.168.102.1,发现返回的MAC居然是101.1的MAC地址
查看主机A的 arp_ignore值为0,0 的含义是“响应任意网卡上收到的对本机IP地址的ARP请求,而不管目的IP是否在接收网卡上”。关闭交换机B后,由于102网络不可达,所以主机A的102.1网口不会收到ARP报文,网口101.1收到ARP了报文后不确认目的IP是否在自己网口上,使用自己的MAC aa:11回复了ARP请求报文。这时候主机B认为与102.1对应的转发MAC地址为 aa:11(实际应该为 aa:22)。当B获取到102.1的MAC后,其数据链路层转发时会将给102.1的ping报文转发给101.1, 主机101.1 收到后响应ping。所以4分钟后ping恢复(恢复时间不是固定4分钟,具体恢复时间取决于arp表的恢复时间)。
2、同样的原因,在交换机A关机后,主机A、B通过ARP协议获取到新的MAC,101.x网段的数据链路通信也通过交换机B。当交换机A启动后,101.x网段依旧使用交换机B通信,即101.x 102.x两个网段都通过交换机B通信,所以当交换机B关机后,两个网段的连接传输数据超时。
3、解决方法:
arp_ignore值修改为1,只响应目的IP地址为接收网卡的本地地址ARP请求,这样当某个网段不可达时,无法获取MAC地址,避免获取到错误的MAC,导致后续故障切换失效。在交换机A恢复后,101.x网段通过交换机A通信。


附:
arp_announce的作用是控制系统在对外发送arp请求时,如何选择arp请求数据包的源IP地址。(比如系统准备通过网卡发送一个数据包a,这时数据包a的源IP和目的IP一般都是知道的,而根据目的IP查询路由表,发送网卡也是确定的,故源MAC地址也是知道的,这时就差确定目的MAC地址了。而想要获取目的IP对应的目的MAC地址,就需要发送arp请求。arp请求的目的IP自然就是想要获取其MAC地址的IP,而arp请求的源IP是什么呢? 可能第一反应会以为肯定是数据包a的源IP地址,但是这个也不是一定的,arp请求的源IP是可以选择的,控制这个地址如何选择就是arp_announce的作用)
  arp_announce参数常用的取值有0,1,2。
0:允许使用任意网卡上的IP地址作为arp请求的源IP,通常就是使用数据包a的源IP。
1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址。
2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。
  sysctl.conf中包含all和eth/lo(具体网卡)的arp_ignore参数,取其中较大的值生效

复现问题需要修改如下配置

sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.eth0.rp_filter=0
sysctl -w net.ipv4.conf.eth1.rp_filter=0
sysctl -w net.ipv4.conf.default.rp_filter=0

rp_filter
即rp_filter参数有三个值,0、1、2,具体含义:
0:不开启源地址校验。
1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径(默认路由)。如果反向路径不是最佳路径(默认路由),则直接丢弃该数据包。
2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值