在Windows中,通过两块网卡和两个网络适配器实现故障转移(Failover)可以采用网络接口绑定(NIC Teaming)或者使用路由表的手动切换。这里我会介绍使用Windows自带的 NIC Teaming 功能来实现两个网卡之间的自动故障转移,以及通过 PowerShell 来设置故障转移的基本示例。

PowerShell NIC Teaming(LBFO)拆解|解构|底层原理|依赖文件|依赖关系|逻辑链路|配套链

NIC Teaming,正式名称 LBFO(Load‑Balancing and Fail‑Over,负载均衡与故障转移),Windows Server 原生多网卡链路聚合技术;PowerShell 通过NetLbfo模块管理;Windows10/11 客户端版本默认不自带 LBFO,仅服务器版本完整支持。
 
区分两套技术:
  • LBFO(NIC Teaming)lbfo.sys内核中间驱动,裸金属服务器可用,支持 SwitchIndependent / Static / LACP 三种模式。
  • SET(Switch Embedded Teaming):集成在 Hyper‑V 虚拟交换机vmswitch.sys,仅虚拟化环境,不使用 NetLbfo 模块
整体层级总览
plaintext
 
 
 
PowerShell NetLbfo模块
    ↓
Microsoft.Windows.NetLbfo.PS.dll → NDIS用户态配置接口
    ↓
MNAMP(Microsoft Network Adapter Multiplexor Protocol多路复用协议)
    ↓
lbfo.sys(NDIS中间MUX内核驱动)
    ↓
物理网卡微型端口驱动 → ndis.sys → 硬件网卡
 
数据包栈从上到下:
 
应用层 → tcpip.sys → Team虚拟网卡(lbfo.sys) → 哈希调度分发 → 物理网卡驱动 → 网线博客园

一、底层原理

1、LBFO 内核驱动模型

lbfo.sys属于NDIS 中间 MUX 驱动
  1. 向上对外暴露一块Team 虚拟网卡,IP 地址、网关、DNS 配置全部配置在这块虚拟网卡;上层 TCP/IP 栈完全感知不到多块物理网卡。
  2. 向下绑定多张物理成员网卡;物理网卡不再直接绑定 TCP/IP 协议,只绑定 MNAMP 多路复用协议。
  3. 内核内部完成:出站流量哈希分流、入站帧汇聚、链路状态监控、故障自动 Failover 切换。
三种 Teaming 聚合模式:
  1. SwitchIndependent(交换机独立):不需要交换机配置聚合;主机侧自主分流;单 TCP 流不能跨网卡叠加带宽,仅做故障冗余;物理网卡可接不同交换机。
  2. Static(静态聚合 802.3ad):交换机端口静态配置聚合组,无 LACP 协商报文;上下行均可带宽叠加;故障检测依靠超时,切换慢。
  3. LACP(IEEE802.3ad 动态聚合):服务器与交换机互发 LACPDU 协商报文;动态识别链路故障,毫秒级故障切换;生产环境首选;交换机端口必须同步开启 LACP博客园。
负载均衡算法(出站分流)
  • Dynamic(默认):五元组(源目 IP + 端口)哈希,同一条 TCP 会话始终走同一张物理网卡,保证报文顺序;多会话分散到不同网卡。
  • AddressHash:源目 MAC/IP 哈希。
  • HyperVPort:专门给 Hyper‑V 虚拟机场景,按虚拟端口分配物理网卡。
重要限制:单条 TCP 流无法跨网卡叠加带宽;只有多条不同会话才能实现聚合带宽。

2、PowerShell NetLbfo 模块原理

NetLbfo是 PowerShell 专门管理 LBFO 的模块,核心 Cmdlet:
 
New‑NetLbfoTeam / Get‑NetLbfoTeam / Remove‑NetLbfoTeam / Set‑NetLbfoTeamMember
 
底层不直接操作硬件,调用 Windows NDIS 配置接口,完成三件事:
  1. 修改 NDIS 绑定:把物理网卡 TCP/IP 协议解绑,绑定 MNAMP 多路复用协议。
  2. 加载注册内核驱动lbfo.sys,创建 Team 虚拟微型端口。
  3. 注册表持久保存 Team 名称、成员网卡、聚合模式、负载均衡算法、备用成员配置。
