当前位置: 代码网 > 服务器>服务器>Linux > Linux网卡Bond设置方式

Linux网卡Bond设置方式

2026年01月27日 Linux 我要评论
一、网卡bond介绍1.概念网卡 bond 是一种网络技术,也被称为链路聚合、端口绑定或接口绑定,能将多个物理网络接口组合成一个逻辑接口。2.工作原理及作用bond模式增加网络带宽提高网络可靠性实现负

一、网卡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),交换机侧必须配置对应端口的链路聚合(同一聚合组)。"

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com