天天看点

linux同一台机器上的两块网卡设置同一段的P

今天我的一个朋友问了我这样一个问题,我给同一台机器上的两块网卡设置同一段的 IP,怎么出现了很多的问题? 我们先来看下他是如何操作的:     拓扑图很简单:  

linux同一台机器上的两块网卡设置同一段的P

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

RHEL: ifconfig如下:

[[email protected] ~]# ifconfig

eth0      Link encap:Ethernet HWaddr  00:0C:29:A5:D5:A3 

          inet addr: 60.232.83.233 Bcast:60.232.83.255 Mask:255.255.255.128

略。。。。。。。

eth1      Link encap:Ethernet HWaddr  00:0C:29:A5:D5:AD 

          inet addr :60.232.83.234 Bcast:60.232.83.255 Mask:255.255.255.128

          略。。。。。。。。。

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1 Mask:255.0.0.0

          略。。。。。。。。。

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

C:\ >ping 60.232.83.233

Pinging 60.232.83.233 with 32 bytes of data:

Reply from 60.232.83.233: bytes=32 time=9ms TTL=64

Reply from 60.232.83.233: bytes=32 time<1ms TTL=64

C:\ >ping 60.232.83.234

Pinging 60.232.83.234 with 32 bytes of data:

Reply from 60.232.83.234: bytes=32 time<1ms TTL=64

Reply from 60.232.83.234: bytes=32 time<1ms TTL=64

此时用arp –a在本地查看

C:\ >arp -a

Interface: 60.232.83.172 --- 0x20005

Internet Address      Physical Address      Type

60.232.83.129         00-04-96-1a-ca-60     dynamic

60.232.83.233         00-0c-29-a5-d5-a3     dynamic

60.232.83.234         00-0c-29-a5-d5-a3     dynamic

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

现在我们[[email protected] ~]# ifconfig eth1 down

来禁止eth1,结果ping 233和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禁止。

[[email protected] ~]# ifconfig eth0 down 

[[email protected] ~]# ifconfig

eth1      Link encap:Ethernet HWaddr 00:0C:29:A5:D5:AD 

          inet addr:60.232.83.234 Bcast:60.232.83.255 Mask:255.255.255.128

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

          略。。。。。

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1 Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          略。。。。

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

Arp –a后发现: C:\>arp -a

Interface: 60.232.83.172 --- 0x20005

Internet Address      Physical Address      Type

60.232.83.129         00-04-96-1a-ca-60     dynamic

60.232.83.233         00-0c-29-a5-d5-ad     dynamic

60.232.83.234         00-0c-29-a5-d5-ad     dynamic

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

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

C:\>arp -a

Interface: 60.232.83.172 --- 0x20005

Internet Address      Physical Address      Type

60.232.83.129         00-04-96-1a-ca-60     dynamic

60.232.83.233         00-0c-29-a5-d5-a3     dynamic

60.232.83.234         00-0c-29-a5-d5-ad     dynamic

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

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

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

C:\>arp -a

Interface: 60.232.83.172 --- 0x20005

Internet Address      Physical Address      Type

60.232.83.129         00-04-96-1a-ca-60     dynamic

60.232.83.233         00-0c-29-a5-d5-ad     dynamic

60.232.83.234         00-0c-29-a5-d5-ad     dynamic

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

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

C:\Documents and Settings\Administrator>ipconfig /all

Windows IP Configuration

   Host Name . . . . . . . . . . . . : newxyz-yz5l2clv

   Primary Dns Suffix . . . . . . . :

   Node Type . . . . . . . . . . . . : Unknown

   IP Routing Enabled. . . . . . . . : No

   WINS Proxy Enabled. . . . . . . . : No

Ethernet adapter 本地连接 3:

   Connection-specific DNS Suffix . :

   Description . . . . . . . . . . . : VMware Accelerated AMD PCNet Adapter #2

   Physical Address. . . . . . . . . : 00-0C-29-68-03-AF

   DHCP Enabled. . . . . . . . . . . : No

   IP Address. . . . . . . . . . . . : 60.232.83.251

   Subnet Mask . . . . . . . . . . . : 255.255.255.128

   Default Gateway . . . . . . . . . :