客户端 Windows10/11:默认未安装 LBFO 组件,执行New‑NetLbfoTeam直接报错;仅 Server 系统原生支持。

3、MNAMP 多路复用协议

MNAMP 不是独立 sys 驱动,属于 NDIS 协议绑定组件;负责建立虚拟 Team 网卡 ↔ 多张物理网卡内部绑定关系;物理网卡必须绑定 MNAMP,流量才会交给 lbfo.sys 处理。

4、故障转移 Failover 原理

lbfo.sys 监听 NDIS 介质状态事件:物理网卡链路 Down、网线断开、网卡硬件故障,内核立刻把该网卡上所有流量迁移至其他活动成员网卡;毫秒级切换,上层应用无感知。支持配置 Standby 备用网卡。

二、依赖文件清单

表格
 
 
 
文件 作用
Microsoft.Windows.NetLbfo.PS.dll PowerShell NetLbfo 模块,NIC Teaming 管理 Cmdlet 实现
lbfo.sys LBFO 内核 MUX 中间驱动,真正完成流量调度、故障转移
ndis.sys NDIS 网络驱动抽象框架,所有网卡驱动的基础依赖
netcfgx.dll 网络组件配置 API,修改协议绑定(MNAMP/TCPIP)
注册表路径:HKLM\SYSTEM\CurrentControlSet\Services\LBFO 存储 Team 全部配置、成员网卡、聚合策略持久化存储

系统组件依赖

  1. MNAMP(Microsoft Network Adapter Multiplexor Protocol):网络适配器属性中可见;创建 Team 时自动绑定到物理网卡。
  2. 服务:不需要额外用户态服务;LBFO 完全内核态运行。
  3. 对比:SET 模式依赖vmswitch.sysHyper‑V 虚拟交换机,不依赖 lbfo.sys

三、依赖关系梳理

  1. 操作系统版本依赖
     
    NetLbfo/LBFO仅 Windows Server 原生支持;Windows10/11 专业版 / 家庭版默认无该组件,只能使用网卡厂商私有驱动实现链路聚合。
  2. 网卡硬件驱动依赖
  • 同一个 Team 内成员网卡,推荐同型号同驱动;混合不同厂商网卡有概率创建 Team 失败
  • 物理网卡必须支持 NDIS6.x;老旧 NDIS5 驱动不支持 LBFO。
  1. 交换机强依赖(LACP / Static 模式)
  • LACP 模式:交换机对应端口必须开启 LACP;两端速率、双工、VLAN 配置保持一致;否则网络异常、广播风暴。
  • SwitchIndependent 模式:交换机不需要任何聚合配置。
  1. 绑定约束(关键)
     
    物理网卡被加入 Team 之后:
  • TCP/IP 协议会被解绑;IP 只能配置在 Team 虚拟网卡上;物理网卡不能手动设置 IP。
  • 物理网卡只保留 MNAMP 多路复用协议。
  1. 权限依赖
     
    PowerShell 操作 NIC Teaming必须管理员权限;修改 NDIS 协议绑定、加载内核驱动需要高权限。
  2. Hyper‑V 与 SR‑IOV 冲突依赖
     
    如果物理网卡开启 SR‑IOV,流量会绕过 lbfo.sys,Teaming 故障转移失效;SR‑IOV 与 LBFO 不建议同时使用。
  3. 带宽认知约束
❌不能把两张网卡带宽简单相加用于单条大文件传输;单 TCP 流固定走一张物理网卡;多并发会话才能体现聚合带宽收益。

四、完整逻辑链路

链路 1:PowerShell 创建 NIC Team 完整流程

powershell
 
 
 
