Linux操作系统-链路聚合(bond与team)

Linux 链路聚合实战:Bond 与 Team解析

引言

你有没有遇到过这样的场景:某天凌晨,一块网卡突然罢工,整个服务直接中断,半夜被报警电话吵醒。

在运维过程中,单点故障是我们不得不面对的问题。

其实,Linux 系统早就为我们准备好了"网卡抱团"的解决方案------链路聚合 。简单说,就是把服务器上多块物理网卡"捆绑"在一起,逻辑上变成一块网卡来用。好处显而易见:带宽叠加 (多块网卡并行传输)、故障冗余(一块坏了另一块顶上)。

在 Linux 的世界里,实现链路聚合主要有两大"门派":BondTeam。很多人刚接触时会懵:这俩到底有啥区别?我该选哪个?今天这篇文章,我们就来彻底搞懂它们。

一、链路聚合是什么?为什么需要它?

先打个比方:原来你的服务器只有一条"单车道"通往外部网络,车流(数据)一多就开始堵车或者"单车道"断了,服务器数据无法发出也无法接收数据。链路聚合就是把两条、四条甚至八条车道合并成一条"多车道高速路"。

链路聚合的核心价值体现在三个方面:

  1. 带宽聚合:将多网卡带宽叠加,突破单网卡性能瓶颈
  2. 冗余备份:当某条物理链路故障时,其他链路自动接管
  3. 故障转移:网络拥堵或硬件故障时,智能切换保证连续性

在 Linux 中,实现这一目标有两种主流技术:Bonding (老牌劲旅)和 Teaming(后起之秀)。

二、Bond:Linux 链路聚合的"老牌劲旅"

Bonding 是 Linux 内核自带的原生功能,历史悠久,非常稳定。它的核心是把多块网卡绑定成一个逻辑接口(如 bond0)。

2.1 Bond 的七种模式(Mode 0~6)

Bonding 最让人眼花缭乱但也最关键的是它的七种工作模式。模式选不对,效果可能适得其反。

模式 名称 核心特点 交换机要求 适用场景
mode 0 balance-rr(轮询) 数据包依次轮询分发到各网卡 必须配置链路聚合 需交换机配合,注意TCP乱序风险
mode 1 active-backup(主备) 仅1块网卡工作,故障时自动切换 特殊要求 最常用,追求高可用、对带宽不敏感
mode 2 balance-xor(异或) 基于MAC/IP哈希决定流量走哪条链路 需配置静态聚合 同一会话流量固定走一条链路,避免乱序
mode 3 broadcast(广播) 所有数据包复制到所有网卡发送 金融等高可靠性场景,但资源浪费严重
mode 4 802.3ad(LACP) IEEE 802.3ad 动态链路聚合 必须配置LACP 需交换机支持,实现智能负载均衡
mode 5 balance-tlb(适配器传输负载均衡) 发送流量根据当前负载分配 仅均衡发送流量,接收不均衡
mode 6 balance-alb(自适应负载均衡) 收发双向负载均衡+容错 特殊要求 兼顾负载均衡和易用性的优选方案

2.2 两种较常用的模式详解

在实际生产环境中,mode 1、mode 4 是最常使用的两种模式

🔹 Mode 1(主备模式):最稳妥的高可用方案

在追求高可用、对带宽要求不苛刻的场景下最常用的模式。它的逻辑非常简单:

  • 同一时刻只有一块网卡(active)在工作,承担所有流量
  • 其他网卡(standby)完全处于热备状态
  • 一旦主网卡或线路故障,备卡会在毫秒级内切换上来

优点:配置简单,几乎兼容所有网络环境,不需要交换机做特殊配置。

缺点:资源利用率低,N 块网卡的利用率仅为 1/N。

🔹 Mode 4(LACP模式):LACP协议实现负载均衡

数据包会在多条链路间负载均衡,但需要上游交换机也要配置LACP。多数环境中交换机都支持LACP, 故很多环境中都选用这种模式,特别是数据中心用得多。

