多网卡下同网段内所有网卡共用一个IP的问题分析

问题起因:

有四个网口,IP地址都分配在同一段,如172.16.X.X(理论上不应该),配置好网络(除IP外其它都一样),连接网线使用时,使用ifconfig ethX down 命令,只保留其中一个网口用于连接,这时,网络可以连接正常,但是从其它机器ping 这设置的4个IP地址,都能连通,并且也可以进行远程登录,但实际mac地址是连接网线的那个网口的。为什么网口都down掉了,还能连接呢?实际中又为何仍然存在4个IP呢?

环境:linux ,2个82576网口

问题分析:

(1)问题重现

这边取用别人做的一个重现过程:

一、实验环境
实验环境很简单,两台机器,设置如下:
引用
A机:Asianux 3.0 双网卡,并设定两个同网段的IP地址:
eth0:192.168.228.161
eth1:192.168.228.162
B机:Windows 平台,作为测试客户端,IP是192.168.228.221

※ 经测试,若两台机器都是Linux 平台,不会发生下面的情况。
下面是A 机上的IP 和MAC 地址配置信息:
引用
# ifconfig|grep -A1 eth
eth0 Link encap:Ethernet HWaddr 00:11:5B:D1:0E:F8
inet addr:192.168.228.161 Bcast:192.168.228.255 Mask:255.255.255.0
--
eth1 Link encap:Ethernet HWaddr 00:F0:BF:70:00:EE
inet addr:192.168.228.162 Bcast:192.168.228.255 Mask:255.255.255.0

二、默认参数下的测试情况
首先,我们在保持系统默认参数的环境下进行测试。
1、清空B 机的arp 表缓存信息
Win 7 使用下面的命令清空arp 缓存:

arp -d *

2、从B机分别ping A机上的两个IP 地址
引用
C:\Users\linuxing>ping -n 1 192.168.228.161
正在 Ping 192.168.228.161 具有 32 字节的数据:
来自 192.168.228.161 的回复: 字节=32 时间<1ms TTL=64
C:\Users\linuxing>ping -n 1 192.168.228.162
正在 Ping 192.168.228.162 具有 32 字节的数据:
来自 192.168.228.162 的回复: 字节=32 时间<1ms TTL=64

此时的arp 表如下(忽略其他IP地址的MAC信息,下同):
引用
C:\Users\linuxing>arp -a
接口: 192.168.228.221 --- 0xc
Internet 地址 物理地址 类型
192.168.228.161 00-11-5b-d1-0e-f8 动态
192.168.228.162 00-f0-bf-70-00-ee 动态

3、测试
ping A机上的192.168.228.162,同时,禁用eth1网卡,B机显示的结果如下:
引用
C:\Users\linuxing>ping 192.168.228.162 -t

正在 Ping 192.168.228.162 具有 32 字节的数据:
来自 192.168.228.162 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.228.162 的回复: 字节=32 时间<1ms TTL=64
请求超时。
来自 192.168.228.162 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.228.162 的回复: 字节=32 时间<1ms TTL=64

192.168.228.162 的 Ping 统计信息:
数据包: 已发送 = 11,已接收 = 10,丢失 = 1 (9% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
Control-C
^C

※ A机上用ifconfig eth1 down 禁用网卡,或拔去eth1的网线。
再看看B机的arp 表:
引用
C:\Users\linuxing>arp -a
接口: 192.168.228.221 --- 0xc
Internet 地址 物理地址 类型
192.168.228.161 00-11-5b-d1-0e-f8 动态
192.168.228.162 00-11-5b-d1-0e-f8 动态

可见,A机上的两块网卡的IP地址都指向了同一个MAC 地址(即eth0)。在ping 的过程中虽然发生过短暂的中断,但恢复后,IP 与MAC 的指向就改变了。后面再ping 162的地址,都是成功的(因为eth0 是连接的)

4、问题原因

产生该问题的主要原因是,Linux 核心中的一个arp_ignore 参数,该参数默认值为0。即对ARP请求时,只要该IP在本地的机器任意网卡设备上存在都会响应。

arp_announce : INTEGER
默认为0
对网络接口上本地IP地址发出的ARP回应作出相应级别的限制:

确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送

all/ 和{interface}/ 下两者同时比较,取较大一个值生效.

提高约束级别有益于从指定的目标接受应答,而降低级别可以给予更多的arp查询者以反馈信息
arp_ignore : INTEGER
默认为0
定义对目标地址为本地IP的ARP询问不同的应答模式

0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使eth0收到来自10.1.1.2这样地址发起的对10.1.1.1 的arp查询也会回应--而原本这个请求该是出现在eth1上,也该有eth1回应的)

1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使eth0收到来自10.1.1.2这样地址发起的对192.168.0.1的查询会回答,而对10.1.1.1 的arp查询不会回应)
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,eth1收到来自10.1.1.2这样地址发起的对192.168.0.1的查询不会回答,而对192.168.0.2发起的对192.168.0.1的arp查询会回应)
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应(do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied 翻译地似乎不好,这个我的去问问人)
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询

all/ 和{interface}/ 下两者同时比较,取较大一个值生效.

解决方法

除了调整上面提到的arp_ignore参数外,在日常的系统配置中,我们也应该尽量避免在同一台机器,不同网卡上配置相同网段的IP地址。特殊情况下,如LVS 环境、链路有环路等,这需考虑arp_ignore 与arp_announce 的参数。

最后再次把所有网卡的arp_ignore设为1,启动所有网卡,看看arp回应,这回终于一一对应了。以后大家多个网卡连同一个vlan,特别是各个网卡的策略路由都不一致的情况下,一定要留意arp_ignore这个参数,不然很容易会出现莫名其妙的connect rest异常。


参考文章:

http://zh.linuxvirtualserver.org/node/2428

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









你可能感兴趣的:(多网卡下同网段内所有网卡共用一个IP的问题分析)