New‑NetLbfoTeam -Name "Team0" -TeamMembers "Ethernet1","Ethernet2" -TeamingMode LACP -LoadBalancingAlgorithm Dynamic
 
  1. PowerShell 管理员会话加载Microsoft.Windows.NetLbfo.PS.dll模块。
  2. Cmdlet 调用netcfgx.dll网络配置 API。
  3. 对每一块成员物理网卡:解绑 TCP/IP 协议,绑定 MNAMP 多路复用协议
  4. 系统注册加载内核驱动lbfo.sys,生成一块新的 Team 虚拟微型端口网卡。
  5. 将配置(Team 名称、成员、TeamingMode、负载算法)写入注册表HKLM\SYSTEM\CurrentControlSet\Services\LBFO持久化。
  6. lbfo.sys内核初始化:建立虚拟网卡与多张物理网卡 MUX 绑定通道;持续监控每张物理网卡介质链路状态。
  7. 用户给Team0虚拟网卡配置 IP 地址、网关、DNS;上层 TCP/IP 协议栈绑定在 Team 虚拟网卡。

链路 2:出站数据包发送链路(主机向外发包)

  1. 应用程序发出数据包 → tcpip.sys协议栈,投递到 Team 虚拟网卡。
  2. 数据包进入lbfo.sys内核 MUX 层;根据负载均衡算法计算五元组哈希,选择一张物理成员网卡。
  3. NDIS 把数据包下发选中的物理网卡驱动,硬件发送报文。

链路 3:入站数据包接收链路(外部流量进入服务器)

  1. 任意一张物理网卡收到以太网帧,上传给 ndis.sys。
  2. 帧上送lbfo.sys;做帧过滤、去重;转发给上层 TCP/IP 栈。
  3. TCP/IP 协议向上递交给上层应用。

链路 4:物理网卡故障 Failover 故障转移链路

  1. 网线断开 / 网卡硬件故障,NDIS 上报 MediaDisconnect 介质断开事件。
  2. lbfo.sys收到事件,标记该成员网卡失效。
  3. 所有原本分配到故障网卡的流,重新哈希分配到其余活动物理网卡。
  4. 上层 TCP/IP 会话不断开,业务无感知切换。
LACP 模式额外链路:lbfo.sys 内核定时发送 LACPDU 报文,与交换机协商链路状态,自动识别有效 / 无效聚合链路。

五、配套链:实操 PowerShell 示例

powershell
 
 
 
#requires -RunAsAdministrator
#查看系统物理网卡
Get‑NetAdapter

#创建NIC Team,LACP模式,动态负载均衡
New‑NetLbfoTeam -Name "Team‑LACP" -TeamMembers "Ethernet1","Ethernet2" -TeamingMode LACP -LoadBalancingAlgorithm Dynamic

#查看Team状态
Get‑NetLbfoTeam
Get‑NetLbfoTeamMember

#查看Team虚拟网卡统计
Get‑NetAdapterStatistics -Name "Team‑LACP"

#删除Team
Remove‑NetLbfoTeam -Name "Team‑LACP"

#设置备用网卡(Standby)
Set‑NetLbfoTeamMember -Name "Ethernet2" -Team "Team‑LACP" -Standby $true
 
区分 SET(Hyper‑V 虚拟交换机聚合,不使用 NetLbfo)
powershell
 
 
 
New‑VMSwitch -Name "vSwitchSET" -NetAdapterName "Ethernet1","Ethernet2" -EnableEmbeddedTeaming $true
 

六、高频故障排查清单

  1. New‑NetLbfoTeam:找不到命令
当前系统不是 Windows Server;Windows10/11 客户端无 LBFO 组件。
  1. 创建 Team 报错,无法绑定成员网卡
网卡驱动老旧;混合不同型号网卡;网卡正在被 Hyper‑V/SR‑IOV 占用。
  1. LACP 模式配置完成,网络不通 / 大量丢包
交换机端口没有配置 LACP;两端速率双工不一致;交换机没有把端口加入聚合组。
  1. 一张网卡断开,业务没有自动切换
网卡介质状态上报异常;硬件驱动 bug;错误使用 SET 代替 LBFO。
  1. 双万兆网卡聚合,单文件拷贝速度跑不满 20G
设计特性:单 TCP 流只能走一张物理网卡;多并发业务才能叠加带宽。
  1. Team 创建成功,物理网卡还存在 IP 地址
加入 Team 之后物理网卡 IP 会被清空;IP 必须配置在 Team 虚拟网卡;物理网卡不要手动设置 IP。
  1. 重启机器 Team 丢失配置
