2009年4月9日星期四

单网卡绑定多IP实现多网段访问,多网卡绑定单IP实现负载均衡

今天有遇到实现linux下访问多网段问题,以前只是有注意资料修改linux路由的的方法,在使用2003系统时倒是有经常单网卡访问多网段。前提是先绑定每个网段的一个IP。那同理如果我们需要实现linux下单网卡访问多网段,我们就必须先在单网卡上绑定多个IP了,看以下实现:
我这里以自己使用的Redhat Enterprise Linux为例说明。
假设需要绑定多IP的网卡是eth0,我们先看看原网卡的配置信息和系统路由:
[root@test network-scripts]# more ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
BROADCAST=172.16.1.255
HWADDR=00:0C:29:A2:0C:32
IPADDR=172.16.1.55
NETMASK=255.255.255.0
NETWORK=172.16.1.0
ONBOOT=yes
TYPE=Ethernet

[root@test network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use
Iface
172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0
eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0
eth0
0.0.0.0 172.16.1.1 0.0.0.0 UG 0 0 0
eth0

请在/etc/sysconfig/network-scripts目录里面创建一个名为ifcfg-eth0:0的文件,内容和原来ifcfg-eth0内容类似,但是需要注意按照自己的目的修改,如下这是原网卡的配置信息:我们也可以简单地将原ifcfg-eth0复制一份并更名为ifcfg-eth0:1
[root@test network-scripts]# cp ifcfg-eth0 ifcfg-eth0:1
并修改内容如下
[root@test network-scripts]# more ifcfg-eth0:1
DEVICE=eth0:1
BOOTPROTO=static
BROADCAST=192.168.140.255
HWADDR=00:0C:29:A2:0C:32
IPADDR=192.168.140.242
NETMASK=255.255.255.0
NETWORK=192.168.140.0
ONBOOT=yes
TYPE=Ethernet
其中的DEVICE为设备的名称,如果复制过来后设备名没有修改,该网卡上将会被绑定eth0:1这个文件中的IP。
IPADDR为此设备的IP地址,BROADCAST是广播地址,NETMASK为子网掩码,ONBOOT
表示在系统启动时自动启动,如果IP地址相同,该网卡会被自动down掉的,即ONBOOT=no
[root@test network-scripts]# service network restart
//配置完成后重新启动网络服务就可以了连接到新的网段了。
[root@test network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use
Iface
172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0
eth0
192.168.140.0 0.0.0.0 255.255.255.0 U 0 0 0
eth0 //增加绑定IP后自动添加的路由
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0
eth0
0.0.0.0 172.16.1.1 0.0.0.0 UG 0 0 0
eth0
[root@test network-scripts]# ping 192.168.140.1
//并且可以对应网段正常通信了。
PING 192.168.140.1 (192.168.140.1) 56(84) bytes of data.
64 bytes from 192.168.140.1: icmp_seq=0 ttl=255 time=3.75 ms

如果需要再绑定多一个IP地址,只需要把文件名和文件内的DEVICE中的eth0:x加一即可,LINUX最多可以支持255个IP别名.


对以上内容的一点扩充:在这里我在用route命令添加静态路由,使该机器可以访问到其他网段:注意:我这里的环境是192.168.140.1为三层交换机上一个VLAN的IP,并且三层交换上启用了路由在手动增加静态路由之前,我们并没有办法访问到192.168.140.1以外的网段。我们这里添加一条路由
[root@test network-scripts]# route add -net 192.168.0.0/16 gw 192.168.140.1
[root@test network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use
Iface
172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0
eth0
192.168.140.0 0.0.0.0 255.255.255.0 U 0 0 0
eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0
eth0
192.168.0.0 192.168.140.1 255.255.0.0 UG 0 0 0
eth0
0.0.0.0 172.16.1.1 0.0.0.0 UG 0 0 0
eth0
[root@test network-scripts]# ping 192.168.200.1
//这里我们可以看到增加静态路由后立即就可以通过三层交换访问到其他网段了
PING 192.168.200.1 (192.168.200.1) 56(84) bytes of data.
64 bytes from 192.168.200.1: icmp_seq=0 ttl=63 time=3.77 ms

route 命令参数如果记不牢固,可以通过route
--help查看即可。对于linuix使用者来说,任何情况这是最直接也是最好的帮助了。当然我们希望不要每次重新启动计算机之后去手动添加路由,那我们可以把该命令写入到系统启动脚本/etc/rc.d/rc.local中

普遍适用的单网卡绑定多IP实现方法
ifconfig eth0:1 192.168.140.242 broadcast 192.168.140.255 netmask
255.255.255.0
同样可以把上述命令加在启动脚本/etc/rc.d/rc.local中.


多网卡共用单IP的实现方法
 
  使用多块网卡虚拟成为一块网卡,具有相同的IP地址。这项技术其实在cisco和sun中已经存在,分别称为Trunking和
etherchannel技术,在linux中,这种技术称为bonding.因为bonding在内核2.4.x中已经包含了,只需要在编译的时候把网络设备选项中的
Bonding driver
support选中就可以了。然后,重新编译核心,重新起动计算机,执行如下命令:
ismod bonding
ifconfig eth0 down
ifconfig eth1 down
ifconfig bond0 ipaddress
ifenslave bond0 eth0
ifenslave bond0 eth1
现在两块网卡已经象一块一样工作了,这样可以提高集群节点间的数据传输。
你最好把这几句写成一个脚本,再由/etc/rc.d/rc.local,以便一开机就生效。
  bonding对于服务器来是个比较好的选择,在没有千兆网卡时,用两三块100兆网卡作
bonding,可大大提高服务器到交换机之间的带宽。但是需要在交换机上设置连接bonding
网卡的两个口子映射为同一个虚拟接口。