在CentOS 7及后续版本中,nmcli已成为管理网络的核心工具,直接替代了传统的network-scripts配置方式。当业务需要服务器网络具备高可用性,防止单条网线、单个交换机端口或单块网卡故障导致业务中断时,配置bonding(网卡绑定)是成本最低且最有效的冗余方案。很多人习惯修改配置文件,但在生产环境中,使用nmcli命令行工具创建和管理bond接口不仅速度快,而且能避免配置文件语法错误导致的网络中断,尤其适合远程维护的场景。

理解Linux Bonding的工作模式

在动手配置之前,必须明确bonding的几种核心模式,因为模式选择直接决定了你的冗余策略和交换机配置需求。mode=1(active-backup)是最常用的主备模式,只有一块网卡处于活动状态,另一块处于备用状态,当活动链路断开时,备用网卡无缝接管,交换机无需任何特殊配置,适用性最广。mode=0(balance-rr)是轮询模式,数据包依次从各网卡发出,能提升带宽,但要求交换机端口做链路聚合。mode=4(802.3ad)是标准的动态链路聚合,需要交换机支持LACP协议,既能实现负载均衡又能提供冗余。mode=6(balance-alb)则无需交换机支持,通过修改发送端ARP实现负载均衡,接收流量仍由一块网卡处理。对于绝大多数追求高可用而非带宽叠加的场景,mode=1是最稳妥的选择。

环境确认与前期准备

首先查看当前系统的网络接口状态,执行nmcli device status命令。你会看到类似eth0、eth1这样的物理网卡名称,以及它们当前的连接状态。注意记录下当前正在使用的网卡名称,因为后续操作会暂时中断网络。建议在本地终端或带外管理口上操作,如果是远程SSH连接,务必先确认备用网卡已经插好网线且交换机端口已启用,否则在配置过程中容易失联。接着检查NetworkManager服务是否正在运行,执行systemctl status NetworkManager,确保服务处于active状态。CentOS 7及以上版本默认使用NetworkManager管理网络,nmcli正是其命令行前端。

清除现有网卡配置并创建Bond接口

如果物理网卡上已有旧的连接配置,需要先将其删除,避免冲突。假设我们要绑定的两块网卡是ens33和ens34,先执行nmcli connection show查看现有的连接名称。通常系统会自动生成名为ens33和ens34的连接。执行以下命令删除它们:

nmcli connection delete ens33
nmcli connection delete ens34

删除后,网卡本身不会消失,只是移除了NetworkManager中的连接配置文件。接下来创建bond接口,指定模式为active-backup,并设置链路监控频率为100毫秒。执行:

nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup,miimon=100"

这条命令创建了一个名为bond0的连接,接口名也叫bond0。miimon参数表示链路监控间隔,单位是毫秒,100毫秒意味着故障检测时间非常短,切换速度极快。bond.options中的参数用逗号分隔,整个字符串需要用引号包裹。如果要配置mode=4的LACP模式,则写成"mode=802.3ad,lacp_rate=fast,miimon=100"。

将物理网卡添加为Bond的从属接口

创建好bond0后,需要将ens33和ens34作为slave加入。执行以下两条命令:

nmcli connection add type ethernet slave-type bond con-name bond0-port1 ifname ens33 master bond0
nmcli connection add type ethernet slave-type bond con-name bond0-port2 ifname ens34 master bond0

这里创建的是ethernet类型的连接,但slave-type指定为bond,master指向我们刚创建的bond0。con-name可以自定义,方便识别即可。ifname必须与实际的物理网卡名称一致。执行完成后,可以用nmcli connection show查看,会看到bond0、bond0-port1、bond0-port2三个连接。

配置Bond接口的IP地址与网络参数

接下来给bond0配置静态IP或DHCP。生产环境通常使用静态IP,假设地址为192.168.1.100/24,网关为192.168.1.1,DNS为223.5.5.5。执行:

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 223.5.5.5
nmcli connection modify bond0 ipv4.method manual

如果使用DHCP,只需将ipv4.method设为auto即可。注意,修改连接属性后,需要重新激活才能生效。此时先不要急着激活,继续配置连接的自启动属性:

nmcli connection modify bond0 connection.autoconnect yes
nmcli connection modify bond0-port1 connection.autoconnect yes
nmcli connection modify bond0-port2 connection.autoconnect yes

这确保服务器重启后bond接口能自动上线。至此,所有配置已经写入NetworkManager的连接文件中,实际存储在/etc/sysconfig/network-scripts/目录下,但由NetworkManager统一管理。