LBFO 注册表配置损坏;网卡名称发生变化(网卡序号漂移)。

七、关键认知误区澄清

❌误区 1:NIC Teaming 可以让单条 TCP 流带宽叠加
 
✅事实:基于流哈希,一条 TCP 会话永远固定走同一张物理网卡;多并发会话才会分摊到多张网卡。
❌误区 2:Windows11 客户端原生支持 New‑NetLbfoTeam
 
✅事实:只有 Windows Server 原生 LBFO;Win11 客户端没有 NetLbfo 模块,只能使用 Intel/Broadcom 厂商私有聚合驱动。
❌误区 3:SET 和 LBFO 是同一套技术
 
✅事实:LBFO 依赖 lbfo.sys,裸金属可用;SET 集成 vmswitch.sys,依赖 Hyper‑V,不支持 LACP
❌误区 4:加入 Team 的物理网卡可以继续配置 IP 地址
 
✅事实:物理网卡 TCP/IP 协议被解绑;IP 只能配置在 Team 虚拟网卡。
❌误区 5:SwitchIndependent 模式下交换机也要配置聚合组
 
✅事实:交换机独立模式,交换机完全不需要任何聚合配置。
 

 

PowerShell NIC Teaming(LBFO)配套链完整梳理

NIC Teaming (LBFO) 配套链分为:PowerShell 模块配套、系统内核驱动配套、协议绑定配套、交换机配套、运维工具配套、故障诊断配套六大环节。

1️⃣ PowerShell 模块配套(上层管理链)

表格
 
 
 
组件 说明
NetLbfo模块 Microsoft.Windows.NetLbfo.PS.dll,Windows Server 内置,提供全部 Teaming 管理 Cmdlet;Windows 桌面版无此模块
核心命令集
powershell
 
 
 
New‑NetLbfoTeam      #创建聚合组
Get‑NetLbfoTeam      #查询聚合组
Get‑NetLbfoTeamMember #查看成员网卡
Set‑NetLbfoTeamMember #设置备用网卡Standby
Remove‑NetLbfoTeam   #删除聚合组
 
联动配套模块:
  • NetAdapter:查看物理网卡、网卡状态、流量统计
  • NetIPAddress:给 Team 虚拟网卡配置 IP / 网关 / DNS
  • NetAdapterStatistics:读取聚合组流量计数器

2️⃣ Windows 系统内核驱动配套(底层数据链路)

  1. lbfo.sys:LBFO 核心 NDIS 中间 MUX 驱动,实现流量哈希分发、故障转移、LACP 协商;生成 Team 虚拟网卡微型端口。
  2. ndis.sys:NDIS 驱动框架,所有网卡驱动依赖基础框架。
  3. MNAMP 协议(Microsoft Network Adapter Multiplexor Protocol)
物理网卡加入 Team 后,解绑 TCP/IP,只绑定 MNAMP 多路复用协议,负责把物理网卡流量上交 lbfo.sys。
  1. tcpip.sys:上层 TCP/IP 协议栈,IP 配置只作用在 Team 虚拟网卡,不再绑定物理网卡。
持久化存储配套:
 
注册表路径:HKLM\SYSTEM\CurrentControlSet\Services\LBFO
 
保存 Team 名称、成员网卡、聚合模式、负载均衡算法、备用网卡配置,系统开机读取注册表重建聚合组。

3️⃣ 操作系统配套约束链

  1. Windows Server原生支持 LBFO / NetLbfo 模块;Win10/Win11 客户端没有内置组件,只能使用网卡厂商私有聚合工具。
  2. 硬件驱动约束:成员网卡优先同型号、同版本 NDIS6.x 驱动;混合异构网卡容易创建失败。
  3. 冲突组件:SR‑IOV与 LBFO 冲突,SR‑IOV 会绕过 lbfo.sys,故障转移失效;Hyper‑V 的 SET(交换机内嵌聚合)使用vmswitch.sys完全不依赖 lbfo.sys,和 LBFO 是两套独立技术

4️⃣ 网络交换机配套链(外部硬件配套)

不同 Teaming 模式对交换机配套要求不一样
 
