Linux双网卡绑定Bond技术小结
2024-11-03 15:00:55 阿炯

本站赞助商链接,请多关照。 在Linux下有时候需要给一个网卡绑定多个IP和多个网卡绑定一个IP,本文介绍在RPM系列(redhat,Fedora Core,Centos)中的实现方法和一种在Gentoo等其他Linux中普遍适用的方法。

1、单网卡绑定多IP在RedHat系列中的实现方法
假设需要绑定多IP的网卡是eth0,请在/etc/sysconfig/network-scripts目录里面创建一个名为ifcfg-eth0:0的文件,内容样例为:
DEVICE="eth0:0"
IPADDR="192.168.0.2"
BROADCAST="172.168.0.255"
NETMASK="255.255.255.0"
ONBOOT="yes"

其中的DEVICE为设备的名称,IPADDR为此设备的IP地址,BROADCAST是广播地址,NETMASK为子网掩码,ONBOOT 表示在系统启动时自动启动。假如需要再绑定多一个IP地址,只需要把文件名和文件内的DEVICE中的eth0:x加一即可。linux最多可以支持255个IP别名。

2、普遍适用的单网卡绑定多IP实现方法
ifconfig eth0:1 192.168.0.3 broadcast 192.168.0.255 netmask 255.255.255.0

可以把上述命令加在启动自运行文件里面,在Gentoo下是/etc/conf.d/local.start,而某些版本的Linux是/etc/rc.d/rc.local。

3、多网卡共用单IP的实现方法
使用多块网卡虚拟成为一块网卡,具有相同的IP地址。这项技术其实在sun和cisco中已经存在,分别称为Trunking和 etherchannel技术,在linux中这种技术称为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或者/etc/conf.d/local.start调用,以便一开机就生效。

关键参数:

miimon=100:链路监测间隔(毫秒)
lacp_rate=fast:快速 LACP 协商
xmit_hash_policy=layer3+4:负载均衡算法(推荐)

bonding对于服务器来是个比较好的选择,在没有千兆网卡时,用两三块100兆网卡作 bonding,可大大提高服务器到交换机之间的带宽。但是需要在交换机上设置连接bonding 网卡的两个口子映射为同一个虚拟接口。

双网卡bonding举例

所谓bonding,就是将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。当然,直接给两块网卡设置同一IP地址是不可能的。通过bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址。Kernels 2.4.12及以后的版本均提供bonding模块,以前的版本可以通过patch实现。

1、确认目前使用的网卡,检查/etc/sysconfig/network-scripts目录下以ifcfg-开头的文件,应该为eth0, eth1...

2、配置虚拟网卡bond0
可以使用DHCP,也可以配置static IP,最好通过vi编辑配置文件
# cd /etc/sysconfig/network-scripts
# cat ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
NETWORK=192.168.0.0
NETMASK=255.255.255.0
IPADDR=192.168.0.10
USERCTL=no
GATEWAY=192.168.0.254
TYPE=Ethernet

3、修改eth0, eth1配置文件
# ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=yes

# ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=yes

4、将新添加的bond0设备加入modprobe.conf中,以便kernel识别。加入设置参数,miimon值表示两块网卡相互监测的时间,以ms为单位。mode值为工作模式,可设置为高可用还是负载均衡,0为高可用(默认值),1为负载均衡,另外还有一种XOR模式。
alias bond0 bonding
options bond0 miimon=100 mode=1

关于Linux使用bonding的详细信息可以参考官方文档

双网卡绑定技术实现负载均衡和失效保护

网卡(NIC)绑定技术有助于保证高可用性特性并提供其它优势以提高网络性能。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驱动程序处理。

其实配置很简单,一共四个步骤:
绑定的前提条件:芯片组型号相同,而且网卡应该具备自己独立的BIOS芯片;先编辑虚拟网络接口配置文件指定网卡IP
# vi /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
IPADDR=172.31.0.13
NETMASK=255.255.252.0
BROADCAST=172.31.3.254
ONBOOT=yes
TYPE=Ethernet

这里要主意,不要指定单个网卡的IP 地址、子网掩码或网卡 ID。将上述信息指定到虚拟适配器(bonding)中即可。

# cat ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp

# cat ifcfg-eth1
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp

编辑 /etc/modules.conf 文件,加入如下一行内容,以使系统在启动时加载bonding模块,对外虚拟网络接口设备为 bond0
加入下列两行
alias bond0 bonding
options bond0 miimon=100 mode=1

说明:miimon是用来进行链路监测的,单位为毫秒。 比如:miimon=100,那么系统每100ms监测一次链路连接状态,如果有一条线路不通就转入另一条线路;mode的值表示工作模式,他共有0,1,2,3四种模式,常用的为0,1两种。
 
mode=0表示load balancing (round-robin)为负载均衡方式,两块网卡都工作。
mode=1表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式;也就是说默认情况下只有一块网卡工作,另一块做备份。
bonding只能提供链路监测,即从主机到交换机的链路是否接通。如果只是交换机对外的链路down掉了,而交换机本身并没有故障,那么bonding会认为链路没有问题而继续使用。

然后在/etc/rc.d/rc.local 加入两行 :
ifenslave bond0 eth0 eth1
route add -net 172.31.3.254 netmask 255.255.255.0 bond0

到这时已经配置完毕重新启动机器,重启会看见以下信息就表示配置成功了。
................
Bringing up interface bond0 OK
Bringing up interface eth0 OK
Bringing up interface eth1 OK
................

下面讨论以下mode分别为0,1时的情况
mode=1工作在主备模式下,这时eth1作为备份网卡是no arp的

通过ifconfig 验证网卡的配置信息

那也就是说在主备模式下,当一个网络接口失效时(例如主交换机掉电等),不回出现网络中断,系统会按照/etc/rc.d/rc.local里指定网卡的顺序工作,机器仍能对外服务,起到了失效保护的功能。

在mode=0 负载均衡工作模式,它能提供两倍的带宽,通过指令来看一下网卡的配置信息。在这种情况下出现一块网卡失效,仅仅会是服务器出口带宽下降,也不会影响网络使用。
通过查看bond0的工作状态查询能详细的掌握bonding的工作状态
# cat /proc/net/bonding/bond0
bonding.c:v2.4.1 (September 15, 2003)
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0
Multicast Mode: all slaves
Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0e:7f:25:d9:8a
Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0e:7f:25:d9:8b

Linux下通过网卡邦定技术既增加了服务器的可靠性,又增加了可用网络带宽,为用户提供不间断的关键服务。用以上方法均在redhat的多个版本测试成功,而且效果良好。

参考文档:/usr/share/doc/kernel-doc-2.4.21/networking/bonding.txt

双网卡绑定bond技术总结(常用模式、是否需要配置交换机)以及主流交换机设备厂商对链路聚合的支持

1.绑定模式总结表
模式 模式名称 模式英文 工作线路 交换机是否配置
0 轮询调度算法(Round-robin) balance-rr 所有线路均参与数据传输,按顺序依次发送
1 主备模式(Active-backup) active-backup 只有一条线路处理数据,其他线路作为备份
2 异或策略(XOR策略) balance-xor 根据MAC地址异或运算结果选择传输线路
3 广播模式(Broadcast) broadcast 所有线路均传输所有数据
4 动态链路聚合(LACP) 802.3ad 创建一个聚合组,共享相同的传输速度,推荐使用 是(需要交换机支持802.3ad模式)
5 适配器传输负载均衡 balance-tlb 由负载最轻的网口发送,当前使用的网口接收
6 适配器负载均衡(Adaptive load balancing) balance-alb 用负载最轻的网口进行发送和接收


为方便阅读,将上表转换成图表:


上表中模式补充说明如下:
1)在轮询调度算法(模式0)中,数据包会依次通过不同的物理网卡发送,以实现负载均衡。然而,由于数据包可能通过不同的路径到达目标,因此需要在交换机上配置trunking,以确保数据包能够正确到达。

2)在主备模式(模式1)中,只有一张网卡处于活动状态,另一张网卡作为备份。当活动网卡出现故障时,备份网卡会接管数据传输。这种模式不需要交换机进行特殊配置。

3)异或策略(模式2)和广播模式(模式3)同样需要在交换机上配置trunking,以支持多个物理网卡之间的数据传输。

4)动态链路聚合(模式4)需要交换机支持802.3ad标准,并创建聚合组来共享传输速度。这种模式提供了更高的带宽和可靠性。

