网络绑定(Network Bond)是一种用于将多个网络接口组合成单个虚拟接口的方法,通常用于提供冗余、提高网络吞吐量。本文介绍如何在Linux系统中启用和配置网络绑定。
1先决条件
在配置网络绑定之前,需要确保:
- Linux系统有多个网口(如eth0、eth1)。
- 具有管理员(root)权限来配置网络设置。
- 系统中已存在bonding内核模块。
2了解绑定模式(Bonding mode)
Linux 支持多种绑定模式,每种模式在冗余、负载均衡或容错方面提供不同的行为。以下是最常见的几种模式:
| 模式编号 | 模式名称 | 描述 | 适用场景 |
| Mode 0 | balance-rr | 轮询负载均衡,数据包依次从每个从属设备发送,接收方向使用所有从属设备。 | 高吞吐量场景,要求交换机支持。 |
| Mode 1 | active-backup | 主备模式,只有一个从属设备处于活动状态,其他设备作为备份。 | 高可用性场景,如金融交易系统。 |
| Mode 2 | balance-xor | 基于 XOR 的负载均衡,根据源/目的MAC地址或 IP 地址哈希分配流量。 | 负载均衡场景,需要交换机支持。 |
| Mode 3 | broadcast | 广播模式,所有数据包通过所有从属设备发送,接收路径由上层决定。 | 特殊场景,如网络监控、广播应用。 |
| Mode 4 | 802.3ad (LACP) | 动态链路聚合,需要交换机支持LACP协议,支持负载均衡和故障转移。 | 高性能场景,如数据中心、文件服务器。 |
| Mode 5 | balance-tlb | 适配器传输负载均衡,根据当前负载动态调整发送流量分配,接收方向由 ARP 响应负载均衡决定。 | 单向负载均衡场景,无需交换机支持。 |
| Mode 6 | balance-alb | 适配器适应性负载均衡,支持接收和发送流量的动态负载均衡,接收方向通过ARP协商动态调整。 | 负载均衡场景,无需交换机支持。 |
生产环境推荐:
- mode 1:主备模式,不需要交换机配置链路聚合,适合服务器网卡冗余。
- mode 4:LACP 模式,需要交换机配置对应的链路聚合组,适合需要负载均衡的场景。
3检查bonding内核模块
检查系统是否支持 bonding 模块:modinfo bonding
正常情况下会显示filename、description等信息,如果提示modinfo: ERROR: Module bonding not found. 需要进一步检查内核模块包是否完整。
检查内核目录下是否存在 bonding 模块:find /lib/modules/$(uname -r) -name “bonding.ko*”
如果存在 bonding.ko 或 bonding.ko.xz,说明对应内核模块文件存在。
检查模块是否已加载:lsmod | grep bonding
正常加载时,类似如下:
bonding 152979 0
如未加载,可手动加载:
modprobe bonding
设置开机时自动加载:
echo “bonding” > /etc/modules-load.d/bonding.conf
systemctl restart systemd-modules-load
4配置Bond
示例说明:
将两块物理网卡 ens33、ens38 绑定为一块逻辑网卡 bond0,采用 mode 1(Active-Backup,主备模式),实现网卡冗余。具体配置环境如下:
| 项目 | 配置 |
| 操作系统 | RHEL 7.6 |
| 网卡1 | ens33 |
| 网卡2 | ens38 |
| Bond逻辑网卡 | bond0 |
| IP地址 | 192.168.195.99 |
| 子网掩码 | 255.255.255.0 |
| 默认网关 | 192.168.195.2 |
| Bondnig模式 | mode 1 |
本文使用 nmcli 配置网络绑定,也可使用网络配置文件进行配置(参见附录1)。
(1) 检查现有连接
nmcli con show
(2) 删除旧的 ens33、ens38 独立连接
nmcli con delete ens33
nmcli con delete ens38
(3) 创建 bond0
nmcli con add type bond con-name bond0 ifname bond0 mode active-backup
(4) 设置 Bond 参数
nmcli con modify bond0 bond.options \
“mode=active-backup,miimon=100,primary=ens33,primary_reselect=always”
(5) 设置 bond0 IP
nmcli con modify bond0 \
ipv4.method manual \
ipv4.addresses 192.168.195.99/24 \
ipv4.gateway 192.168.195.2
(6) 将 ens33 加入 bond0
nmcli con add type ethernet slave-type bond \
con-name bond0-slave-ens33 ifname ens33 master bond0
(7) 将 ens38 加入 bond0
nmcli con add type ethernet slave-type bond \
con-name bond0-slave-ens38 ifname ens38 master bond0
(8) 设置 Bond 自动启动
nmcli connection modify bond0 \
connection.autoconnect yes \
connection.autoconnect-slaves 1
设置两块物理网卡自动连接:
nmcli connection modify bond0-slave-ens33 connection.autoconnect yes
nmcli connection modify bond0-slave-ens38 connection.autoconnect yes
(9) 启动 Bond 网络
nmcli connection up bond0
查看连接状态:
nmcli connection show
nmcli device status
预期可以看到类似结果:
DEVICE TYPE STATE CONNECTION
bond0 bond connected bond0
ens33 ethernet connected bond0-slave-ens33
ens38 ethernet connected bond0-slave-ens38
5检查Bond配置是否成功
(1)查看 Bond 运行状态
cat /proc/net/bonding/bond0
重点关注以下内容:
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: ens33
Currently Active Slave: ens33
MII Status: up
MII Polling Interval (ms): 100
Slave Interface: ens33
MII Status: up
Slave Interface: ens38
MII Status: up
(2) 检查 IP 地址
ip addr show bond0
预期:inet 192.168.195.99/24
检查默认路由:
ip route
预期:default via 192.168.195.2 dev bond0
(3) 测试主备网卡切换
拔掉 ens33 对应的网线,再执行:cat /proc/net/bonding/bond0
预期:Currently Active Slave: ens38
此时通过备用网卡 ens38 继续提供网络通信。
重新插入 ens33 网线,等待链路恢复,再执行:cat /proc/net/bonding/bond0
由于配置了:
primary=ens33
primary_reselect=always
预期重新切换至 ens33。
注意:实际链路故障测试建议在具备本地控制台或带外管理的条件下进行。不要直接在唯一的远程 SSH 会话中修改或重启网络,否则可能导致连接中断。
6常用检查命令
| 检查项目 | 命令 |
| 网卡状态 | ip link show |
| Bond状态 | cat /proc/net/bonding/bond0 |
| 活动网卡 | cat /sys/class/net/bond0/bonding/active_slave |
| Bond模式 | cat /sys/class/net/bond0/bonding/mode |
| 网卡速率 | ethtool ens33 |
| 网卡错误 | ip -s link show ens33 |
| 网络路由 | ip route |
| 网络服务 | systemctl status network |
| NetworkManager | systemctl status NetworkManager |
附录1:使用网络配置文件配置网络绑定
(1)创建 bond0 配置文件
vi /etc/sysconfig/network-scripts/ifcfg-bond0
配置如下:
TYPE=Bond
DEVICE=bond0
NAME=bond0
BONDING_MASTER=yes
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.195.99
NETMASK=255.255.255.0
GATEWAY=192.168.195.2
BONDING_OPTS=”mode=1 miimon=100 primary=ens33 fail_over_mac=1″
特别说明:与真机环境有所不同,vmware虚拟机模拟环境下需要在bond0配置文件中增加一项参数配置:
BONDING_OPTS=“fail_over_mac=1”,不增加此参数,down掉ens33后,bond0网卡ping不通,无法实现网卡备份效果。使用 nmcli 配置网络绑定同样需要增加此参数配置。
(2)配置网卡ens33
vi /etc/sysconfig/network-scripts/ifcfg-ens33
配置如下:
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens33
NAME=ens33
ONBOOT=yes
MASTER=bond0
SLAVE=yes
(3)配置网卡ens38
vi /etc/sysconfig/network-scripts/ifcfg-ens38
配置如下:
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens38
NAME=ens38
ONBOOT=yes
MASTER=bond0
SLAVE=yes
(4)启动网卡绑定
ifdown ens33
ifdown ens38
ifup bond0
ifup ens33
ifup ens38
检查网络:
ip addr show bond0
ip route
附录2:使用 nmcli删除 Bond 配置
(1)查看当前 Bond 配置
nmcli connection show
预期结果:
NAME UUID TYPE DEVICE
bond0 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx bond bond0
bond0-slave-ens33 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ethernet ens33
bond0-slave-ens38 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ethernet ens38
(2)删除 Bond 配置
第一步:停止 Bond 连接
nmcli connection down bond0
第二步:删除两块物理网卡的从属连接
nmcli connection delete bond0-slave-ens33
nmcli connection delete bond0-slave-ens38
(3)恢复物理网卡独立使用
删除 Bond 后,如果希望 ens33、ens38 恢复为独立网卡,需要重新创建物理网卡连接。
例如,让 ens33 使用原来的 IP 地址:
nmcli connection add type ethernet \
con-name ens33 \
ifname ens33 \
ipv4.method manual \
ipv4.addresses 192.168.195.99/24 \
ipv4.gateway 192.168.195.2 \
connection.autoconnect yes
如果 ens38 只作为备用独立网卡,可以先配置为不分配 IP:
nmcli connection add type ethernet \
con-name ens38 \
ifname ens38 \
ipv4.method disabled \
ipv6.method ignore \
connection.autoconnect yes
注意:两块独立网卡不要同时配置相同 IP 地址。
(4)检查 Bond 是否删除成功
nmcli connection show
nmcli device status
ip addr
ip route
检查 Bond 设备是否还存在:
cat /proc/net/bonding/bond0
如果提示:No such file or directory
说明 Bond 内核设备已经不存在。
附录3:使用 nmcli 清空 ens33、ens38 两块物理网卡的原有网络配置
(1)查看 ens33、ens38 当前配置
nmcli connection show
nmcli device status
查看网卡 IP:
ip addr show ens33
ip addr show ens38
查看具体连接配置:
nmcli connection show ens33
nmcli connection show ens38
注意:连接名称不一定与网卡名称相同,需要根据 DEVICE 列确认对应关系。
(2)方法一:删除网卡原有连接配置(推荐)
# 删除 ens33 对应的连接配置
nmcli connection delete ens33
# 删除 ens38 对应的连接配置
nmcli connection delete ens38
如果连接名称不是 ens33、ens38,请替换成实际的连接名称。
删除后,原有连接配置中的 IP、网关、DNS 等信息也会被删除。
注意:此操作删除的是 NetworkManager 连接配置文件,不会删除物理网卡驱动或设备。
(3)方法二:保留连接,仅清空网络参数
如果希望保留原有连接名称,只清空网络参数,可以执行:
# 清空 ens33 IPv4 配置
nmcli connection modify ens33 \
ipv4.method disabled \
ipv4.addresses “” \
ipv4.gateway “” \
ipv4.dns “” \
ipv4.routes “”
# 清空 ens38 IPv4 配置
nmcli connection modify ens38 \
ipv4.method disabled \
ipv4.addresses “” \
ipv4.gateway “” \
ipv4.dns “” \
ipv4.routes “”
如果还需要清空 IPv6 配置:
nmcli connection modify ens33 ipv6.method ignore ipv6.addresses “” ipv6.gateway “” ipv6.dns “”
nmcli connection modify ens38 ipv6.method ignore ipv6.addresses “” ipv6.gateway “” ipv6.dns “”
(4)检查是否清空成功
nmcli connection show
nmcli device status
ip addr show ens33
ip addr show ens38