| 聚合模式 | 交换机配套要求 |
 
|---|---|
 
|SwitchIndependent(交换机独立)|交换机无需任何配置;网卡可以接入不同交换机;只做故障冗余 |
 
|Static 静态聚合 (802.3ad)| 交换机端口手动配置静态聚合组;无 LACP 协商报文 |
 
|LACP 动态聚合(生产推荐)| 交换机端口开启 LACP,匹配速率、双工、VLAN;服务器与交换机互发 LACPDU 协商链路 |
⚠️配套禁忌:LACP 模式下交换机端口不能配置 Port‑Fast、BPDU 防护异常参数,否则会造成丢包、链路震荡。

5️⃣ GUI 管理配套链(和 PowerShell 等价)

  1. 服务器管理器 → 本地服务器 → NIC Teaming 图形界面,底层同样调用 LBFO 组件,最终写入同一处注册表;PowerShell 与图形界面配置双向互通。
  2. 设备管理器:可以查看Microsoft Network Adapter Multiplexor协议、Team 虚拟网卡设备。

6️⃣ 运维诊断 & 故障排查配套链

① PowerShell 诊断命令

powershell
 
 
 
Get‑NetLbfoTeam
Get‑NetLbfoTeamMember
Get‑NetAdapter
Get‑NetAdapterStatistics
Get‑NetEventLog -LogName System | where Id -match "lbfo"
 

② 事件日志

系统日志,事件源:LBFO;记录链路断开、故障切换、LACP 协商失败、Team 创建销毁事件。

③ 网络抓包

wireshark 抓取 LACPDU 报文,排查 LACP 协商异常。

④ 性能监视器计数器

Microsoft Windows LBFO Team性能对象,监控成员网卡流量、故障切换次数。

7️⃣ 完整端到端逻辑配套链路

plaintext
 
 
 
PowerShell NetLbfo模块
        ↓(netcfgx.dll网络配置API)
修改网卡协议绑定(启用MNAMP,解绑物理网卡TCPIP)
        ↓
注册表持久化LBFO配置
        ↓
lbfo.sys内核驱动加载 → 创建Team虚拟网卡
        ↓
tcpip.sys绑定Team虚拟网卡(配置IP地址)
        ↓
lbfo.sys内部哈希调度,分发流量到各物理网卡
        ↓
物理网卡驱动 → 网线 → 交换机(交换机配套LACP/静态聚合)
 

补充:配套链选型提醒

  1. 裸金属物理服务器多网卡冗余:选 LBFO (NIC Teaming),使用NetLbfoPowerShell 模块。
  2. Hyper‑V 虚拟化主机多网卡聚合:优先 SET,不要使用 LBFO,SET 集成在 vmswitch 虚拟交换机,不依赖 lbfo.sys。
  3. 单 TCP 流带宽限制:LBFO 多网卡聚合不能提升单条 TCP 会话带宽,多并发业务才能叠加总带宽。

在Windows中,通过两块网卡和两个网络适配器实现故障转移(Failover)可以采用网络接口绑定(NIC Teaming)或者使用路由表的手动切换。这里我会介绍使用Windows自带的 NIC Teaming 功能来实现两个网卡之间的自动故障转移,以及通过 PowerShell 来设置故障转移的基本示例。

1. 使用 Windows NIC Teaming 实现故障转移

Windows Server(2012 及更高版本)和部分 Windows 10/11 专业版和企业版支持 NIC Teaming。通过 NIC Teaming,你可以将两块网卡(物理适配器)绑定为一个虚拟适配器,这样可以提高网络可靠性和带宽,同时在某一块网卡出现故障时,自动切换到另一块网卡。

