Linux网卡Bond设置方式

 更新时间:2026年01月27日 10:31:26   作者:杨了个杨8982  
网卡Bond技术通过将多个物理网络接口组合成一个逻辑接口,实现网络带宽的增加、可靠性提升和负载均衡,支持多种模式,如轮询模式、主备模式等,并提供了基于配置文件、nmcli命令和脚本三种配置方法

一、网卡Bond介绍

1.概念

网卡 Bond 是一种网络技术,也被称为链路聚合、端口绑定或接口绑定,能将多个物理网络接口组合成一个逻辑接口。

2.工作原理及作用

bond模式增加网络带宽提高网络可靠性实现负载均衡适用场景备注
Mode 0 : Balance-RR(轮询模式)

原理:依次将数据包按顺序分配到各个成员接口发送。例如有三个成员接口,第一个数据包从接口 1 发送,第二个从接口 2 发送,第三个从接口 3 发送,之后循环。


效果:能充分利用所有成员接口的带宽,将多个接口的带宽叠加,从而增加整体网络带宽。

原理:按顺序依次在成员接口上发送数据包,均匀分配流量。


效果:将网络流量平均分配到各个成员接口,实现负载均衡。

适用于需要高带宽且对数据包顺序要求不高的环境,例如数据中心内部服务器之间的高速数据传输。需要交换机设置
Mode 1 : Active-Backup(主备模式)

原理:设置一个主接口和多个备用接口,正常情况下只有主接口工作,当主接口出现故障时,自动切换到备用接口中的一个继续工作。


效果:提供了接口级别的冗余,当某个接口出现硬件故障、链路中断等问题时,能迅速切换到备用接口,保障网络连接的可靠性。

适用于对网络可靠性要求较高,但对带宽需求相对稳定的场景,像关键业务服务器的网络连接。
Mode 2 : Balance-XOR(基于异或的负载均衡)

原理:根据数据包的源 MAC 地址、目标 MAC 地址或 IP 地址等信息通过异或算法计算,根据结果选择成员接口发送。


效果:在一定程度上实现负载均衡,让多个接口共同传输数据,增加网络带宽,且能保证同一数据流的数据包从同一接口发送,避免乱序。

原理:依据数据包的相关地址信息计算结果选择接口发送,一定程度上分散流量。


效果:实现了一定的负载均衡,避免单个接口流量过大。

适用于对数据包顺序有要求且需要一定负载均衡的场景,如视频流传输。需要交换机设置
Mode 3 : Broadcast(广播模式)这种模式使用较少,主要用于一些特殊的测试环境或对网络可靠性要求极高但对带宽利用效率不敏感的场景。需要交换机设置
Mode 4 : 802.3ad(动态链路聚合)

原理:需交换机支持 802.3ad 协议,通过链路聚合控制协议(LACP)与交换机协商,动态将流量分配到成员接口。


效果:可动态实现负载均衡,根据各接口带宽使用情况自动调整流量分配,充分利用所有成员接口带宽,显著增加网络带宽。

原理:通过 LACP 协议与交换机协商,当某个成员接口出现故障时,协议能自动检测到并将流量重新分配到其他正常的接口上。


效果:具备很好的容错能力,提高了网络的可靠性,即使部分接口出现问题,也能保证网络的正常通信。

原理:通过 LACP 协议与交换机动态协商,根据接口状态和带宽使用情况分配流量。


效果:动态地将流量合理分配到各个成员接口,实现高效的负载均衡。

适用于需要高带宽和高可靠性的企业网络环境,如数据中心的核心交换机与服务器之间的连接。需要交换机设置
Mode 5 : Balance-TLB(传输负载均衡)

原理:无需交换机特殊支持,根据成员接口当前负载动态分配发送流量,接收流量由单个接口完成。


效果:有效利用各成员接口带宽进行数据发送,在发送方向增加网络带宽。

原理:根据成员接口当前负载动态分配发送流量。


效果:在数据发送方向实现负载均衡,提高接口利用率。

适用于发送流量较大,但接收流量相对稳定的场景,如文件服务器。
Mode 6 : Balance-ALB(自适应负载均衡)

原理:是 balance - tlb 的增强版,不仅能动态分配发送流量,还能通过 ARP 协商动态分配接收流量。


效果:在发送和接收方向都实现负载均衡,充分利用所有成员接口带宽,最大程度增加网络带宽。

原理:在流量分配过程中,当某个成员接口故障时,能自动将流量转移到其他正常接口。


效果:在实现负载均衡的同时,提高了网络的可靠性,确保网络通信的稳定性。

原理:在发送和接收方向都能根据接口情况和 ARP 协商动态分配流量。


效果:全面实现负载均衡,优化网络性能。

适用于对网络带宽和性能要求极高的场景,如云计算数据中心。

