本文目录导读:

Bonding(也被称作NIC Teaming、链路聚合或Port Trunking)是一种将多个物理网卡(Network Interface Cards)绑定成一个逻辑网卡的技术,其核心目的是提供冗余(高可用性)和/或增加带宽(负载均衡)。
在 Linux 系统中,实现 bonding 的常用方法有两种:传统的 Bonding 驱动和较新的 Team 驱动(虽然很多现代发行版开始转向 NetworkManager 或 systemd-networkd 直接支持),以下将详细介绍最经典且通用的传统 Bonding 配置方法。
核心概念:Bonding 模式(Mode)
在开始配置前,你需要选择一个模式,这是关键,最常用的几种模式:
- mode=0 (balance-rr):轮询,数据包依次从每个网卡发出,提供负载均衡和容错。
- mode=1 (active-backup):主备模式,只有一个网卡活跃,另一个作为备份。主要用于高可用性(容错),不能增加带宽。
- mode=2 (balance-xor):基于 XOR 哈希算法(源MAC+目的MAC)选择网卡,提供负载均衡和容错。
- mode=3 (broadcast):广播,所有数据包在所有网卡上发送,提供容错,很浪费带宽。
- mode=4 (802.3ad):动态链路聚合,需要交换机支持 802.3ad(LACP)协议,这是最常见的增加带宽的模式。
- mode=5 (balance-tlb):自适应传输负载均衡,数据发送根据当前网卡负载自动分配,接收流量由单卡处理。
- mode=6 (balance-alb):自适应负载均衡,包含 mode5 的功能,并对接收流量也进行负载均衡,这是最“智能”但消耗CPU的模式。
核心选择建议:
- 只想要容错(万一网线断了,服务不中断):选择 mode=1 (active-backup)。
- 既要容错又要增加带宽(配合交换机):选择 mode=4 (802.3ad)。
- 小网络/无交换机支持/测试环境:选择 mode=6 (balance-alb)。
详细配置步骤(以 CentOS/RHEL 7/8/9 及类似系统为例)
假设你有两块物理网卡:eth0 和 eth1,你想把它们绑成逻辑网卡 bond0。
步骤 1:加载 Bonding 内核模块
确保系统支持 bonding 模块。
# 手动加载 modprobe bonding # 设置为开机自动加载 echo "bonding" >> /etc/modules-load.d/bonding.conf
步骤 2:创建 Bonding 接口配置文件
路径:/etc/sysconfig/network-scripts/ifcfg-bond0
TYPE=Bond DEVICE=bond0 NAME=bond0 BOOTPROTO=static # 使用静态IP,也可以 dhcp ONBOOT=yes BONDING_MASTER=yes # 绑定模式:1(主备),4(802.3ad),6(ALB) BONDING_OPTS="mode=1 miimon=100" # 或者对于 mode=4,可能需要添加:"mode=4 miimon=100 lacp_rate=fast" # miimon=100 意思是每100毫秒检查一次链路状态 IPADDR=192.168.1.100 # 你的IP NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=8.8.8.8
步骤 3:配置从属网卡(Slave)
你需要修改或创建 eth0 和 eth1 的配置文件,让它们成为 bond0 的成员。
ifcfg-eth0:
TYPE=Ethernet BOOTPROTO=none # 重要:不能设置静态IP或dhcp,让bond主接口接管 DEVICE=eth0 ONBOOT=yes MASTER=bond0 # 指定主接口 SLAVE=yes # 声明为从属接口 USERCTL=no
ifcfg-eth1:与 ifcfg-eth0 完全相同,除了 DEVICE=eth1。
TYPE=Ethernet BOOTPROTO=none DEVICE=eth1 ONBOOT=yes MASTER=bond0 SLAVE=yes USERCTL=no
步骤 4:重启网络服务并验证
# CentOS 7/8/9 systemctl restart network # 或者对于使用 NetworkManager 的系统(较多现代发行版): nmcli connection reload systemctl restart NetworkManager # 验证状态 cat /proc/net/bonding/bond0 # 你应该能看到 Bonding Mode: fault-tolerance (active-backup) # 以及 Slave Interface: eth0, eth1 的状态。 # 目前应该是 eth0 是 active,eth1 是 backup(取决于MAC地址顺序)。 # 测试:拔掉 eth0 的网线,再次查看 cat /proc/net/bonding/bond0 # eth0 应该变为 down,eth1 变为 active。 # ping 你的网关,应该不会中断(或中断很短时间)。
现代方法(使用 NetworkManager / nmcli)
如果你是较新的系统(如 RHEL 8/9, Fedora, Ubuntu 20.04+),建议使用 nmcli。
创建 Bond 接口:
nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=1,miimon=100"
添加从属接口(Slaves):
nmcli connection add type ethernet slave-type bond con-name bond0-eth1 ifname eth1 master bond0 nmcli connection add type ethernet slave-type bond con-name bond0-eth2 ifname eth2 master bond0
配置 IP 地址:
nmcli connection modify bond0 ipv4.addresses 192.168.1.100/24 nmcli connection modify bond0 ipv4.gateway 192.168.1.1 nmcli connection modify bond0 ipv4.dns 8.8.8.8 nmcli connection modify bond0 ipv4.method manual
激活:
nmcli connection up bond0
需要注意的陷阱与检查点
- 物理连接与交换机:
- 如果你使用 mode=4 (802.3ad),交换机端口必须配置为 LACP (Link Aggregation Group, LAG) 或 Port Channel,否则连接可能会不稳定或导致广播风暴。
- 如果你使用 mode=1(主备),交换机不需要做任何特殊配置(普通的 access/trunk 端口即可)。
- 链路检测 (miimon):
miimon=100是必选参数,它决定了 bonding 驱动检测链路故障的频率(毫秒),不设置的话,交换机或网线断了,系统可能需要很长时间才能切换。 - MAC 地址冲突:在 mode=1 下,活动的网卡会使用 bond0 的 MAC 地址(通常是第一个被绑定的网卡),当切换时,它会“借用”这个 MAC,这通常没问题,但某些交换机或网络策略(如端口安全)可能会禁止 MAC 地址飘移,如果遇到连接问题,可以尝试在交换机端口上关闭
port-security或允许 MAC 地址变动。 - 防火墙/网络管理器权限:确保没有其他服务(如
irqbalance或特殊的网络策略)干扰 bond 接口的工作。 - 测试与回滚:在生产服务器上操作时,一定要先备份原有网络配置文件。 建议先在测试环境演练。
| 你的需求 | 推荐模式 | 交换机要求 | 备注 |
|---|---|---|---|
| 高可用性(一根网线断了) | mode=1 (active-backup) |
无特殊要求 | 最简单,最可靠 |
| 增加总带宽 + 高可用性 | mode=4 (802.3ad) |
必须支持 LACP | 最常用,需两端协商 |
| 增加总带宽(无交换机支持) | mode=6 (balance-alb) |
无特殊要求 | 消耗更多CPU资源 |
只要按照上述步骤(特别是选择正确的模式和配置文件格式),在 Linux 上 bond 多个网卡是一个比较成熟可靠的过程。
标签: link aggregation