当单块网卡(NIC)发生故障时,网络连接就会中断。这种停机会影响关键服务的正常运行。为确保高可用性,可以将服务器双网卡配置为 active-backup 绑定模式。该绑定会创建一个逻辑接口,其中一块网卡作为主用接口,另一块保持空闲,直到主用接口发生故障后才接管。切换过程会自动完成。这样无需复杂的负载均衡配置,也能提供链路冗余。你只需识别网卡、创建 bond 并设置工作模式,然后为 bond 分配一个统一的 IP 地址即可。物理网卡本身不需要单独配置 IP。这种方法同时适用于 Linux 和 Windows。即便一块网卡或一根网线失效,服务器也能保持在线。

关键要点

  • Active-backup 绑定一次只使用一块网卡。这种方式提供的是故障切换冗余。
  • 为 bond 接口配置一个统一的 IP 地址。物理网卡本身不需要单独配置 IP。
  • 在 Linux 上,将 bonding 模式设置为 active-backup,并使用 miimon 或 ARP 监控进行链路检测。
  • 在 Windows 上,使用 NIC Teaming,并通过手动设置接口跃点数来控制主用适配器。
  • 通过禁用当前活动网卡来测试故障切换,并验证是否能自动切换到备用网卡。

理解网络绑定与 active-backup 模式

网络绑定可以将两块或多块网卡合并成一个逻辑连接。这种技术无需复杂的硬件改造,就能提供容错能力。bonding 驱动会将多个物理端口统一管理为一个整体。你只需配置一次 bond,驱动就会自动处理故障切换。

什么是 active-backup 模式,它如何工作

Active-backup 模式是最简单的一种 bonding 策略。只有一块从属接口负责承载全部流量,另一块处于待机状态。Linux bonding 驱动文档对其行为有明确说明:

Active-backup 策略:在 bond 中,任意时刻只有一个从属接口处于活动状态。只有当当前活动接口发生故障时,另一个从属接口才会被激活。为避免交换机混淆,bond 的 MAC 地址在外部只会出现在一个端口上。

当故障切换发生时,驱动会在新的活动从属接口上发送 gratuitous ARP(免费 ARP)报文,以通知网络中的设备该 MAC 地址已经迁移。交换机会刷新其转发表,流量便可在无需人工干预的情况下恢复。

链路故障检测主要依赖以下三种机制:

  • miimon(默认):bond 仅监控物理载波状态。该方法无法检测“链路虽然保持 Up,但交换机已停止转发数据包”的情况。
  • ARP monitor(arp_interval):bond 会向配置的目标发送 ARP 请求。如果停止收到应答,就会判定接口故障并触发切换。为了避免误判,建议配置多个目标。
  • arp_validate:该选项用于校验 ARP 流量是否来自已配置目标。arp_validate=active 仅校验活动接口,arp_validate=all 则同时监控备用接口。

使用 bonding 实现故障切换的优势

Active-backup 模式提供的是纯冗余能力,不涉及负载均衡的复杂性。其他模式如 balance-rr 会将流量分布到所有从属接口上,这更适合追求吞吐量的场景,但会让故障切换逻辑更加复杂。Active-backup 则始终保持单一路径工作,因此切换过程更加直接。

这种网络策略可以帮助服务器抵御硬件故障。如果主网卡损坏或网线被拔掉,备用网卡会自动接管。你无需专用交换机,也不需要额外的路由协议,就能获得冗余能力。配置简单,行为可预测。

对于大多数服务器部署而言,active-backup 已经能够提供所需的可靠性。你只需在 bond 接口上保留一个 IP 地址,物理网卡无需单独配置,从而减少管理负担。这种方式尤其适合那些对连接稳定性要求高于带宽聚合的关键业务服务。

如何在 Linux 上配置服务器双网卡

安装 bonding 工具并识别网络接口

首先加载 bonding 内核模块:

  1. 使用以下命令加载 bonding 模块:sudo modprobe bonding
  2. 为了确保系统重启后仍会自动加载,可使用以下命令将 bonding 追加到 /etc/modulesecho "bonding" | sudo tee -a /etc/modules