常用的有三种:
mode=0:平衡负载模式,有自动备援,但需要”Switch”支援及设定。
mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援。
mode=6:平衡负载模式,有自动备援。

二、网卡Bond设置

方法一:基于配置文件配置(Bond=0)

1.查看可用网卡:使用ifconfig -a或ip addr show命令查看系统中的可用网卡,确定要绑定的物理网卡,如eth0、eth1。

2.创建或编辑物理网卡配置文件:在/etc/sysconfig/network-scripts/目录下,编辑要绑定的物理网卡的配置文件。例如,对于eth0和eth1,打开对应的ifcfg-eth0和ifcfg-eth1文件。在文件中添加或修改以下内容:

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

3.创建或编辑 Bond 接口配置文件:在同一目录下创建或编辑ifcfg-bond0文件,内容如下:

TYPE=Ethernet
DEVICE=bond0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
BONDING_OPTS="miimon=100 mode=0 fail_over_mac=1"

其中BONDING_OPTS中的miimon表示链路监测间隔,其值为 100 表示每 100 毫秒对网络链路的状态进行一次监测;mode指定 Bond 模式,mode=0 表示采用轮询模式;fail_over_mac用于设置故障切换时的 MAC 地址选项,fail_over_mac=1 表示在主备切换时,绑定设备的 MAC 地址会切换为当前活动接口的 MAC 地址。

4.重启服务器:使用reboot重启服务器使配置生效。

方法二:基于 nmcli 命令配置(Bond=1)(推荐)

1.查看可用网卡

使用nmcli device status命令查看系统中的可用网卡,确定要绑定到bond1的物理网卡,比如ens224和ens256。

2.创建 bond1 接口

执行以下命令创建名为bond1的 Bond 接口,并指定模式为balance-rr(轮询模式),你也可以根据需求将模式修改为其他模式,如active-backup等。

nmcli connection add type bond ifname bond1 mode balance-rr

备注:

# 创建bond0
nmcli connection add type bond ifname bond0 mode active-backup
# 创建bond1
nmcli connection add type bond ifname bond1 mode balance-rr
# 创建bond2
nmcli connection add type bond ifname bond2 mode balance-xor
# 创建bond3
nmcli connection add type bond ifname bond3 mode broadcast
# 创建bond4
nmcli connection add type bond ifname bond4 mode 802.3ad
# 创建bond5
nmcli connection add type bond ifname bond5 mode balance-tlb
# 创建bond6
nmcli connection add type bond ifname bond6 mode balance-alb

3.配置 bond1 的 IP 等信息

若要设置静态 IP 地址,可使用以下命令。假设要设置 IP 地址为192.168.10.81,子网掩码为255.255.255.0,网关为192.168.10.251

nmcli connection modify bond-bond1 ipv4.addresses 192.168.10.81/24 ipv4.gateway 192.168.10.251 ipv4.method manual

若要使用 DHCP 获取 IP 地址,则执行:

nmcli connection modify bond-bond1 ipv4.method auto

4.添加物理网卡到 bond1

将ens224和ens256添加到bond1,执行以下命令:

nmcli connection add type bond-slave ifname ens224 master bond-bond1
nmcli connection add type bond-slave ifname ens256 master bond-bond1

5.启用 bond1 及相关连接

nmcli connection reload
nmcli connection up bond-bond1
reboot

6.查看 bond1 配置及状态

使用nmcli connection show bond-bond1命令查看bond1的详细配置信息,使用nmcli device status命令查看设备状态,确保bond1及相关物理网卡已正确配置和启用。配置完成后,还可以使用ping命令等测试网络连接是否正常。

使用cat /proc/net/bonding/bond1查看bond1的状态,确认是否配置成功。

方法三:使用脚本

#!/usr/bin/env bash
set -euo pipefail

need_cmd() { command -v "$1" >/dev/null 2>&1 || { echo "缺少命令: $1"; exit 1; }; }
need_cmd nmcli
need_cmd ip

echo "===  Bond 自动化配置脚本 ==="

# 读取可用物理网卡(排除 lo、bond、vlan、bridge、tun、docker 等)
mapfile -t IFACES < <(
  nmcli -t -f DEVICE,TYPE device status |
  awk -F: '
    $2=="ethernet" || $2=="infiniband" {
      dev=$1;
      if (dev!="lo" && dev!~/(^bond|^br|^virbr|^docker|^veth|^tun|^tap|^wg|^sit|^gre|^vlan)/) print dev
    }'
)