5)适配器传输负载均衡(模式5)和适配器负载均衡(模式6)不需要交换机进行特殊配置,因为它们可以根据网卡的负载情况自动选择传输路径。

2. 4种常用的绑定模式

在Linux服务器中,网卡绑定的七种模式各有其特点和适用场景,以下是四种比较常用的配置模式:
模式 模式名称 特点 适用场景
0 balance-rr 链路负载均衡,增加带宽,支持容错,传输数据包顺序是依次传输 适用于不需要高可用性的场景,但需要交换机支持EtherChannel
1 active-backup 主备模式,只有一个网卡是active,另一块是备用的standby,所有流量都在active链路上处理 适用于对高可用性要求较高的场景,资源利用率较低
4 802.3ad 基于标准的链路聚合协议,支持负载均衡和故障转移 适用于需要负载均衡和高可用性的场景,需要交换机同时支持EtherChannel和LACP
6 balance-alb 在balance-tlb基础上增加了接收负载均衡(RLB),不需要任何交换机支持 适用于需要负载均衡和高可用性的场景,且不需要交换机配置支持




3.不同厂商对线路捆绑技术的叫法

华为、H3C、锐捷、思科等厂商对交换机链路聚合或链路捆绑的叫法各有所不同,但功能上是相似的。以下是对这些厂商的叫法的总结:
厂商 链路捆绑的叫法
华为 Eth-Trunk(链路聚合技术)
H3C Link Aggregation(链路聚合)
锐捷 Port Aggregation(端口聚合)或Aggregate Port(AP,聚合端口)
思科 EtherChannel


4.什么是EtherChannel

最后补充一个知识点,有关EtherChannel。

EtherChannel(以太通道)是由Cisco公司开发的一种应用于交换机之间的多链路捆绑技术。它的基本原理是将两台设备间多条以太网链路捆绑在一起组成一条逻辑链路,形成一个端口通道(PortChannel),从而达到带宽倍增的目的。

4.1.EtherChannel的基本概念

技术背景:EtherChannel技术解决了在两台交换机之间连接多条线路时,由于STP(生成树协议)的原因,最终会阻断其它多余的线路而只留下一条活动链路来转发数据的问题。EtherChannel使得多条线路能够同时提供数据转发,从而增加带宽。

工作原理:将交换机上的多条线路捆绑成一个组,组中活动的物理链路同时提供数据转发。当组中有物理链路断掉后,流量将被转移到剩下的活动链路中去,只要组中还有活动链路,用户的流量就不会中断。

4.2.交换机对EtherChannel的支持

硬件支持:交换机需要具备足够的端口数量和性能,以支持EtherChannel的创建和运行。

软件支持:交换机需要运行支持EtherChannel的操作系统或软件版本。这通常包括必要的协议和配置命令,以允许交换机识别、协商和建立EtherChannel。

配置要求:在配置EtherChannel时,同一组中的全部端口的配置(如Trunk封装、速率和双工模式等)必须相同。因此,交换机需要支持这些配置选项,并允许在EtherChannel组中进行一致的配置。

4.3.EtherChannel的优点

增加带宽:通过捆绑多条物理链路,EtherChannel可以显著增加带宽,满足高流量需求。

负载均衡:EtherChannel可以在多条链路上均衡分配流量,实现负载均衡,优化网络性能。

冗余保护:当一条或多条链路故障时,流量将自动转移到其他链路上,保证网络的稳定性和可靠性。

4.4.怎么查询交换机是否支持EtherChannel

官方文档:访问交换机制造商的官方网站,查找该型号交换机的官方文档或规格说明。这些文档通常会列出交换机的所有功能和特性,包括是否支持EtherChannel。

使用命令行接口(CLI)查询:对于Cisco交换机,可以使用以下命令来检查EtherChannel支持:
show running-config:查看当前运行的配置,查找是否有与EtherChannel相关的配置命令。

show etherchannel summary:显示EtherChannel的摘要信息,包括当前配置的EtherChannel数量和状态。

show interface port-channel:显示特定EtherChannel接口的状态和配置。

4.5.交换机支持EtherChannel的应用场景

企业网络:在企业网络中,EtherChannel可以用于连接核心交换机和汇聚交换机,以提供高速、可靠的网络连接。

数据中心:在数据中心环境中,EtherChannel可以用于连接服务器和交换机,以满足高带宽、低延迟的网络需求。