配置 NIC Teaming 的步骤:

  1. 打开“网络和共享中心”

    • 在 Windows 服务器或 Windows 10/11 中,打开“控制面板” > “网络和共享中心” > “更改适配器设置”。
  2. 选择适配器

    • 选中两块你想要组合在一起的网络适配器。
  3. 右键点击,选择“创建团队”

    • 右键点击选中的网卡,然后选择“新建团队”。
  4. 配置团队设置

    • 弹出的“团队属性”窗口中,可以选择不同的负载均衡模式(例如“动态”或“静态”)。
    • 一般来说,选择“故障转移”模式即可。这种模式会确保如果一个网卡故障,流量会自动切换到另一块网卡。
  5. 选择故障转移模式

    • 在“网络适配器”选项卡中,你可以选择“故障转移”模式。这样,默认情况下,Windows 会使用两块网卡中的主网卡,另一块网卡作为备份,当主网卡出现故障时,流量会自动切换到备用网卡。
  6. 完成设置

    • 点击“确定”,等待适配器组合完成。你会看到一个新的虚拟网卡出现在“网络连接”中,它是由两块物理网卡组成的。

2. PowerShell脚本实现基于延迟的故障转移

如果你不想使用 NIC Teaming,而是希望基于网络延迟(例如,主网卡网络出现问题时,自动切换到备份网卡),你可以使用 PowerShell 脚本来监控网络连接,并在故障发生时动态更新路由。

示例 PowerShell 脚本:自动监测延迟并切换网卡

powershellCopy Code
# 设置主网卡和备用网卡的默认网关
$primaryGateway = "192.168.1.1"  # 主网卡的网关
$secondaryGateway = "192.168.2.1"  # 备用网卡的网关

# 设置目标服务器(测试网络连通性)
$targetIp = "8.8.8.8"  # Google的公共DNS地址(可以选择其他地址)

# 设置延迟阈值
$delayThreshold = 100  # 延迟超过此值则切换网卡

# 检查网络延迟并根据延迟自动切换网卡
function Check-NetworkLatency {
    # 测试与目标IP的连接
    $pingResult = Test-Connection -ComputerName $targetIp -Count 4 -Quiet
    if ($pingResult) {
        # 获取平均延迟
        $latency = (Test-Connection -ComputerName $targetIp -Count 4 | Measure-Object ResponseTime -Average).Average
        Write-Host "平均延迟: $latency ms"

        # 如果延迟超过阈值,切换到备用网卡
        if ($latency -gt $delayThreshold) {
            Write-Host "延迟超过阈值,切换到备用网卡..."

            # 移除主网卡的路由
            Remove-NetRoute -DestinationPrefix 0.0.0.0/0 -NextHop $primaryGateway -Confirm:$false

            # 添加备用网卡的路由
            New-NetRoute -DestinationPrefix 0.0.0.0/0 -NextHop $secondaryGateway

            Write-Host "已切换到备用网卡的网关: $secondaryGateway"
        } else {
            Write-Host "延迟正常,使用主网卡"
        }
    } else {
        Write-Host "无法连接到目标服务器: $targetIp"
    }
}

# 定时检查网络延迟,每30秒执行一次
while ($true) {
    Check-NetworkLatency
    Start-Sleep -Seconds 30  # 每30秒检查一次
}

说明:

  • Test-Connection 用于检测网络延迟。如果目标主机(比如 Google 的 8.8.8.8)响应得很慢,脚本会切换路由到备用网卡。
  • Remove-NetRoute 和 New-NetRoute 用于删除当前网关并添加备用网关,实现在网络延迟过高时自动切换到备用网络。
  • 脚本使用 Start-Sleep 来定时每隔 30 秒检查一次网络延迟。

3. 任务调度

如果希望该脚本持续运行,你可以将其添加到任务调度程序中定期执行。

  1. 打开 任务计划程序
  2. 创建一个新的任务,设置触发器为“每 30 秒”或“每分钟”,并设置操作为运行 PowerShell 脚本。

 

  • NIC Teaming:适用于高可用性和负载均衡场景,Windows 提供了简易的配置方式,支持多种故障转移模式。
  • PowerShell脚本:适用于需要手动或基于延迟调整路由表的场景,灵活性较高,但需要手动编写和管理脚本。

根据你的需求,你可以选择适合的方式来实现故障转移。对于生产环境,使用 NIC Teaming 会更加稳定和简便,而使用 PowerShell 脚本则提供了更高的灵活性,可以根据具体条件来切换路由或网卡。


 

posted @ 2024-11-11 01:57  suv789  阅读(1305)  评论(0)    收藏  举报