if (( ${#IFACES[@]} < 2 )); then
  echo "可用物理网卡少于 2 块,无法创建 bond。"
  nmcli device status
  exit 1
fi

echo
echo "发现可用网卡:"
for i in "${!IFACES[@]}"; do
  dev="${IFACES[$i]}"
  state="$(nmcli -t -f DEVICE,STATE device status | awk -F: -v d="$dev" '$1==d{print $2}')"
  mac="$(nmcli -t -f GENERAL.HWADDR device show "$dev" 2>/dev/null | cut -d: -f2- || true)"
  ip4="$(ip -4 -o addr show "$dev" 2>/dev/null | awk '{print $4}' | head -n1 || true)"
  printf "  [%d] %-12s  state=%-12s  ip=%-18s  mac=%s\n" "$i" "$dev" "$state" "${ip4:-none}" "${mac:-unknown}"
done

echo
read -rp "请输入 bond 名称(默认 bond0): " BOND_NAME
BOND_NAME="${BOND_NAME:-bond0}"

echo
echo "请选择 bond mode:"
echo "  1) balance-rr   (轮询,需交换机支持/容忍乱序)"
echo "  2) active-backup(主备,最稳,无需交换机特殊配置)"
echo "  3) balance-xor  (基于 hash 分流,部分场景需配合交换机)"
echo "  4) broadcast"
echo "  5) 802.3ad      (LACP,推荐生产;交换机需做链路聚合)"
echo "  6) balance-tlb"
echo "  7) balance-alb"
read -rp "输入序号(默认 2): " MODE_NO
MODE_NO="${MODE_NO:-2}"

case "$MODE_NO" in
  1) BOND_MODE="balance-rr" ;;
  2) BOND_MODE="active-backup" ;;
  3) BOND_MODE="balance-xor" ;;
  4) BOND_MODE="broadcast" ;;
  5) BOND_MODE="802.3ad" ;;
  6) BOND_MODE="balance-tlb" ;;
  7) BOND_MODE="balance-alb" ;;
  *) echo "无效选择"; exit 1 ;;
esac

echo
read -rp "请输入 IPv4 地址(如 192.168.100.1): " IPADDR
read -rp "请输入 CIDR 前缀(如 24): " PREFIX
ADDR_CIDR="${IPADDR}/${PREFIX}"

read -rp "是否配置网关? (y/N): " GW_YN
GW_YN="${GW_YN:-N}"
GATEWAY=""
if [[ "$GW_YN" =~ ^[Yy]$ ]]; then
  read -rp "请输入网关(如 192.168.100.254): " GATEWAY
fi

read -rp "是否配置 DNS? (y/N): " DNS_YN
DNS_YN="${DNS_YN:-N}"
DNS_SERVERS=""
if [[ "$DNS_YN" =~ ^[Yy]$ ]]; then
  read -rp "请输入 DNS(可多个,用逗号分隔,如 223.5.5.5,8.8.8.8): " DNS_SERVERS
fi

echo
echo "请选择两块(或多块)网卡作为 slave(输入序号,用空格分隔,例如:0 1):"
read -rp "slave 序号: " -a IDX

