Linux 链路聚合实战:Bond 与 Team解析
引言
你有没有遇到过这样的场景:某天凌晨,一块网卡突然罢工,整个服务直接中断,半夜被报警电话吵醒。
在运维过程中,单点故障是我们不得不面对的问题。
其实,Linux 系统早就为我们准备好了"网卡抱团"的解决方案------链路聚合 。简单说,就是把服务器上多块物理网卡"捆绑"在一起,逻辑上变成一块网卡来用。好处显而易见:带宽叠加 (多块网卡并行传输)、故障冗余(一块坏了另一块顶上)。
在 Linux 的世界里,实现链路聚合主要有两大"门派":Bond 和 Team。很多人刚接触时会懵:这俩到底有啥区别?我该选哪个?今天这篇文章,我们就来彻底搞懂它们。
一、链路聚合是什么?为什么需要它?
先打个比方:原来你的服务器只有一条"单车道"通往外部网络,车流(数据)一多就开始堵车或者"单车道"断了,服务器数据无法发出也无法接收数据。链路聚合就是把两条、四条甚至八条车道合并成一条"多车道高速路"。
链路聚合的核心价值体现在三个方面:
- 带宽聚合:将多网卡带宽叠加,突破单网卡性能瓶颈
- 冗余备份:当某条物理链路故障时,其他链路自动接管
- 故障转移:网络拥堵或硬件故障时,智能切换保证连续性
在 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 的核心优势
- 更灵活的配置:使用 JSON 格式,易于编程化管理
- 支持更多网卡:最多可绑定 8 块网卡
- 更好的 IPv6 支持
- 用户空间与内核分离:内核只负责快速数据转发,复杂逻辑在用户空间处理,调试和扩展更方便
- 无需手动加载内核模块:有更强的扩展性
四、实战:手把手配置 Bond 与 Team
4.1 使用nmcli配置链路聚合(Mode 1)
4.1.1 使用 nmcli 配置 Bond(Mode 1 主备模式)
nmcli 是 NetworkManager 的命令行工具,在 CentOS/RHEL 7+ 中广泛使用。
- 创建 bond 接口(mode 1 主备模式)
bash
nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=1,miimon=100"
- 添加物理网卡到 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
- 设置 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
- 启动所有接口
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
- 查看 bond 状态并做切换测试
cat /proc/net/bonding/bond0
💡 参数说明 :
miimon=100表示每 100ms 检查一次链路状态。断掉主网卡ens33,ens36变为主网卡,ping测试依然可以连通。
4.1.2 使用 nmcli 配置 Team(activebackup 模式)
- 创建 team 接口(activebackup 主备模式)
bash
nmcli connection add type team con-name team0 ifname team0 config '{"runner": {"name": "activebackup"}}'
- 添加物理网卡到 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
- 设置 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

- 启动所有接口
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也进行类似操作。
- 查看 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 链路聚合技术走过了一条从"稳定可靠"到"灵活强大"的演进之路。
记住三句话:
- Bond 是"老牌劲旅":内核原生,稳定可靠,mode 1 主备模式是生产环境最稳妥的选择。
- Team 是"后起之秀":设计更现代,支持更多网卡、JSON 配置、更好的 IPv6,是未来的方向。
- 模式选对最重要:追求高可用选主备(mode 1 / activebackup),追求带宽叠加且能配交换机选 LACP(mode 4 / lacp),不想动交换机选自适应(mode 6 / loadbalance)。
链路聚合是构建高可用网络架构的基石。掌握了 Bond 和 Team,你就能让服务器的网络从"单点脆弱"变成"多路冗余"------把网络故障的风险降到最低,把带宽的潜力发挥到最大。
如果你有任何问题或经验分享,欢迎在评论区留言讨论!