服务提供商网络:在服务提供商网络中,EtherChannel可以用于提供高速、可靠的网络连接,以满足客户对高质量网络服务的需求。

5. Linux下获取网卡速率的方法

查看本机所有的网卡基本信息:ip link show

1、ethtool工具
ethtool <interface> | grep -i speed

>Speed: 1000Mb/s

2、在虚拟目录/sys中获取
/sys/class/net/<interface>/speed

>1000

3、在dmesg中查找网上信息
dmesg | grep <interface>

4、mii-tool工具
mii-tool <interface>

>eth0: no autonegotiation, 1000baseT-FD flow-control, link ok

5、nmcli
nmcli -f CAPABILITIES.SPEED dev show <interface>

>CAPABILITIES.SPEED:    1000 Mb/s

6、networkctl
networkctl status <interface> | grep Speed

networkctl在较新的操作系统上才能使用,能获取的信息与ethtool相当。

另外一些网络测试工具如 iperf 也能反映出网卡的速率。

Debian v10下双网卡绑定实施方案一则

对debian v10 x64的ens3f0与ens3f1做网卡绑定。先查看网口名称和运行的网络服务:
ip a
systemctl status NetworkManager
systemctl status networking

NetworkManager没有安装,所以无法使用nmtui和nmcli命令来配置。有2个网口ens3f0和ens3f1,networking在运行,可修改配置文件/etc/network/interfaces来实现。

查看配置文件现有内容
在需要配置的网卡上是否有配置IP地址
检查绑定必要软件是否安装
dkpg -l | grep ifen | ifup
 
需要装了ifupdown、ifenslave。

手动加载bonding模块并设置开机自动加载bonding模块
echo bonding >>/etc/modules
modprobe bonding

bond-mode 要根据实际的需求来选择绑定的模式,部分需要与交换机配合才能生效。

root@debian: /etc/network# cat interfaces
auto lo
iface lo inet loopback

root@debian: /etc/network# cat interfaces.d/bond0
#绑定接口配置
auto bond0
iface bond0 inet static
address 10.69.x.m
netmask 255.255.255.0
gateway 10.69.x.1
bond-mode balance-rr
bond-slaves ens3f0 ens3f1
bond-miimon 100
bond-downdelay 200
bond-updelay 200

# cat inter faces.d/ens3f0
auto ens3f0
iface ens3f0 inet manual
bond-master bond0

# cat interfaces.d/ens3f1
auto ens3f1
iface ens3f1 inet manual
bond-master bond0

检重启网络服务生效并查看确认是否达到预期
systemctl restart networking
ip a
ip route show

确认bond已生成,IP地址和路由信息已经达到预期。查看确认是bond模式是否达到预期:
cat /proc/net/bonding/bond0

Bnoning Mode显示为round-robin即轮训模式,符合预期。ens3f1未插网线,所以显示为Unknow属于正常现象。

除/etc/network/interfaces.d/目录下的三个文件,恢复/etc/network/interfaces配置文件内容,重启networking服务生效。

另说Bridge、VLAN、Team高级接口配置

在此简介一些高级网络接口技术概述与生产选型,与上面的内容相互补充。
Bonding:将多张物理网卡聚合为逻辑接口,提供高带宽 + 冗余。
Bridge:创建二层交换机功能,常用于虚拟机上网。
VLAN:802.1Q 协议,在一条物理链路上划分多个逻辑网络。
Team:红帽公司推出的新一代聚合方案,比 Bonding 更灵活,支持更多 runner。

生产选型建议:
传统服务器 / 需要兼容老系统 → Bonding
RHEL 8/9 新环境 → Team(推荐)
虚拟化 / 容器主机 → Bonding + Bridge + VLAN 组合
10G/25G/40G 以上 → 优先 LACP(Mode 4 / team runner lacp)

1、Bonding 聚合配置

方式1:nmcli(RHEL/CentOS/Rocky 推荐)

# 1. 创建 bond 接口
nmcli connection add type bond con-name bond0 ifname bond0 \
  bond.options "mode=802.3ad,miimon=100,lacp_rate=fast,xmit_hash_policy=layer3+4"