if (( ${#IDX[@]} < 2 )); then
  echo "至少选择 2 块网卡。"
  exit 1
fi

SLAVES=()
for id in "${IDX[@]}"; do
  [[ "$id" =~ ^[0-9]+$ ]] || { echo "序号非法: $id"; exit 1; }
  (( id < ${#IFACES[@]} )) || { echo "越界序号: $id"; exit 1; }
  SLAVES+=("${IFACES[$id]}")
done

# 检查重复
uniq_count="$(printf "%s\n" "${SLAVES[@]}" | sort -u | wc -l)"
if (( uniq_count != ${#SLAVES[@]} )); then
  echo "检测到重复网卡选择,请重新运行脚本。"
  exit 1
fi

echo
echo "=== 你将创建如下配置 ==="
echo "bond:   $BOND_NAME"
echo "mode:   $BOND_MODE"
echo "addr:   $ADDR_CIDR"
echo "gw:     ${GATEWAY:-<none>}"
echo "dns:    ${DNS_SERVERS:-<none>}"
echo "slaves: ${SLAVES[*]}"
echo

read -rp "确认执行? (y/N): " OK
OK="${OK:-N}"
if [[ ! "$OK" =~ ^[Yy]$ ]]; then
  echo "已取消。"
  exit 0
fi

echo
echo ">>> 开始配置..."

# 如果已有同名连接,先提示并删除(更可控)
if nmcli -t -f NAME connection show | grep -qx "$BOND_NAME"; then
  echo "检测到已存在连接 $BOND_NAME,将删除后重建。"
  nmcli connection delete "$BOND_NAME" || true
fi

# 删除旧的 slave 连接(只删我们脚本命名过的)
for dev in "${SLAVES[@]}"; do
  nmcli -t -f NAME connection show | grep -E "^${BOND_NAME}-slave-${dev}$" | while IFS= read -r con; do
        nmcli connection delete "$con" || true
      done || true
done


# 创建 bond
nmcli connection add con-name "$BOND_NAME" type bond ifname "$BOND_NAME" mode "$BOND_MODE" >/dev/null

# 配置 IPv4
nmcli connection modify "$BOND_NAME" ipv4.method manual ipv4.addresses "$ADDR_CIDR"

if [[ -n "$GATEWAY" ]]; then
  nmcli connection modify "$BOND_NAME" ipv4.gateway "$GATEWAY"
else
  nmcli connection modify "$BOND_NAME" ipv4.gateway ""
fi

if [[ -n "$DNS_SERVERS" ]]; then
  # nmcli 支持用空格或逗号,统一转空格
  DNS_SERVERS="${DNS_SERVERS//,/ }"
  nmcli connection modify "$BOND_NAME" ipv4.dns "$DNS_SERVERS"
fi

# 建议:bond 承载主 IP,物理口不配 IP
for dev in "${SLAVES[@]}"; do
  slave_con="${BOND_NAME}-slave-${dev}"
  nmcli connection add type bond-slave con-name "$slave_con" ifname "$dev" master "$BOND_NAME" >/dev/null
done

# 启用连接(先 bond 再 slave)
nmcli connection up "$BOND_NAME" >/dev/null || true
for dev in "${SLAVES[@]}"; do
  nmcli connection up "${BOND_NAME}-slave-${dev}" >/dev/null || true
done

echo
echo ">>> 完成。当前设备状态:"
nmcli device status
echo
echo ">>> Bond 链路概览:"
ip -d link show "$BOND_NAME" || true
echo
echo ">>> IPv4 地址:"
ip -4 addr show "$BOND_NAME" || true

echo
echo "提示:如果你选的是 802.3ad (LACP),交换机侧必须配置对应端口的链路聚合(同一聚合组)。"

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Linux中rsync命令使用方式

    Linux中rsync命令使用方式

    rsync是一款高效的文件同步工具,支持增量同步、远程同步、文件压缩、权限保留等功能,它可以用于本地或远程文件夹的同步,支持断点续传和排除规则,在本地模式下,可以通过cp命令替代,实现数据的增量备份,在远程模式下
    2025-01-01
  • Centos 7下利用crontab定时执行任务详解

    Centos 7下利用crontab定时执行任务详解

    这篇文章主要给大家介绍了关于Centos 7下利用crontab定时执行任务的相关资料,文中对crontab进行了详细的介绍,并给出了一些实例代码供大家参考学习,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-06-06
  • Ubuntu cron日志开启与查看的实现步骤

    Ubuntu cron日志开启与查看的实现步骤

    这篇文章主要介绍了Ubuntu cron日志开启与查看的实现步骤的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
    2017-10-10
  • Linux服务器实现文件实时同步的方法详解

    Linux服务器实现文件实时同步的方法详解

    在做系统集群部署时,常常会涉及到两个或多个服务器之间文件同步,这篇文章主要来和大家介绍一下Linux服务器实现文件实时同步的方法,需要的可以参考下
    2024-03-03
  • Linux进程管理之创建、终止、回收与替换操作完全指南

    Linux进程管理之创建、终止、回收与替换操作完全指南

    进程是Linux系统的核心概念之一,理解进程的创建、终止、回收和替换是系统编程的基石,本文将系统性地介绍Linux进程管理的各个方面,有需要的小伙伴可以了解下
    2025-12-12
  • Linux下Matlab的安装全过程

    Linux下Matlab的安装全过程

    本文介绍了在Manjaro系统上安装MATLAB的步骤,包括从官网下载安装包、解压、运行安装程序、选择安装位置、选择组件、输入注册信息、同意许可协议、选择安装选项、使用凭证进行安装、开始安装、安装完成以及创建桌面快捷方式
    2025-11-11
  • Linux中的read命令使用之交互输入和脚本编写

    Linux中的read命令使用之交互输入和脚本编写

    这篇文章主要介绍了Linux中的read命令使用之交互输入和脚本编写,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 详解Linux指令文件覆盖和文件追加

    详解Linux指令文件覆盖和文件追加

    这篇文章主要介绍了Linux指令文件覆盖和文件追加,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 在Linux中部署并初始化MySQL的多种方式

    在Linux中部署并初始化MySQL的多种方式

    MySQL是常用的关系型数据库,被广泛用于学习与实际工作中,本篇文章介绍在Linux系统中使用多种方式部署并初始化MySQL数据库,包括源码安装、rpm安装以及yum安装,需要的朋友可以参考下
    2025-11-11
  • Linux中如何查看已挂载的文件系统类型详解

    Linux中如何查看已挂载的文件系统类型详解

    这篇文章主要给大家介绍了关于在Linux中如何查看已挂载的文件系统类型的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11

最新评论