关键限制:必须配合支持静态链路聚合的交换机使用,让交换机保证同一个会话的流量走同一条物理链路。

有些资料说mode0、mode6也是常用的模式,但博主工作也有十几年了,现实环境中没见过使用。

三、Team:更现代的"后起之秀"

Team 是 Linux 内核 3.3 引入的一种链路聚合驱动,功能和 Bonding 类似,但更灵活、可扩展性更强

3.1 Team 与 Bond 的核心差异

对比维度 Bond Team
出现时间 早期 Linux 内核 内核 3.3+(约 2012 年)
实现方式 纯内核模块 小内核驱动 + 用户空间守护进程(teamd)
配置格式 传统配置文件 JSON 格式,更规范
最大网卡数 通常 2 块 最多 8 块
IPv6 支持 基础支持 更好地支持 IPv6
扩展性 功能相对固定 更强,支持 hash 加密等

3.2 Team 支持的 Runner 模式

Team 中的"模式"称为 runner,与 Bond 的 mode 一一对应:

Team Runner 对应 Bond Mode 说明
roundrobin mode 0 轮询分发
activebackup mode 1 主备模式
loadbalance mode 2/6 基于哈希的负载均衡
broadcast mode 3 广播所有端口
lacp mode 4 LACP 动态聚合
random --- 随机选择端口

3.3 Team 的核心优势

  1. 更灵活的配置:使用 JSON 格式,易于编程化管理
  2. 支持更多网卡:最多可绑定 8 块网卡
  3. 更好的 IPv6 支持
  4. 用户空间与内核分离:内核只负责快速数据转发,复杂逻辑在用户空间处理,调试和扩展更方便
  5. 无需手动加载内核模块:有更强的扩展性

四、实战:手把手配置 Bond 与 Team

4.1 使用nmcli配置链路聚合(Mode 1)

4.1.1 使用 nmcli 配置 Bond(Mode 1 主备模式)

nmcli 是 NetworkManager 的命令行工具,在 CentOS/RHEL 7+ 中广泛使用。

  1. 创建 bond 接口(mode 1 主备模式)
bash 复制代码
nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=1,miimon=100"
  1. 添加物理网卡到 bond(假设网卡名为 ens33 和 ens36)
bash 复制代码
nmcli connection add type bond-slave ifname ens33 con-name ens33 master bond0
nmcli connection add type bond-slave ifname ens36 con-name ens36 master bond0
  1. 设置 IP 地址
bash 复制代码
nmcli connection modify bond0 ipv4.method manual ipv4.addresses 192.168.32.132/24 ipv4.gateway 192.168.32.2 ipv4.dns 114.114.114.114 autoconnect yes
  1. 启动所有接口
bash 复制代码
nmcli connection up bond0
nmcli connection up ens33
nmcli connection up ens36

注意:在配置bond之前可能已经有网络配置,如下图,已经有ifcfg-ens33的网卡配置文件,在按上述方法配置bond时,会重新新建一个配置文件ifcfg-ens33-1,这种情况下,可以将ifcfg-ens33备份到其他目录,然后执行删除,重命名ifcfg-ens33-1为ifcfg-ens33,然后删除ifcfg-ens33中uuid的配置即可,另一个网卡可执行类似操作。

root@centos7-test network-scripts# rm -rf ifcfg-ens33

root@centos7-test network-scripts]# mv ifcfg-ens33-1 ifcfg-ens33

root@centos7-test network-scripts# systemctl restart network

  1. 查看 bond 状态并做切换测试
    cat /proc/net/bonding/bond0

💡 参数说明miimon=100 表示每 100ms 检查一次链路状态。

断掉主网卡ens33,ens36变为主网卡,ping测试依然可以连通。

4.1.2 使用 nmcli 配置 Team(activebackup 模式)
  1. 创建 team 接口(activebackup 主备模式)
bash 复制代码
nmcli connection add type team con-name team0 ifname team0 config '{"runner": {"name": "activebackup"}}'
  1. 添加物理网卡到 team
