Linux双网卡绑定bond详解--单网卡绑定多个IP

Redhat Linux的网络配置,基本上是通过修改几个配置文件来实现的,虽然也可以用ifconfig来设置IP,用route来配置默认网关,用hostname来配置主机名,但是重启后会丢失。

相关的配置文件

/ect/hosts 配置主机名和IP地址的对应

/etc/sysconfig/network 配置主机名和网关

/etc/sysconfig/network-scripts/ifcfg-eth0 eth0配置文件,eth1则文件名为ifcfg-eth1,以此类推

一、网卡配置

假设我们要配置主机名为test,eth0的IP地址192.168.168.1/24,网关地址192.168.168.250

则/etc/sysconfig/network文件内容如下:

NETWORKING=yes
HOSTNAME=test
GATEWAY=192.168.168.250

eth0对应的配置文件/etc/sysconfig/network-scripts/ifcfg-eth0内容如下:

DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.168.1
NETMASK=255.255.255.0
TYPE=Ethernet
ONBOOT=yes

二、单网卡绑定多个IP

有时,我们需要在一块网卡上配置多个IP,例如,在上面的例子中,我们还需要为eth0配置IP 192.168.168.2和192.168.168.3。那么需要再在/etc/sysconfig/network-scripts下新建两个配置文件:

ifcfg-eth0:0内容如下:

DEVICE=eth0:0
BOOTPROTO=static
IPADDR=192.168.168.2
NETMASK=255.255.255.0
ONBOOT=yes

ifcfg-eth0:1内容如下:

DEVICE=eth0:1
BOOTPROTO=static
IPADDR=192.168.168.3
NETMASK=255.255.255.0
ONBOOT=yes

三、多个网卡绑定成一块虚拟网卡

为了提供网络的高可用性,我们可能需要将多块网卡绑定成一块虚拟网卡对外提供服务,这样即使其中的一块物理网卡出现故障,也不会导致连接中断。比如我们可以将eth0和eth1绑定成虚拟网卡bond0

首先在/etc/sysconfig/network-scripts/下创建虚拟网卡bond0的配置文件ifcfg-bond0,内容如下

DEVICE=bond0
BOOTPROTO=none
BROADCAST=192.168.168.255
IPADDR=192.168.168.1
NETMASK=255.255.255.0
NETWORK=192.168.168.0
ONBOOT=yes
TYPE=Ethernet
GATEWAY=192.168.168.250
USERCTL=no

然后分别修改eth0和eth1的配置文件
ifcfg-eth0内容:

DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes

ifcfg-eth1内容

DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes

因为linux的虚拟网卡是在内核模块中实现的,所以需要安装的时候已经装好该module。在/etc/modules.conf文件中添加如下内容(如果没有该文件,则新建一个):

alias bond0 bonding
options bond0 miimon=100 mode=1 primary=eth0

其中miimon=100表示每100ms检查一次链路连接状态,如果不通则会切换物理网卡
mode=1表示主备模式,也就是只有一块网卡是active的,只提供失效保护。如果mode=0则是负载均衡模式的,所有的网卡都是active,还有其他一些模式很少用到
primary=eth0表示主备模式下eth0为默认的active网卡

miimon是毫秒数,每100毫秒触发检测线路稳定性的事件。
mode 是ifenslave的工作状态。
一共有7种方式:
=0: (balance-rr) Round-robin policy: (平衡抡循环策略):传输数据包顺序是依次传输,直到最后一个传输完毕, 此模式提供负载平衡和容错能力。
=1: (active-backup) Active-backup policy:(主-备份策略):只有一个设备处于活动状态。 一个宕掉另一个马上由备份转换为主设备。mac地址是外部可见得。 此模式提供了容错能力。 
=2:(balance-xor) XOR policy:(平衡 策略): 传输根据原地址布尔值选择传输设备。 此模式提供负载平衡和容错能力。 
=3:(broadcast) broadcast policy:  (广播策略):将所有数据包传输给所有接口。 此模式提供了容错能力。  
=4:(802.3ad) IEEE 802.3ad Dynamic link aggregation.   IEEE 802.3ad 动态链接聚合:创建共享相同的速度和双工设置的聚合组。(我不是太懂。)
=5:(balance-tlb) Adaptive transmit load balancing(适配器传输负载均衡):没有特殊策略,第一个设备传不通就用另一个设备接管第一个设备正在处理的mac地址,帮助上一个传。
=6:(balance-alb) Adaptive load balancing: (适配器传输负载均衡):大致意思是包括mode5,bonding驱动程序截获 ARP 在本地系统发送出的请求,用其中之一的硬件地址覆盖从属设备的原地址。就像是在服务器上不同的人使用不同的硬件地址一样。

这些选项可以用命令:# modinfo bonding 来查看

最后,在/etc/rc.local中加入

modprobe bonding miimon=100 mode=1

重启机器后可以看到虚拟网卡已经生效,可以通过插拔两个物理网卡的网线来进行测试,不过linux中网卡接管的时间好象比较长

from:http://www.360doc.com/content/10/1016/14/1317564_61486325.shtml

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

需要说明的是如果想做成负载均衡,仅仅设置这里modprode bonding miimon=100 mode=0是不够的,还需要设置交换机的端口.

从原理分析一下(bond运行在mode 0下):
mode 0下bond所绑定的网卡的IP都被修改成一样的mac地址,如果这些网卡都被接在同一个交换机,那么交换机的arp表里这个mac地址对应的端口就有多个,那么交换机接受到发往这个mac地址的包应该往哪个端口转发呢?正常情况下mac地址是全球唯一的,一个mac地址对应多个端口肯定使交换机迷惑了。
所以mode0下的bond如果连接到交换机,交换机这几个端口应该采取聚合方式(cisco称为ethernetchannel,foundry称为portgroup),因为交换机做了聚合后,聚合下的几个端口也被捆绑成一个mac地址
由于家里没有三层交换机,这里的试验留给网友自行验证了.

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

