linux下双网卡同一个IP

fqx 2015-07-13

转自:http://q2482696735.blog.163.com/blog/static/250606077201569029441/

由于需要一台机器有两个网卡,开始时设置在同一个网段的IP,发现数据总是从一个网卡发出,而另一个网卡上没有数据流动。网上找了下,发现相同的问题不少:

一、

关于双网卡设置同一网段IP然后连接交换机的时候出现的奇怪现象。当时没有怎么思考、以为是生成树的缘故,不过后来一想不太对。

初步做了一下实验:

服务器为RHEL5双网卡,eth0为234,eth1为233,我本地客户机为172。

RHEL:ifconfig如下:

[root@server1~]#ifconfig

eth0Linkencap:EthernetHWaddr00:0C:29:A5:D5:A3

inetaddr:60.232.83.233Bcast:60.232.83.255Mask:255.255.255.128

略。。。。。。。

eth1Linkencap:EthernetHWaddr00:0C:29:A5:D5:AD

inetaddr:60.232.83.234Bcast:60.232.83.255Mask:255.255.255.128

略。。。。。。。。。

loLinkencap:LocalLoopback

inetaddr:127.0.0.1Mask:255.0.0.0

略。。。。。。。。。

在客户机XP上ping两个地址,都是通的。

C:\>ping60.232.83.233

Pinging60.232.83.233with32bytesofdata:

Replyfrom60.232.83.233:bytes=32time=9msTTL=64

Replyfrom60.232.83.233:bytes=32time<1msTTL=64

C:\>ping60.232.83.234

Pinging60.232.83.234with32bytesofdata:

Replyfrom60.232.83.234:bytes=32time<1msTTL=64

Replyfrom60.232.83.234:bytes=32time<1msTTL=64

此时用arp–a在本地查看

C:\>arp-a

Interface:60.232.83.172---0x20005

InternetAddressPhysicalAddressType

60.232.83.12900-04-96-1a-ca-60dynamic

60.232.83.23300-0c-29-a5-d5-a3dynamic

60.232.83.23400-0c-29-a5-d5-a3dynamic

发现两个网卡的MAC地址一样,也就是eth0的mac地址。

现在我们[root@server1~]#ifconfigeth1down

来禁止eth1,结果ping233和234的地址都是通的。

这里可以这样理解,arp–a看到本地解析到得两块网卡mac地址是一样的,局域网是通过2层寻址的不可能涉及到ip这样的3层协议,因此mac地址相同ping哪个都应该是通的,但是为什么本地会出现不同的IP相同的mac地址呢?在Linux上看到的明明是不同的MAC地址00:0C:29:A5:D5:A3,00:0C:29:A5:D5:AD

继续测试,现在把eth0禁止。

[root@server1~]#ifconfigeth0down

[root@server1~]#ifconfig

eth1Linkencap:EthernetHWaddr00:0C:29:A5:D5:AD

inetaddr:60.232.83.234Bcast:60.232.83.255Mask:255.255.255.128

inet6addr:fe80::20c:29ff:fea5:d5ad/64Scope:Link

略。。。。。

loLinkencap:LocalLoopback

inetaddr:127.0.0.1Mask:255.0.0.0

inet6addr:::1/128Scope:Host

略。。。。

本地先arp–d清除一下缓存。然后再ping两块网卡的IP地址,依然可以ping通两个地址。

Arp–a后发现:

C:\>arp-a

Interface:60.232.83.172---0x20005

InternetAddressPhysicalAddressType

60.232.83.12900-04-96-1a-ca-60dynamic

60.232.83.23300-0c-29-a5-d5-addynamic

60.232.83.23400-0c-29-a5-d5-addynamic

Mac地址成为另一块也就是eth1的mac地址。

然后开启eth0,然后再ping测试一下。结果如下:

C:\>arp-a

Interface:60.232.83.172---0x20005

InternetAddressPhysicalAddressType

60.232.83.12900-04-96-1a-ca-60dynamic

60.232.83.23300-0c-29-a5-d5-a3dynamic

60.232.83.23400-0c-29-a5-d5-addynamic

这才是一张正常的地址表。

这时候再关闭eth0,结果就ping不通了,因为这时候缓存里的233的mac地址已经关闭。

Arp–d之后就可以ping通了,此时eth0依然处于关闭状态,只是清楚了一下缓存表,这样再起ping233地址,可以ping通了,得出的结果是234的mac地址。

C:\>arp-a

Interface:60.232.83.172---0x20005

InternetAddressPhysicalAddressType

60.232.83.12900-04-96-1a-ca-60dynamic

60.232.83.23300-0c-29-a5-d5-addynamic

60.232.83.23400-0c-29-a5-d5-addynamic

此时开启eth0,现在本地缓存中的两个IP依然对应的还是234的mac地址。Arp–d清除一下,这次先ping234再ping233,结果两个都是233的既eth0的mac地址。

实验做到这里脑子有点乱,把这台Linux服务器换成WindowsServer2003,就没有这问题出现。

