哎,这是个 Windows 的bug

本文探讨了一个特定场景下Windows更新系统出现的问题,包括其背景知识、验证过程与解决方案。通过搭建特定环境并进行抓包分析,揭示了导致更新失败的原因,并提出了几种应对策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哎,这是个 Windows 的bug

因为业务需要,需要验证 Windows 的更新系统在某个场景下是否正常工作。开始的时候一切如预期,结果后半段卡住了。不敢轻易怀疑是 Windows 的问题,毕竟 Windows 是服务亿万用户的,尤其是更新系统,用于 x86、x64、arm 等各个平台 Windows 系统的更新。只能从自己身上找原因:哪里的问题呢?是不是场景非官方支持?是不是测试环境搭建的有问题?是不是…
虽然现在回过头来看这个问题很清楚,但当时掉坑里的时候,爬出来还真是费了点儿劲。下面介绍一下到底怎么回事儿。

背景知识

这一部分只是简要介绍 Windows 更新原理及过程,详细内容可以参考系列文章《Windows Update 技术详解系列》。

Windows 更新的工作原理1

Windows 更新服务(Windows Update) 是微软提供的一个工具,专门用于为 Windows 操作系统软件和基于 Windows 的硬件提供更新程序。更新程序可以解决已知的问题并帮助修补已知的安全漏洞。当使用该服务时,Windows Update 将扫描计算机获取适用于当前计算机的软件和硬件的更新程序。
Windows 更新过程分为四个阶段完成:
扫描:计算机上的更新代理 Windows Update Agent(WUA) 通过http通信连接到更新服务器,检查更新服务器上是否有适合当前设备的更新,若有,得到更新包下载url;
下载:确定了适用于当前设备的更新后,下载服务(根据配置决定采用哪个下载程序)开始下载更新;
安装:下载的更新文件交由安装代理(CBS或安装程序)安装;
提交:安装更新后,根据需要重启设备以使更新生效;

本文讨论内容主要发生在 Windows 更新过程的下载阶段

Windows 服务器更新服务2

Windows 服务器更新服务(简称WSUS)作为企业组织内计算机 Windows 操作系统或者其他WSUS服务器的更新源。默认情况下WSUS服务器从 Windows Update(微软更新服务器) 获取更新,包含更新包文件以及它的描述信息。

验证场景

客户端配置

企业网络环境复杂多样,一种可能的网络配置是企业内部计算机通过代理服务器访问网络,同时要求企业用户在使用代理服务器的时候进行身份认证。这是客户端的网络环境。

服务端配置

Windows 有很多种更新包,仅每月都会发布的累积更新包大小约为几百MB,并且随着时间的推移增加。如果将WSUS作为开放服务,将所有的更新包文件放到同一台WSUS服务器并不是一个好的选择:随着更新包数量的增多,随着连接WSUS服务器的 Windows 更新客户端增多,WSUS 很大可能出现反应迟钝、负载过大、服务不可用现象。
CDN 作为缓解服务端流量的一种有效方式,大多数服务器都可以利用CDN的支持进行部署,WSUS也不例外(详细实现方案见后续文章)。Windows 更新客户端请求更新包文件的url地址后,会被重定向到CDN,由CDN提供更新包文件的下载服务。
整个场景的网络拓扑如下图所示:
在这里插入图片描述
企业内网用户计算机经由HTTP代理服务进行系统更新,代理服务器对用户身份认证通过后,继续请求更新服务器(Update Server)。在内网用户计算机获得适用于该设备的更新包信息后,请求下载更新包文件。该更新包文件最终由CDN提供下载服务。

验证过程

实验环境准备

  1. 搭建代理服务器(squid http proxy),要求用户名和密码进行代理连接认证,配置为采用最基本的basic认证即可
  2. 搭建 WSUS 更新服务器,配置更新包文件url重定向到CDN
  3. 准备Windows 系统,版本信息:21H2 enterprise版本(操作系统内部版本19044.1202)
  4. Windows 配置
组策略配置以设置 Windows 更新源为 WSUS: 

    a.	计算机配置 / 管理模板 / Windows 组件 / 传递优化 / 下载模式, 选择“启用”,选择“简单(99)” 
    b.	计算机配置 / 管理模板 / Windows 组件 / Windows 更新 / 允许来自Intranet Microsoft更新服务位置的签名更新,
        选择“启用” 
    c.	计算机配置 / 管理模板 / Windows 组件 / Windows 更新 / 不要连接任何Windows更新Internet位置,选择“启用” 
    d.	计算机配置 / 管理模板 / Windows 组件 / Windows 更新 / 配置自动更新,选择 "启用" 
    e.	计算机配置 / 管理模板 / Windows 组件 / Windows 更新 / 指定Intranet Microsoft更新服务位置,填入 update 
        server 地址;选择"当使用系统代理进行检测时,允许将用户代理用作回退" 
设置 Windows 更新使用代理服务: 
    设置 / 网络和Internet / 代理,在"手动设置代理"条目下填入代理服务器地址和端口,保存
设置代理服务器认证信息: 
    控制面板 / 用户帐户 / 凭据管理器 / 添加普通凭据,输入代理服务器的用户名和密码 
准备抓包软件: 
    Wireshark 

复现步骤

以上环境准备完毕后,进行以下操作:

  • 将适用于21H2的更新包导入到WSUS及CDN;
  • 对更新包进行审批;
  • Windows 系统中利用wireshark进行抓包;
  • 点击 “设置” 中的 “Windows更新”。

在这里插入图片描述
一段时间后,在更新面板处显示“正在下载进度为 0”。但等待较长时间后,仍无法下载更新。 最终会提示下载失败。

在这里插入图片描述

分析过程

通过wireshark抓包分析,过程如下:

如图所示,更新包下载agent为 Microsoft-Delivery-Optimization(ms_do)
在这里插入图片描述
更新包下载过程抓包如图所示
在这里插入图片描述
对以上抓包内容进行分析,可以得到以下描述过程,
在这里插入图片描述
Microsoft-Delivery-Optimization(ms_do)首次请求下载更新地址后,未携带代理服务器的认证信息,在收到407(需要认证代理)的的返回报文后,再次请求下载更新地址后,携带认证信息。此后收到了来自 update server的 302 重定向报文。此后,ms_do不再携带认证信息进行新的地址请求。 对于更新包的下载止步于此!最终,下载超时后,提示下载失败。

解决方案

这个问题在和微软的同学多次交流后,他们承认了这是 Windows 的一个bug,并说不会在这个版本的 Windows 中修复了,会在后面的版本中修复…

如果 Windows 一直没有修复,针对这个问题有什么解决方案呢?一个简单的解决方案是将代理服务器对用户的认证要求去掉,这虽然能够解决问题,但存在风险;进一步的方案是在代理服务器上添加"白名单",针对 Windows 更新包文件的请求不再验证用户身份,直接放行,其他网络访问要求认证。除了这两个,还有个更复杂一些的方案,这个放到后面再聊。 ^_^

参考

  1. How Windows Update works
  1. Windows Server Update Services (WSUS)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值