bash 复制代码
nmcli connection add type team-slave ifname ens33 con-name team0-slave1 master team0
nmcli connection add type team-slave ifname ens36 con-name team0-slave2 master team0
  1. 设置 IP 地址
bash 复制代码
nmcli connection modify team0 ipv4.method manual ipv4.addresses 192.168.32.150/24 ipv4.gateway 192.168.32.2 ipv4.dns 114.114.114.114 autoconnect yes
  1. 启动所有接口
bash 复制代码
nmcli connection up team0
nmcli connection up team0-slave1
nmcli connection up team0-slave2

注意:此时使用teamdctl team0 state和teamnl team0 ports查看team的状态是不正常的,备份ifcfg-ens33和ifcfg-ens36后删除这两个配置文件,然后重命名ifcfg-team0-slave1为ifcfg-ens33,ifcfg-team0-slave2为ifcfg-ens36,编辑ifcfg-ens33:删除uuid,name修改为ens33;配置文件ifcfg-ens36也进行类似操作。

  1. 查看 team 状态
bash 复制代码
teamdctl team0 state
teamnl team0 ports

4.2 通过修改配置文件配置链路聚合(Mode 4)

4.2.1 配置bonding

创建bond0配置文件:

bash 复制代码
cd /etc/sysconfig/network-scripts/
vim ifcfg-bond0
BONDING_OPTS="mode=4 miimon=100 lacp_rate=fast xmit_hash_policy=layer3+4"
TYPE=Bond
BONDING_MASTER=yes
BOOTPROTO=static
NAME=bond0
DEVICE=bond0
ONBOOT=yes
IPADDR=192.168.32.132
PREFIX=24
GATEWAY=192.168.32.2
DNS1=114.114.114.114 

网卡ens33配置:

bash 复制代码
cd /etc/sysconfig/network-scripts/
vim ifcfg-ens33
TYPE=Ethernet
NAME=ens33
DEVICE=ens33
ONBOOT=yes
MASTER=bond0
SLAVE=yes

网卡ens36配置

bash 复制代码
TYPE=Ethernet
NAME=ens36
DEVICE=ens36
ONBOOT=yes
MASTER=bond0
SLAVE=yes

配置完成后,重启网络服务 systemctl restart network

4.2.2 bonding验证

1.验证聚合状态:cat /proc/net/bonding/bond0

2.查看网络地址配置信息

ip address show

4.2.3 配置teamd

在 /etc/sysconfig/network-scripts/ 目录下创建 ifcfg-team0

bash 复制代码
TEAM_CONFIG="{\"runner\": {\"name\":\"lacp\",\"active\":true,\"fast_rate\":true, \"tx_hash\":[\"ipv4\"], \"ports\":{\"ens33\":{}, \"ens36\":{}}}}"
NAME=team0
DEVICE=team0
ONBOOT=yes
BOOTPROTO=static
DEVICETYPE=Team
IPADDR=192.168.32.150
PREFIX=24
GATEWAY=192.168.32.2
DNS1=114.114.114.114

网卡ens33配置:

bash 复制代码
NAME=ens33
DEVICE=ens33
ONBOOT=yes
TEAM_MASTER=team0
DEVICETYPE=TeamPort

网卡ens36配置:

bash 复制代码
NAME=ens36
DEVICE=ens36
ONBOOT=yes
TEAM_MASTER=team0
DEVICETYPE=TeamPort
4.2.4 teamd验证
bash 复制代码
teamdctl team0 state
 teamnl team0 ports

五、Bond vs Team:一张表看懂怎么选

对比维度 Bond Team
稳定性 ⭐⭐⭐⭐⭐ 内核原生,久经考验 ⭐⭐⭐⭐ 较新,但已广泛使用
配置复杂度 简单直接 稍复杂(JSON 配置)
最大网卡数 2 块 8 块
IPv6 支持 基础 更好
调试便利性 查看 /proc/net/bonding/ teamdctl 命令更丰富
适用系统 所有 Linux 发行版 CentOS/RHEL 7+、主流现代发行版
扩展性 功能固定 更强,支持 hash 加密等