如果需要加载多个 bonding 实例,可在 /etc/modprobe.d/*.conf 中为其指定唯一名称:

alias bond0 bonding
options bond0 -o bond0 mode=balance-rr miimon=100

alias bond1 bonding
options bond1 -o bond1 mode=balance-alb miimon=50

这会将 bonding 模块加载两次,并分别创建 bond0 和 bond1 设备,同时为它们设置不同的模式和 miimon 值。

为了确保驱动加载顺序正确,可在 /etc/modprobe.d/ 中添加:

softdep bonding pre: tg3 e1000

这表示在加载 bonding 模块之前,先加载 tg3 和 e1000 驱动模块。

接下来识别你的网络接口。使用 ip link show 命令列出所有接口:

命令: ip link show

输出(节选):

1: lo: <LOOPBACK,UP,LOWER_UP> ... state UNKNOWN ...
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... state UP ...
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> ... state DOWN ...

这段输出表明,该命令会列出每个接口名称及其当前运行状态。

你也可以使用 ip --brief link show 获取更简洁的视图。记下你的两块物理网卡名称,例如 enp3s0enp4s0。它们将作为 bond 的从属接口。

创建 bond 接口并设置 active-backup 模式

你有两种配置方式。若采用 bonding 模块的手动配置方式,可先以 active-backup 模式和 miimon 参数加载模块:

sudo modprobe bonding mode=active-backup miimon=100

然后为 bond 接口配置 IP 地址:

sudo ifconfig bond0 192.168.1.100 netmask 255.255.255.0 up

将物理接口加入 bond:

sudo ip link set enp3s0 master bond0
sudo ip link set enp4s0 master bond0

物理接口本身不配置 IP 地址。统一的 IP 配置在 bond 接口上。只有 bond 承载 IP,而物理网卡保持未配置状态。这是该方案的核心原则。

对于 Ubuntu 18.04 及以上版本使用 netplan 的情况,可在 /etc/netplan/ 下创建一个 YAML 文件。该配置会定义一个名为 bond0 的 bond 接口,其中包含两块物理接口。bond 模式设置为 active-backup,也就是同一时间只有一块接口处于活动状态,另一块作为待机。YAML 结构中,bond 定义位于 bonds: 键下,成员接口写在 interfaces: 下,模式则写在 parameters: 中。这展示了 Ubuntu 20.04 上 active-backup 模式的标准 netplan 语法。使用 primary 参数将主接口设置为 enp3s0。将 mii-monitor-interval 设置为 100,以每 100 毫秒检查一次链路状态,从而实现快速故障检测。

编辑完成后,使用 sudo netplan apply 应用配置。

配置完成后,验证 bonding 状态。执行 cat /proc/net/bonding/bond0 并检查输出。该命令会显示 bond 模式、从属接口以及链路状态。

对于 active-backup 模式,可以使用 cat /sys/class/net/bond0/bonding/active_slave 来确认当前活动从属接口。这能帮助你确认当前由哪块网卡负责承载流量。Link Failure Count 字段会显示每块接口自 bond 创建以来发生故障的次数。若计数为 0,则表示尚未发生故障。当你为服务器配置双网卡故障切换时,这一步能够清楚地显示当前活动接口。

在 Windows Server 中配置备用网卡

Windows Server 针对相同的冗余目标提供了另一种实现方式。不同于 Linux 所使用的 bonding 驱动,Windows 采用 NIC Teaming。这个内置功能可以将多块物理适配器组合成一个逻辑接口。该团队接口对外表现为一个统一的 IP 地址,而故障切换逻辑则在后台自动管理。

使用 NIC Teaming 和接口跃点数

打开 Server Manager,进入 Local Server。点击 NIC Teaming 部分以启动配置向导。选择你希望组合的两块物理适配器,然后在 “Teaming Mode” 中设置为 “Static Teaming” 或 “Switch Independent”。在负载均衡模式中,选择 “Address Hash” 或保留默认值。关键设置在 “Standby adapter” 部分——指定其中一块 NIC 为备用接口。这样就建立了你所需要的 active-backup 故障切换关系。

创建团队后,你还需要控制由哪块适配器承载实际流量。Windows Server 默认启用 Automatic Metric(自动跃点数)。该功能会根据链路速度自动分配路由跃点数,速度更快的接口会获得更低的跃点值。这个算法在大多数场景下表现良好,但当适配器速率不同的时候,可能会产生不符合预期的结果。你通常希望主网卡始终优先,而不受链路速度影响。

关闭自动跃点数分配,以便手动控制。打开 Network Connections,右键点击你的团队接口并选择 Properties。点击 Internet Protocol (TCP/IP),再点击 Properties,然后进入 Advanced。在 IP Settings 选项卡中,取消勾选 “Automatic metric”,并在 “Interface Metric” 字段中输入你想要的值。

使用 PowerShell 可以更快捷地完成同样的操作。你可以使用 Set-NetIPInterface cmdlet 来分配具体跃点值:

命令: Set-NetIPInterface -InterfaceIndex 21 -InterfaceMetric 10
说明: 跃点值越低,优先级越高;跃点值越高,优先级越低。

将主团队接口的跃点值设为 10,将辅助适配器设为 15。操作系统在存在多条可选路由时,总是优先选择跃点值最低的路径。这种手动配置能够保证行为更可预测。正常情况下由主网卡承载全部流量,只有在主网卡故障时备用接口才会接管。

使用静态路由隔离备份流量

接口跃点数控制的是默认流量优先走哪块网卡,而静态路由则能让你对特定目标做更精细的控制。比如,你可能希望备份复制任务专门走一条独立的管理网络,从而避免大规模数据传输占满主链路带宽。

假设你的主团队接口连接的是企业生产网络,而辅助网卡连接的是独立的存储网络。你希望备份复制任务始终只走存储网络。此时可以添加一条静态路由,将通往存储网络的流量指向辅助网卡所在网络的网关。

打开提升权限的 PowerShell,并运行:

Set-NetIPInterface -InterfaceIndex "5" -InterfaceMetric "1"

这条命令会为存储适配器设置较低的跃点值。配合静态路由,它可以强制备份流量走专用路径,而普通用户流量仍然继续通过主团队接口。两类数据流互不争用带宽。

在运行备份复制任务时,测试你的配置并监控两块接口。使用 Performance Monitor 或 Resource Monitor 来确认是哪块适配器在传输流量。你应当看到存储网卡有活动,而主团队接口基本保持空闲。这样的流量隔离可以避免备份任务对生产网络造成拥塞。

请记住,静态路由需要谨慎规划。记录下你添加的每一条路由,并在其不再需要时及时移除。被遗忘的静态路由可能会在未来网络调整之后,将流量引导到意料之外的路径。定期使用 route print 检查路由表,确认当前实际生效的流量路径。

这种双网卡策略不仅提供故障切换保护,还能实现业务流量隔离。即便发生硬件故障,服务器依然可以保持在线;而备份复制操作也能高效运行,不会影响关键服务。NIC Teaming、手动跃点数与静态路由的组合,能够为各种 Windows 环境构建稳健的网络架构。

测试故障切换与最佳实践

模拟网卡故障并验证备用链路接管

测试故障切换配置是否真正可用,是在你真正需要它之前必须完成的工作。首先检查当前由哪块接口承载流量。运行 cat /sys/class/net/bond0/bonding/active_slave,即可查看当前活动网卡。该命令会显示此时负责所有流量的接口名称。

接着,使用以下任一方式模拟故障:

  1. 使用 ip link set eth0 down 禁用当前活动接口
  2. 拔掉活动网卡上的网线
  3. 通过服务器管理工具禁用该适配器

触发故障后,再次检查活动从属接口。重新运行 cat /sys/class/net/bond0/bonding/active_slave。此时输出应显示为另一块备用接口。这说明自动切换已经成功发生,服务器无需人工介入即可维持网络连接。

在切换过程中测试网络连通性。你可以从另一台机器对服务器执行 ping,或者检查一个正在运行的服务。理想情况下,切换只会带来极短暂的中断。你可能会观察到轻微暂停,这是 bond 检测故障并激活备用网卡所需的时间。

要恢复正常状态,可重新启用原始接口。如果已经配置了 primary 参数,bond 可能会自动切回到首选接口,例如 eth0。完成后请再次确认活动从属接口是否恢复为你预期的主用网卡。

确保恢复能力并避免常见陷阱

MAC 地址抖动(MAC flapping)是 active-backup bonding 中最常见的问题。发生故障切换时,bond 会改变由哪个物理端口对外通告该 MAC 地址。交换机会观察到同一个 MAC 地址在不同端口之间来回出现,这在某些交换机上可能触发 MAC flap 检测,从而导致临时性网络中断。

有几种策略可以避免这个问题。你可以在 bond 配置中设置 fail_over_mac=active。该选项会保留每个从属接口原有的 MAC 地址,而不是将它们全部统一变更。另一种方法是在外部交换机上关闭 MAC flap 检测。若使用 LLDP 广播,则应将守护进程配置为使用各个物理从属接口的真实 MAC 地址,而不是 bond 的 MAC 地址。

将每块 NIC 放在不同的子网或 VLAN 中,也是一种值得推荐的做法。这样可以隔离故障域,并简化故障排查。如果某一个网络段出现问题,另一个网络段仍可保持不受影响。这种隔离还可以防止广播风暴同时影响两条路径。

在 Windows 系统上,请关闭自动跃点数计算。手动设置跃点数能够带来更可预测的故障切换行为。定期检查系统日志中的 bond 事件也很重要。Linux 日志通常位于 /var/log/syslog,或者可以通过 dmesg 查看。Windows 日志则位于 Event Viewer 的网络相关项下。这些日志会记录链路故障、切换事件与恢复动作。持续监控有助于你在问题扩大之前发现异常模式。

这种冗余策略能够帮助服务器抵御意外硬件故障。建议你每季度测试一次配置,以确保在系统更新或网络变更之后,它仍然可以正常工作。

为双网卡配置故障切换,能够显著提升系统可靠性。本文技术教程分别介绍了 Linux 与 Windows 的实现方法。Linux 使用 active-backup 模式的 bonding;Windows 则使用 NIC Teaming 配合手动接口跃点数。两种方式都可以为你的关键基础设施提供完整的网络冗余。

请务必充分测试你的配置。模拟主网卡故障,并确认备用网卡能够无缝接管。你可以通过拔网线或禁用接口的方式,验证自动切换是否真正有效。

对于备份流量较重的应用场景,可考虑专门划分一块独立网卡,并通过静态路由避免网络拥塞。现在就将这些步骤应用到你的服务器部署中。这样你就能确保网络连接持续不中断,并获得更高的运维安心度。

常见问题(FAQ)

Active-backup 绑定会降低网络速度吗?

不会。Active-backup 模式一次只使用一块网卡,因此最大吞吐量仍然等于单块接口的速率。你不会获得带宽聚合,但会获得更高的可靠性。如果你既希望具备故障切换能力,又希望提高带宽,可考虑使用 balance-alb 或 802.3ad 模式。

故障切换发生时会出现什么情况?

bonding 驱动会在配置的监控间隔内检测到链路丢失,例如 100 毫秒。随后它会自动激活备用网卡。服务器会发送 gratuitous ARP 报文,以便更新网络交换机的转发表。现有连接可能会短暂停顿,但大多数服务都能在无需中断的情况下恢复。你不需要重启网络服务。

使用 bonding 是否需要特殊交换机?

不需要。Active-backup 模式可在任何标准交换机上工作。不同于链路聚合(802.3ad),它不需要在交换机侧进行特殊配置。每块物理网卡只需连接到普通交换机端口即可。这种简单性使 active-backup 非常适合那些无法修改网络基础设施配置的环境。

我如何知道当前是哪块 NIC 处于活动状态?

在 Linux 上运行 cat /sys/class/net/bond0/bonding/active_slave,该命令会返回当前活动接口名称。在 Windows 上,可打开 Server Manager 中的 NIC Teaming。团队状态会显示当前由哪块适配器承载流量。在每次网络变更后,都应检查这些状态值,以确认配置正常。

我可以使用两块以上的 NIC 来实现故障切换吗?

可以。Active-backup 模式支持多个从属接口。你可以指定一个主接口,以及多个备用 NIC。当主接口故障时,bonding 驱动会激活下一个可用从属接口。对于关键任务服务器而言,这种配置能够提供更高层级的冗余,即便第二块网卡也发生故障,系统仍不至于立即中断。