激活Bond接口并验证状态

配置完成后,先激活从属连接,再激活bond连接。执行:

nmcli connection up bond0-port1
nmcli connection up bond0-port2
nmcli connection up bond0

激活后立即检查bond0的状态。使用ip addr show bond0查看IP是否已正确分配。然后查看bond的详细工作状态,执行:

cat /proc/net/bonding/bond0

输出信息中会显示Bonding Mode为active-backup,以及Currently Active Slave是哪一块网卡,MII Status是否为up。如果两块网卡的MII Status都是up,且有一块被标记为Active,说明bonding已经正常工作。此时可以测试冗余效果:在服务器上持续ping网关,然后拔掉当前活动网卡的网线,观察ping是否中断。正常情况下,只会丢1到2个包,随后自动切换到备用网卡,业务连接不受影响。

深入调优与常见问题处理

miimon参数虽然通用,但在某些虚拟化环境或使用光模块的场景下,链路状态检测可能不够灵敏。此时可以结合arp_interval参数使用ARP监控。在bond.options中加入arp_interval=1000和arp_ip_target=192.168.1.1,这样bond会每秒发送ARP请求探测网关可达性,即使物理链路未断开但交换机转发异常,也能触发切换。对于mode=4的LACP场景,务必确认交换机端口已配置为LACP主动模式,否则bond接口会一直处于协商状态,导致网络不通。如果遇到bond0无法获取IP的情况,先检查从属网卡是否都处于up状态,用nmcli device status确认网卡没有被其他连接占用。有时候旧连接残留会导致冲突,用nmcli connection show --active查看当前活跃连接,删除多余的即可。

另一个常见问题是bonding切换后业务连接中断较长时间。这通常是因为交换机MAC地址表老化导致的。当活动网卡切换后,新网卡的MAC地址不同,交换机需要重新学习。可以在bond.options中添加fail_over_mac=active参数,让bond在切换时将新活动网卡的MAC地址设置为bond接口的MAC地址,减少交换机学习延迟。但注意,某些云平台或虚拟交换机不支持MAC地址变更,此参数需谨慎使用。

生产环境配置实例与自动化思路

下面给出一个完整的、可直接复制执行的配置脚本片段,适用于CentOS 7/8/9以及Rocky Linux等衍生版本。假设网卡为ens33和ens34,bond模式为active-backup,IP为10.0.0.50/24,网关10.0.0.1:

# 删除旧连接
nmcli connection delete ens33 2>/dev/null
nmcli connection delete ens34 2>/dev/null
# 创建bond接口
nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup,miimon=100,fail_over_mac=active"
# 添加从属接口
nmcli connection add type ethernet slave-type bond con-name bond0-p1 ifname ens33 master bond0
nmcli connection add type ethernet slave-type bond con-name bond0-p2 ifname ens34 master bond0
# 配置IP
nmcli connection modify bond0 ipv4.addresses 10.0.0.50/24 ipv4.gateway 10.0.0.1 ipv4.dns 223.5.5.5 ipv4.method manual
# 设置自启
nmcli connection modify bond0 connection.autoconnect yes
nmcli connection modify bond0-p1 connection.autoconnect yes
nmcli connection modify bond0-p2 connection.autoconnect yes
# 激活
nmcli connection up bond0-p1
nmcli connection up bond0-p2
nmcli connection up bond0

如果管理大量服务器,可以将上述命令写入Ansible playbook或Shell脚本,通过变量替换网卡名和IP地址,实现批量自动化配置。nmcli命令本身支持非交互式执行,非常适合自动化运维场景。

从冗余到安全的延伸思考

bonding解决了网络链路的单点故障问题,但高可用架构还需要考虑更多层面。例如,两块网卡是否连接到同一台交换机?如果是,交换机本身就成了单点故障。更完善的方案是将两块网卡分别连接到两台不同的交换机,交换机之间做堆叠或M-LAG,这样任意一台交换机故障都不会影响业务。此外,bond接口的IP配置完成后,防火墙规则需要同步更新,确保bond0接口在正确的安全域中。如果服务器上有多个bond接口用于不同网络平面,务必检查路由策略,避免出现非对称路由导致连接异常。

监控方面,建议通过/proc/net/bonding/bond0文件的内容编写监控脚本,当Active Slave发生变化时触发告警,因为这往往意味着链路出现过抖动或故障。同时,定期检查交换机日志,排查CRC错误或光模块功率异常等物理层问题,从根源上减少bonding切换的发生。