选型建议

  • 追求稳定、配置简单 → 选 Bond(尤其是 mode 1),绝大多数场景够用
  • 需要绑定 2 块以上网卡 → 选 Team
  • 需要更灵活的配置和更好的 IPv6 支持 → 选 Team
  • 维护老旧系统 → 选 Bond(兼容性更好)

六、生产环境最佳实践与避坑指南

6.1 选择合适的工作模式

场景 推荐方案 原因
追求高可用、对带宽不敏感 Bond mode 1 / Team activebackup 配置简单,故障切换快
需带宽叠加且能配置交换机 Bond mode 4 / Team lacp LACP 标准协议,智能负载均衡
需带宽叠加但不想动交换机 Bond mode 6 / Team loadbalance 自适应,无需交换机特殊配置

6.2 避坑指南

① 不同品牌的网卡不建议绑定在一起

不同厂商网卡的驱动和性能特性差异可能影响聚合效果。

② 参与聚合的网卡速率必须相同

千兆 + 万兆混合绑定时需注意性能平衡。速率不同的网卡绑定后,慢速网卡会成为瓶颈。

③ Mode 0 必须配交换机

如果只在服务器侧配置 mode 0 而交换机没有做端口聚合,交换机会因为"一个 MAC 对应多个端口"而无法正常转发数据包。

④ 配置修改前先备份

bash 复制代码
# 备份当前网络配置
cp -r /etc/sysconfig/network-scripts/ /tmp/network-scripts-backup/

⑤ 生产环境务必配置监控告警

定期测试故障转移功能,确保备链路在关键时刻能顶上。

6.3 验证与调试命令

bash 复制代码
# Bond 状态查看
cat /proc/net/bonding/bond0

# Team 状态查看
teamdctl team0 state
teamnl team0 ports

# 查看所有网络接口
ip link show

# 查看聚合接口的 IP 配置
ip addr show bond0
ip addr show team0

# 测试故障转移(拔掉一根网线后观察)
ping -I bond0 192.168.1.1

总结

从 Bond 到 Team,Linux 链路聚合技术走过了一条从"稳定可靠"到"灵活强大"的演进之路。

记住三句话

  1. Bond 是"老牌劲旅":内核原生,稳定可靠,mode 1 主备模式是生产环境最稳妥的选择。
  2. Team 是"后起之秀":设计更现代,支持更多网卡、JSON 配置、更好的 IPv6,是未来的方向。
  3. 模式选对最重要:追求高可用选主备(mode 1 / activebackup),追求带宽叠加且能配交换机选 LACP(mode 4 / lacp),不想动交换机选自适应(mode 6 / loadbalance)。

链路聚合是构建高可用网络架构的基石。掌握了 Bond 和 Team,你就能让服务器的网络从"单点脆弱"变成"多路冗余"------把网络故障的风险降到最低,把带宽的潜力发挥到最大。

如果你有任何问题或经验分享,欢迎在评论区留言讨论!

相关推荐
皮卡狮8 小时前
进程的地址空间
linux
田里的水稻8 小时前
FA_数字相机成像原理、分级和分类
运维·数码相机·机器人·自动驾驶
Darkwanderor8 小时前
动、静态库相关内容的详细介绍
linux·c语言·开发语言·c++
智灵鸟科技8 小时前
封闭网络怎么安全地接外部能力:三条通道穷举、威胁封堵矩阵与残余风险
网络·安全·矩阵
信仰8749 小时前
HCIA-华为数通基础理论与实践10
网络·华为·智能路由器
信仰8749 小时前
HCIA-华为数通基础理论与实践06
网络·华为
VX_189 小时前
域名SSL证书监测平台
网络·网络协议·ssl
极客先躯9 小时前
高级java每日一道面试题-2026年04月18日-实战篇[Docker]-如何处理金融行业的时序数据容器化?
java·运维·docker·容器·金融·时序数据·高级面试
运维大师10 小时前
【K8S 运维实战】01-K8s架构深度剖析
运维·架构·kubernetes
liulilittle10 小时前
论无知:分布式
服务器·网络·分布式·并发·通信·竞态