# 2. 添加从网卡
nmcli connection add type ethernet con-name bond0-slave1 ifname ens160 master bond0
nmcli connection add type ethernet con-name bond0-slave2 ifname ens161 master bond0

# 3. 配置IP
nmcli connection modify bond0 ipv4.method manual \
  ipv4.addresses 10.0.8.55/24 ipv4.gateway 10.0.8.1 \
  ipv4.dns "8.8.8.8"

nmcli connection up bond0

方式2:传统配置文件(兼容所有系统)
/etc/modprobe.d/bonding.conf:

alias bond0 bonding
options bond0 mode=4 miimon=100
/etc/sysconfig/network-scripts/ifcfg-bond0:

DEVICE=bond0
TYPE=Bond
BONDING_MASTER=yes
BONDING_OPTS="mode=4 miimon=100 lacp_rate=fast xmit_hash_policy=layer3+4"
BOOTPROTO=none
IPADDR=10.0.8.50
PREFIX=24
GATEWAY=10.0.8.1
ONBOOT=yes

2、Bridge 网桥配置

生产最常用场景:KVM 虚拟机、Docker macvlan、OpenStack 等。

nmcli 创建 Bridge:
nmcli connection add type bridge con-name br0 ifname br0
nmcli connection add type ethernet con-name br0-slave ifname ens160 master br0
nmcli connection modify br0 ipv4.method manual ipv4.addresses 10.0.10.10/24
nmcli connection up br0

给虚拟机挂载:
virsh attach-interface --domain vm01 --type bridge --source br0 --model virtio --config

Docker 使用 Bridge:
docker network create -d bridge mynet

3、VLAN 子接口与 Trunk 配置

创建 VLAN 子接口:
# nmcli 方式
nmcli connection add type vlan con-name ens160.10 ifname ens160.10 dev ens160 id 10 \
  ipv4.method manual ipv4.addresses 10.0.10.10/24

# ip 命令临时创建
ip link add link bond0 name bond0.20 type vlan id 20
ip addr add 10.0.20.10/24 dev bond0.20
ip link set bond0.20 up

Trunk 模式(交换机侧):交换机端口配置为 Trunk,允许 VLAN 10,20,30 通过。

4、Bonding + Bridge + VLAN 组合架构(综合生产配置)

推荐生产拓扑:
物理网卡 ens160 + ens161 → Bond0(LACP) → Br0(网桥) → VLAN 子接口(br0.10、br0.20)

完整配置脚本:

#!/bin/bash
# bonding-bridge-vlan.sh

# 创建 Bond
nmcli con add type bond con-name bond0 ifname bond0 bond.options "mode=802.3ad,miimon=100"
nmcli con add type ethernet ifname ens160 master bond0 con-name bond0-slave1
nmcli con add type ethernet ifname ens161 master bond0 con-name bond0-slave2

# 创建 Bridge
nmcli con add type bridge con-name br0 ifname br0
nmcli con add type ethernet ifname bond0 master br0 con-name br0-slave

# 创建 VLAN
nmcli con add type vlan con-name br0.10 ifname br0.10 dev br0 id 10 ipv4.method manual ipv4.addresses 10.0.10.10/24
nmcli con add type vlan con-name br0.20 ifname br0.20 dev br0 id 20 ipv4.method manual ipv4.addresses 10.0.20.10/24

nmcli con up bond0 br0 br0.10 br0.20

5、Team 接口(新方案)

Team 优势:热插拔、更多 runner、D-Bus 支持更好。

nmcli connection add type team con-name team0 ifname team0 \
  team.config '{"runner": {"name": "lacp"}, "link_watch": {"name": "ethtool"}}'

nmcli connection add type ethernet ifname ens160 master team0 con-name team0-slave1
runner 类型:lacp、loadbalance、roundrobin、activebackup 等。

故障排查与监控

常见故障:
Bond 状态 DOWN → cat /proc/net/bonding/bond0
LACP 未协商 → cat /sys/class/net/bond0/bonding/ad_num_ports
VLAN 不通 → ip -d link show bond0.10
Bridge 环路 → 开启 STP:nmcli con mod br0 bridge.stp yes

监控命令:
cat /proc/net/bonding/bond0
ethtool bond0
ip -d link show | grep -E 'bond|bridge|vlan'
watch -n 1 "cat /proc/net/bonding/bond0 | grep -E 'MII|Active'"