在 /etc/rc.local 文件里加上一行:

/root/bonding.sh

bonding.sh文件内容:

#!/bin/shmodprobe -r bondingmodprobe bonding miimon=100 mode=6ifconfig bond0 172.16.96.46 netmask 255.255.248.0 uproute add default gw 172.16.100.1 bond0#ifenslave bond0 eth0 eth1 eth2 eth3 eth4 eth5ifenslave bond0 eth0 eth1 service network restart

原文地址:https://www.cnblogs.com/sinsenliu/p/9166405.html

时间: 2025-01-15 05:56:48

Linux双网卡绑定bond详解--单网卡绑定多个IP的相关文章

linux route命令的使用详解

linux route命令的使用详解 --http://www.cnblogs.com/snake-hand/p/3143041.html 每天一个linux命令(53):route命令 --http://www.cnblogs.com/peida/archive/2013/03/05/2943698.html route命令用于显示和操作IP路由表.要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现.在Linux系统中,设置路由通常是 为了解决以下问

(转)linux 中特殊符号用法详解

linux 中特殊符号用法详解 原文:https://www.cnblogs.com/lidabo/p/4323979.html # 井号 (comments)#管理员  $普通用户 脚本中 #!/bin/bash   #!/bin/sh井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行. # This line is comments.echo "a = $a" # a = 0由于这个特性,当临时不想执行某行指令时,只需在该行开头加上 # 就

(转)Linux命令之Ethtool用法详解

Linux命令之Ethtool用法详解 原文:http://www.linuxidc.com/Linux/2012-01/52669.htm Linux/Unix命令之Ethtool描述:Ethtool是用于查询及设置网卡参数的命令.概要:ethtool ethX      //查询ethX网口基本设置ethtool –h        //显示ethtool的命令帮助(help)ethtool –i ethX    //查询ethX网口的相关信息 ethtool –d ethX    //查询

linux移植u-boot(一)——U-Boot详解+自定义命令实战

linux移植u-boot(一)--U-Boot详解+自定义命令实战 2015-02-07 一.Bootloader ????简单地说:Bootloader主要功能就是 在系统上电时开始执行,初始化硬件和设备,准备好软件环境,最后调用操作系统. ????具体的包含:关闭你看门狗WATCHDOG,改变系统时钟,初始化存储控制器 ,将操作系统内核代码复制到内存中去运行. ????为了开发方便,可以增加网络功能,从PC上通过串口或者网络下载文件,烧写文件,将flash上的内核代码解压后运行等. Boo

Linux下DNS服务器搭建详解

 Linux下DNS服务器搭建详解 DNS  即Domain Name System(域名系统)的缩写,它是一种将ip地址转换成对应的主机名或将主机名转换成与之相对应ip地址的一种机制.其中通过域名解析出ip地址的叫做正向解析,通过ip地址解析出域名的叫做反向解析. 下面对DNS的工作流程及原理进行简要说明 DNS的查询流程:需要解析服务的Client先查看本机的/etc/hosts:若无结果,则client查看本地的DNS缓存服务器:若无结果,则查找所属域的首选DNS服务器:若此时本地首选DN

LINux网络的NAPI机制详解一

在查看NAPI机制的时候发现一篇介绍NAPI引入初衷的文章写的很好,通俗易懂,就想要分享下,重要的是博主还做了可以在他基础上任意修改,而并不用注明出处的声明,着实令我敬佩,不过还是附上原文链接! http://blog.csdn.net/dog250/article/details/5302853 处理外部事件是cpu必须要做的事,因为cpu和外设的不平等性导致外设的事件被cpu 当作是外部事件,其实它们是平等的,只不过冯氏机器不这么认为罢了,既然要处理外部事件,那么就需要一定的方法,方法不止一

Linux基础知识之挂载详解(mount,umount及开机自动挂载)

Linux基础知识之挂载详解(mount,umount及开机自动挂载) 转载自:http://www.linuxidc.com/Linux/2016-08/134666.htm 挂载概念简述: 根文件系统之外的其他文件要想能够被访问,都必须通过"关联"至根文件系统上的某个目录来实现,此关联操作即为"挂载",此目录即为"挂载点",解除此关联关系的过程称之为"卸载" 1.挂载:根文件系统外通过关联至根文件系统上的某个目录来实现访问

Linux 系统下 ifconfig 命令详解

Linux系统下网卡网络配置详解 Ifconfig命令使LINUX核心知道软件回送和网卡这样一些网络接口,这样Linux就可以使用它们. 除了上面介绍的这些用法之外,ifconfig命令用来监控和改变网络接口的状态,并且还可以带上很多命令行参数.下面是一个ifconfig的通用调用语法: #ifconfig interface [[-net -host] address [parameters]] 其中interface是网络接口名:address是分配给指定接口的主机名或IP地址.这里使用的主

关于Linux的字符测试的详解和相关bash脚本的练习

关于Linux的字符测试的详解和相关bash脚本的练习 一.字符测试选项         == : 测试两个字符串是否相等,相等为真,不等为假.         != : 测试两个字符串是否不等,不等为真,相等为假.         -n string : 测试指定的字符串是否为空,空为真,不空为假.         -z string :测试指定的字符串是否为不空,不空为真,空为假. 二. 完成下面的bash脚本练习         练习:写一个脚本 传递一个参数(单字符就行)给脚本,如参数为