在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 驱动:- 向上对外暴露一块Team 虚拟网卡,IP 地址、网关、DNS 配置全部配置在这块虚拟网卡;上层 TCP/IP 栈完全感知不到多块物理网卡。
- 向下绑定多张物理成员网卡;物理网卡不再直接绑定 TCP/IP 协议,只绑定 MNAMP 多路复用协议。
- 内核内部完成:出站流量哈希分流、入站帧汇聚、链路状态监控、故障自动 Failover 切换。
三种 Teaming 聚合模式:
- SwitchIndependent(交换机独立):不需要交换机配置聚合;主机侧自主分流;单 TCP 流不能跨网卡叠加带宽,仅做故障冗余;物理网卡可接不同交换机。
- Static(静态聚合 802.3ad):交换机端口静态配置聚合组,无 LACP 协商报文;上下行均可带宽叠加;故障检测依靠超时,切换慢。
- 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
- 修改 NDIS 绑定:把物理网卡 TCP/IP 协议解绑,绑定 MNAMP 多路复用协议。
- 加载注册内核驱动
lbfo.sys,创建 Team 虚拟微型端口。 - 注册表持久保存 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 全部配置、成员网卡、聚合策略持久化存储 |
系统组件依赖
- MNAMP(Microsoft Network Adapter Multiplexor Protocol):网络适配器属性中可见;创建 Team 时自动绑定到物理网卡。
- 服务:不需要额外用户态服务;LBFO 完全内核态运行。
- 对比:SET 模式依赖
vmswitch.sysHyper‑V 虚拟交换机,不依赖 lbfo.sys。
三、依赖关系梳理
-
操作系统版本依赖
NetLbfo/LBFO仅 Windows Server 原生支持;Windows10/11 专业版 / 家庭版默认无该组件,只能使用网卡厂商私有驱动实现链路聚合。 -
网卡硬件驱动依赖
- 同一个 Team 内成员网卡,推荐同型号同驱动;混合不同厂商网卡有概率创建 Team 失败。
- 物理网卡必须支持 NDIS6.x;老旧 NDIS5 驱动不支持 LBFO。
- 交换机强依赖(LACP / Static 模式)
- LACP 模式:交换机对应端口必须开启 LACP;两端速率、双工、VLAN 配置保持一致;否则网络异常、广播风暴。
- SwitchIndependent 模式:交换机不需要任何聚合配置。
- 绑定约束(关键)
物理网卡被加入 Team 之后:
- TCP/IP 协议会被解绑;IP 只能配置在 Team 虚拟网卡上;物理网卡不能手动设置 IP。
- 物理网卡只保留 MNAMP 多路复用协议。
-
权限依赖PowerShell 操作 NIC Teaming必须管理员权限;修改 NDIS 协议绑定、加载内核驱动需要高权限。
-
Hyper‑V 与 SR‑IOV 冲突依赖如果物理网卡开启 SR‑IOV,流量会绕过 lbfo.sys,Teaming 故障转移失效;SR‑IOV 与 LBFO 不建议同时使用。
-
带宽认知约束
❌不能把两张网卡带宽简单相加用于单条大文件传输;单 TCP 流固定走一张物理网卡;多并发会话才能体现聚合带宽收益。
四、完整逻辑链路
链路 1:PowerShell 创建 NIC Team 完整流程
powershell
New‑NetLbfoTeam -Name "Team0" -TeamMembers "Ethernet1","Ethernet2" -TeamingMode LACP -LoadBalancingAlgorithm Dynamic
- PowerShell 管理员会话加载
Microsoft.Windows.NetLbfo.PS.dll模块。 - Cmdlet 调用
netcfgx.dll网络配置 API。 - 对每一块成员物理网卡:解绑 TCP/IP 协议,绑定 MNAMP 多路复用协议。
- 系统注册加载内核驱动
lbfo.sys,生成一块新的 Team 虚拟微型端口网卡。 - 将配置(Team 名称、成员、TeamingMode、负载算法)写入注册表
HKLM\SYSTEM\CurrentControlSet\Services\LBFO持久化。 lbfo.sys内核初始化:建立虚拟网卡与多张物理网卡 MUX 绑定通道;持续监控每张物理网卡介质链路状态。- 用户给
Team0虚拟网卡配置 IP 地址、网关、DNS;上层 TCP/IP 协议栈绑定在 Team 虚拟网卡。
链路 2:出站数据包发送链路(主机向外发包)
- 应用程序发出数据包 →
tcpip.sys协议栈,投递到 Team 虚拟网卡。 - 数据包进入
lbfo.sys内核 MUX 层;根据负载均衡算法计算五元组哈希,选择一张物理成员网卡。 - NDIS 把数据包下发选中的物理网卡驱动,硬件发送报文。
链路 3:入站数据包接收链路(外部流量进入服务器)
- 任意一张物理网卡收到以太网帧,上传给 ndis.sys。
- 帧上送
lbfo.sys;做帧过滤、去重;转发给上层 TCP/IP 栈。 - TCP/IP 协议向上递交给上层应用。
链路 4:物理网卡故障 Failover 故障转移链路
- 网线断开 / 网卡硬件故障,NDIS 上报 MediaDisconnect 介质断开事件。
lbfo.sys收到事件,标记该成员网卡失效。- 所有原本分配到故障网卡的流,重新哈希分配到其余活动物理网卡。
- 上层 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
六、高频故障排查清单
- New‑NetLbfoTeam:找不到命令
当前系统不是 Windows Server;Windows10/11 客户端无 LBFO 组件。
- 创建 Team 报错,无法绑定成员网卡
网卡驱动老旧;混合不同型号网卡;网卡正在被 Hyper‑V/SR‑IOV 占用。
- LACP 模式配置完成,网络不通 / 大量丢包
交换机端口没有配置 LACP;两端速率双工不一致;交换机没有把端口加入聚合组。
- 一张网卡断开,业务没有自动切换
网卡介质状态上报异常;硬件驱动 bug;错误使用 SET 代替 LBFO。
- 双万兆网卡聚合,单文件拷贝速度跑不满 20G
设计特性:单 TCP 流只能走一张物理网卡;多并发业务才能叠加带宽。
- Team 创建成功,物理网卡还存在 IP 地址
加入 Team 之后物理网卡 IP 会被清空;IP 必须配置在 Team 虚拟网卡;物理网卡不要手动设置 IP。
- 重启机器 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 / 网关 / DNSNetAdapterStatistics:读取聚合组流量计数器
2️⃣ Windows 系统内核驱动配套(底层数据链路)
- lbfo.sys:LBFO 核心 NDIS 中间 MUX 驱动,实现流量哈希分发、故障转移、LACP 协商;生成 Team 虚拟网卡微型端口。
- ndis.sys:NDIS 驱动框架,所有网卡驱动依赖基础框架。
- MNAMP 协议(Microsoft Network Adapter Multiplexor Protocol)
物理网卡加入 Team 后,解绑 TCP/IP,只绑定 MNAMP 多路复用协议,负责把物理网卡流量上交 lbfo.sys。
tcpip.sys:上层 TCP/IP 协议栈,IP 配置只作用在 Team 虚拟网卡,不再绑定物理网卡。
持久化存储配套:
注册表路径:
保存 Team 名称、成员网卡、聚合模式、负载均衡算法、备用网卡配置,系统开机读取注册表重建聚合组。
HKLM\SYSTEM\CurrentControlSet\Services\LBFO
3️⃣ 操作系统配套约束链
- 仅Windows Server原生支持 LBFO / NetLbfo 模块;Win10/Win11 客户端没有内置组件,只能使用网卡厂商私有聚合工具。
- 硬件驱动约束:成员网卡优先同型号、同版本 NDIS6.x 驱动;混合异构网卡容易创建失败。
- 冲突组件:
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 等价)
- 服务器管理器 → 本地服务器 → NIC Teaming 图形界面,底层同样调用 LBFO 组件,最终写入同一处注册表;PowerShell 与图形界面配置双向互通。
- 设备管理器:可以查看
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/静态聚合)
补充:配套链选型提醒
- 裸金属物理服务器多网卡冗余:选 LBFO (NIC Teaming),使用
NetLbfoPowerShell 模块。 - Hyper‑V 虚拟化主机多网卡聚合:优先 SET,不要使用 LBFO,SET 集成在 vmswitch 虚拟交换机,不依赖 lbfo.sys。
- 单 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 的步骤:
-
打开“网络和共享中心”:
- 在 Windows 服务器或 Windows 10/11 中,打开“控制面板” > “网络和共享中心” > “更改适配器设置”。
-
选择适配器:
- 选中两块你想要组合在一起的网络适配器。
-
右键点击,选择“创建团队”:
- 右键点击选中的网卡,然后选择“新建团队”。
-
配置团队设置:
- 弹出的“团队属性”窗口中,可以选择不同的负载均衡模式(例如“动态”或“静态”)。
- 一般来说,选择“故障转移”模式即可。这种模式会确保如果一个网卡故障,流量会自动切换到另一块网卡。
-
选择故障转移模式:
- 在“网络适配器”选项卡中,你可以选择“故障转移”模式。这样,默认情况下,Windows 会使用两块网卡中的主网卡,另一块网卡作为备份,当主网卡出现故障时,流量会自动切换到备用网卡。
-
完成设置:
- 点击“确定”,等待适配器组合完成。你会看到一个新的虚拟网卡出现在“网络连接”中,它是由两块物理网卡组成的。
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. 任务调度
如果希望该脚本持续运行,你可以将其添加到任务调度程序中定期执行。
- 打开 任务计划程序。
- 创建一个新的任务,设置触发器为“每 30 秒”或“每分钟”,并设置操作为运行 PowerShell 脚本。
- NIC Teaming:适用于高可用性和负载均衡场景,Windows 提供了简易的配置方式,支持多种故障转移模式。
- PowerShell脚本:适用于需要手动或基于延迟调整路由表的场景,灵活性较高,但需要手动编写和管理脚本。
根据你的需求,你可以选择适合的方式来实现故障转移。对于生产环境,使用 NIC Teaming 会更加稳定和简便,而使用 PowerShell 脚本则提供了更高的灵活性,可以根据具体条件来切换路由或网卡。

浙公网安备 33010602011771号