Ethernet adapter 本地连接 2:

   Connection-specific DNS Suffix . :

   Description . . . . . . . . . . . : VMware Accelerated AMD PCNet Adapter

   Physical Address. . . . . . . . . : 00-0C-29-68-03-A5

   DHCP Enabled. . . . . . . . . . . : No

   IP Address. . . . . . . . . . . . : 60.232.83.250

   Subnet Mask . . . . . . . . . . . : 255.255.255.128

   Default Gateway . . . . . . . . . :

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

C:\Documents and Settings\Administrator>arp -a

Interface: 60.232.83.198 --- 0x10005

Internet Address      Physical Address      Type

60.232.83.129         00-04-96-1a-ca-60     dynamic

60.232.83.250         00-0c-29-68-03-a5     dynamic

60.232.83.251         00-0c-29-68-03-af     dynamic

关闭任何一个网卡都是无法ping的。 我给他的答案是:

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

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

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

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

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

所以最好的方法是避免这样操作。   ################################################################################ 其实同一台机器上的双网卡未必不能设置同一段的 IP 地址,如果想做到这一点那我们就要用到双网卡绑定的技术 那什么是双网卡的绑定我感觉还是有必要再啰嗦一下:  顾名思义双网卡的 bonding 就是将两块网卡绑定在一起实现网卡的流量负载和主备的功能。Bonding 是通过一个虚拟的网络配置文件对外提供 IP 地址。Linux双网卡绑定实现就是使用两块网卡虚拟成为一块网卡,这个聚合起来的设备看起来是一个单独的以太网接口设备,通俗点讲就是两块网卡具有相同的IP地址而并行链接聚合成一个逻辑链路工作。其实这项 技术在Sun和Cisco中早已存在,被称为Trunking和Etherchannel技术,在Linux的2.4.x的内核中也采用这这种技术,被称为bonding。bonding技术的最早应用是在集群——beowulf上,为了提高集群节点间的数据传输而设计的。下面我们讨论一下bonding 的原理,什么是bonding需要从网卡的混杂(promisc)模式说起。我们知道,在正常情况下,网卡只接收目的硬件地址(MAC Address)是自身Mac的以太网帧,对于别的数据帧都滤掉,以减轻驱动程序的负担。但是网卡也支持另外一种被称为混杂promisc的模式,可以接收网络上所有的帧,比如说tcpdump,就是运行在这个模式下。bonding也运行在这个模式下,而且修改了驱动程序中的mac地址,将两块网卡的Mac地址改成相同,可以接收特定mac的数据帧。然后把相应的数据帧传送给bond驱动程序处理。 首先要看linux是否支持bonding,RHEL4已经默认支持了.(大部分发行版都支持) # modinfo bonding filename:       /lib/modules/2.6.18-8.el5/kernel/drivers/net/bonding/bonding.ko

author:         Thomas Davis, [email protected] and many others

description:    Ethernet Channel Bonding Driver, v3.0.3

version:        3.0.3

license:        GPL

srcversion:     2547D22885C2FDF28EF7D98   以下是简单的手动实现bonding的配置。 1.      创建虚拟网络配置文件ifcfg-bond0 :

linux同一台机器上的两块网卡设置同一段的P

    3.修改/etc/modprobe.conf,在最后面加入以下两行,让系统启动的时候在动加载 bonding 模块,对外的虚拟的网络接口为 bond0: alias bond0 bonding options bond0 miimon=100 mode=1

linux同一台机器上的两块网卡设置同一段的P

或者是 # vi /etc/rc.d/rc.local  

加入  

ifenslave bond0 eth0 eth1  5.    加载 bonding 模块

linux同一台机器上的两块网卡设置同一段的P

  设置完成后必须要重新启动系统。     此时不管是断开那一块网卡网络也可以通讯。 7.可以通过 /proc/net/bonding/bond0 查看网卡的主备状态

linux同一台机器上的两块网卡设置同一段的P

      从原理分析一下(bond运行在mode 0下):

mode 0下bond所绑定的网卡的IP都被修改成一样的mac地址,如果这些网卡都被接在同一个交换机,那么交换机的arp表里这个mac地址对应的端口就有多个,那么交换机接受到发往这个mac地址的包应该往哪个端口转发呢?正常情况下mac地址是全球唯一的,一个mac地址对应多个端口肯定使交换机迷惑了。

所以mode0下的bond如果连接到交换机,交换机这几个端口应该采取聚合方式(cisco称为ethernetchannel,foundry称为portgroup),因为交换机做了聚合后,聚合下的几个端口也被捆绑成一个mac地址

继续阅读