Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165682
  • 博文数量: 21
  • 博客积分: 517
  • 博客等级: 下士
  • 技术积分: 358
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-23 23:42
文章分类

全部博文(21)

文章存档

2015年(2)

2012年(19)

我的朋友

分类: LINUX

2015-08-04 13:43:16

    在配置LVS和一些linux服务器作为网关的场景中,都会需要设置arp_announce和arp_ignore这两个参数。网上也有很多文章对这两个参数做相应的解释,并且也有对照内核官方说明文档的相应翻译,关于arp_ignore的意义还是比较容易理解的,但是关于arp_announce的解释,我觉得很多都不到位,甚至有越看越糊涂的情况。下面我就结合自己的思考对这两个参数给出我的理解。
    顾名思义,arp_announce和arp_ignore是和ARP协议(Address Resolution Protocal,地址解释协议)有关的,所以要真正了解这两个参数,首先要理解ARP的原理。ARP协议的作用就是根据IP地址获取其对应的MAC地址。在以太网中,主机要发送一个数据包,首先需要获取目标MAC地址(如果通信的目标主机在同一网段,那目标MAC地址就是目标主机的MAC地址,否则应该为网关的MAC地址或下一跳的MAC地址),而获取目标MAC地址的方法就是使用ARP协议发送ARP请求数据包,ARP请求数据包中会包含发送方的IP地址和MAC地址,并且包含想要获取MAC地址的目标IP地址,该ARP请求数据包的数据链路层目标地址为广播地址,也就是说它是一个二层广播数据包(因为不知道谁拥有指定目标IP地址,所以只能使用广播方式发送)。在同一局域网的所有主机都将收到该ARP请求数据包,但是只有拥有目标IP地址的主机才会发送ARP响应数据包,该ARP响应数据包包含发送方的IP地址和MAC地址(即对方想要知道的目标MAC地址),并且目标IP地址和MAC地址设置为对方的地址(即ARP请求数据包发送方的地址),并且该数据包为单播数据包(其数据链路层目标地址为对方的MAC地址),下图中为ARP请求数据包和ARP响应数据包的抓包截图,大家可结合抓包信息理解上面的内容:



    理解了ARP协议的原理后,我们再来看上面所说的两个参数:
    arp_announce参数是定义linux主机发送ARP请求数据包时如何选择数据包中使用的发送方IP地址(即Sender IP address)。在系统准备通过网卡发送一个IP数据包前,该IP数据包的源IP地址和目标IP地址通常是已经知道的,同时发送的网卡也已经确定,那数据链路层的源MAC地址当然也确定了,最后剩下的就是确定数据链路层的目标MAC地址了,而该目标MAC地址就需要通过ARP地址解释协议来获取,于是系统首先需要发送ARP请求数据包获取目标MAC地址。结合上面关于ARP原理的描述,我们知道,发送ARP请求数据包时需要包含发送方IP地址,该IP地址应该是什么呢?大家可能想当然的以为就是要发送的IP数据包的源IP地址,其实这个是不一定的,尤其是主机有多个网络接口和IP地址时,而arp_announce正是控制该发送方IP地址的选择条件的。arp_announce参数的取值分别是0、1、2,这些取值的意义如下:
0(默认值)-- 允许使用任一网络接口配置的IP地址(即任一本地地址),通常就是待发送的IP数据包的源IP地址。
1 -- 尽量避免使用不属于该网络接口(即发送数据包的网络接口)子网的本地地址作为发送方IP地址。根据我对官方原文的理解,就是说如果主机包含多个子网,而IP数据包的源IP地址属于其中一个子网,虽然该IP地址不属于本网口的子网,但是也可以作为ARP请求数据包的发送方IP地址,否则就会按照取值为2的方式选择发送方IP地址。
2 -- 忽略IP数据包的源IP地址,总是选择网口所配置的最合适的IP地址作为ARP请求数据包的发送方IP地址(一个网口可能会配置多个IP地址)。
    arp_ignore参数是定义linux主机在收到ARP请求数据包后,发送ARP响应数据包的条件级别,该参数的取值范围是0~8,各取值的意义分别是:
0(默认值)-- 只要ARP请求数据包所请求的IP地址属于任一本地地址(即任意一个本机配置的IP地址),就会回应ARP响应数据包,即使该IP地址不属于接收到ARP请求数据包的网卡。
1 -- 只有ARP请求数据包所请求的IP地址属于当前网卡的IP地址,才会回应ARP响应数据包。
2 -- 除了满足1的条件外,还要满足ARP请求数据包的发送方IP地址也属于当前网卡所属子网,这样才会回应ARP响应数据包。
3 -- 如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。
4~7 -- 保留
8 -- 即使ARP请求数据所请求的IP地址属于任何一个本地地址,也不回应ARP响应数据包。
    arp_ignore参数应该很好理解,它在网络配置中的作用也很清楚,但是arp_announce的作用是什么呢?设置为不同的值会有什么不同的作用呢?或者说有什么不同的影响呢?下面我们来举个例子说明不同值的影响。不过要理解以下的影响,我们要了解,对于网络设备(三层交换机、路由器)及主机,其ARP地址表(包含IP地址和MAC地址对应关系的表)是如何建立的:当设备或主机收到一个ARP请求数据包时,它会把ARP请求数据包的发送方IP地址和MAC地址的对应关系放入自身的ARP地址表。理解了上面所说的,我们来看看实际的案例场景:假设linux主机有A、B两块网卡,其对应的IP地址分别为IP_A、IP_B,对应的MAC地址为MAC_A、MAC_B,假设一个应用程序准备与外部通信,它的socket绑定了源IP地址为IP_A,但是根据系统路由及相关设置,其通信数据包将会从B网卡发送,在发送数据包前,系统会通过网卡B发送ARP请求数据包。如果我们将arp_announce的值设定为0,那该ARP请求数据包的发送方IP地址是IP_A,而发送方MAC地址为MAC_B,这样就会在网络设备或对方主机的ARP地址表上留下IP_A与MAC_B的对应记录,但是实际正确的应该是IP_A对应MAC_A、IP_B对应MAC_B,所以这可能会引起潜在的网络问题,具体问题和表现与网络的拓扑结构及网络配置有关。而如果我们将arp_announce设置为2,那在发送ARP请求数据包时,发送方IP地址将不是IP_A,而是IP_B,这样就不会引起刚才所说的问题。至于arp_announce=1的情景,我还不是很清楚,所以无法举出具体的例子。
阅读(11860) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~