C:\DocumentsandSettings\Administrator>ipconfig/all

WindowsIPConfiguration

HostName............:newxyz-yz5l2clv

PrimaryDnsSuffix.......:

NodeType............:Unknown

IPRoutingEnabled........:No

WINSProxyEnabled........:No

Ethernetadapter本地连接3:

Connection-specificDNSSuffix.:

Description...........:VMwareAcceleratedAMDPCNetAdapter#2

PhysicalAddress.........:00-0C-29-68-03-AF

DHCPEnabled...........:No

IPAddress............:60.232.83.251

SubnetMask...........:255.255.255.128

DefaultGateway.........:

Ethernetadapter本地连接2:

Connection-specificDNSSuffix.:

Description...........:VMwareAcceleratedAMDPCNetAdapter

PhysicalAddress.........:00-0C-29-68-03-A5

DHCPEnabled...........:No

IPAddress............:60.232.83.250

SubnetMask...........:255.255.255.128

DefaultGateway.........:

本地ping两块网卡之后显示如下:

C:\DocumentsandSettings\Administrator>arp-a

Interface:60.232.83.198---0x10005

InternetAddressPhysicalAddressType

60.232.83.12900-04-96-1a-ca-60dynamic

60.232.83.25000-0c-29-68-03-a5dynamic

60.232.83.25100-0c-29-68-03-afdynamic

关闭任何一个网卡都是无法ping的。

所以在Linux下网卡可能采用一些机制,比如说,首先,问题属于双网卡同一网段linux系统网卡自动路由的问题。

2、如果系统有两个独立网卡,并且这两个网卡的IP属于同一个子网,那么后面这个网卡的IP将自动路由到前面一个网卡上。

也就是说数据将自动路由到前面的那个网卡上。在不加任何设置的情况下,如果前面的网卡断线或者故障了(拔掉网线或者网卡指坏了),必须用命令down调后面的网卡然后再up,这时后面的网卡才能启用。此时两个IP又同时路由到后面的网卡上,也就是说后面的网卡又具有两个IP地址。

当然两块网卡设置成同一网段是不合理的。

我的技术实在有限,这些都是实验后的猜测,就当抛砖引玉,希望有人能给解释一下。谢谢

改天实验一下bond~~~~

====================

结论:

这种现象正常。我们将其理解为在Linux系统下双网卡设置同样网段没有正确更新路由表的能力。因此会造成上述情况出现。

所以最好的方法是避免这样操作。

二、

问题:

我在两个网卡上面设置同样网段的两个IP(比如10.1.0.1和10.1.0.2),这时是可以正常工作的,但是如果我把第一快网卡(eth0)上的网线拔掉之后,网络就不通了,按照我的设想,当eth0不通时系统应该可以从eth1走,所以网络应该还是通的,因为我设的是同一个网段的IP。而且,如果我运行命令ifdowneth0之后,网就通了,也就是可以从eth1走了。

解答:

这样配置是有问题的,当eth0的网线被拔掉时,系统并不能按您设想的改从eth1走,因为系统里面有一个路由表,当您设置IP的时候就会同时设置路由表,当需要访问外面的时候,系统会去路由表里面查询,当查询到第一个匹配的项目时就应用这个项目,也就是从这条路径走了,当你拔掉eth0的网线的时候,路由表并没有同时改变,所以系统仍然会试图从eth0走,并不会自动改成从eth1走。

但是,如果你运行命令ifdowneth0之后,系统就会把eth0这条路由删除掉,之后就可以从eth1走了,网也就通了。

您可以使用命令route来查看系统路由表:

[root@localhost~]#route

KernelIProutingtable

DestinationGatewayGenmaskFlagsMetricRef

UseIface

10.0.0.0*255.0.0.0U000eth0

10.0.0.0*255.0.0.0U000eth1

像您设想的,您如果希望两块网卡能够像热备一样工作,也就是一块不通时可以从另外一块走,那么您可以使用网卡绑定,在核心里面提供了网卡绑定的支持:

#insmodbondingmode=1

#ifconfigeth0down

#ifconfigeth1down

#ifconfigbond0ipaddress

#ifenslavebond0eth0

#ifenslavebond0eth1

这样设置之后,eth0和eth1就被绑定成了一个新的设备:bond0,这个设备可以工作在热备(mode=1)和负载均衡(mode=0)两种方式下,任何一种工作方式下都可以实现您的设想,也就是任意拔掉一根网线,网络仍然可以正常工作,只是负载均衡方式需要两个网卡同时工作,要求交换机上的对应网口也要做绑定,这个就需要查看交换机的使用说面了,如果您不清楚可以使用热备的方式,它是一块网卡工作,另外一块网卡做备份,如果工作的网卡出现问题,比如网络段了,那么会马上切换到另外一块网卡上,保证网络通畅,这种方式不要求交换机做特殊设置。

我的结论:

从第二篇看,我的问题和第一篇的问题应该是由于route表的原因造成的。

相关推荐

bailove / 0评论 2012-06-22