如何在Linux中启用和配置网络绑定(Network Bond)

网络绑定(Network Bond)是一种用于将多个网络接口组合成单个虚拟接口的方法,通常用于提供冗余、提高网络吞吐量。本文介绍如何在Linux系统中启用和配置网络绑定。

1先决条件

在配置网络绑定之前,需要确保:

  • Linux系统有多个网口(如eth0、eth1)。
  • 具有管理员(root)权限来配置网络设置。
  • 系统中已存在bonding内核模块。

2了解绑定模式(Bonding mode)

Linux 支持多种绑定模式,每种模式在冗余、负载均衡或容错方面提供不同的行为。以下是最常见的几种模式:

模式编号模式名称描述适用场景
Mode 0balance-rr轮询负载均衡,数据包依次从每个从属设备发送,接收方向使用所有从属设备。高吞吐量场景,要求交换机支持。
Mode 1active-backup主备模式,只有一个从属设备处于活动状态,其他设备作为备份。高可用性场景,如金融交易系统。
Mode 2balance-xor基于 XOR 的负载均衡,根据源/目的MAC地址或 IP 地址哈希分配流量。负载均衡场景,需要交换机支持。
Mode 3broadcast广播模式,所有数据包通过所有从属设备发送,接收路径由上层决定。特殊场景,如网络监控、广播应用。
Mode 4802.3ad (LACP)动态链路聚合,需要交换机支持LACP协议,支持负载均衡和故障转移。高性能场景,如数据中心、文件服务器。
Mode 5balance-tlb适配器传输负载均衡,根据当前负载动态调整发送流量分配,接收方向由 ARP 响应负载均衡决定。单向负载均衡场景,无需交换机支持。
Mode 6balance-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
网卡1ens33
网卡2ens38
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
NetworkManagersystemctl 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