您現在的位置是:首頁 > 動漫首頁動漫

哎,這是個 Windows 的bug

由 鐵鍬少年 發表于 動漫2023-02-04
簡介驗證過程實驗環境準備搭建代理伺服器(squid http proxy),要求使用者名稱和密碼進行代理連線認證,配置為採用最基本的basic認證即可搭建 WSUS 更新伺服器,配置更新包檔案url重定向到CDN準備Windows 系統,版本資

win10系統怎麼禁止廣告彈窗

背景知識

Windows 更新的工作原理

1

Windows 伺服器更新服務

2

驗證場景

客戶端配置

服務端配置

驗證過程

實驗環境準備

復現步驟

分析過程

解決方案

參考

哎,這是個 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提供更新包檔案的下載服務。

整個場景的網路拓撲如下圖所示:

哎,這是個 Windows 的bug

企業內網使用者計算機經由HTTP代理服務進行系統更新,代理伺服器對使用者身份認證通過後,繼續請求更新伺服器(Update Server)。在內網使用者計算機獲得適用於該裝置的更新包資訊後,請求下載更新包檔案。該更新包檔案最終由CDN提供下載服務。

驗證過程

實驗環境準備

搭建代理伺服器(squid http proxy),要求使用者名稱和密碼進行代理連線認證,配置為採用最基本的basic認證即可

搭建 WSUS 更新伺服器,配置更新包檔案url重定向到CDN

準備Windows 系統,版本資訊:21H2 enterprise版本(作業系統內部版本19044。1202)

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更新”。

哎,這是個 Windows 的bug

一段時間後,在更新面板處顯示“正在下載進度為 0”。但等待較長時間後,仍無法下載更新。 最終會提示下載失敗。

哎,這是個 Windows 的bug

分析過程

透過wireshark抓包分析,過程如下:

如圖所示,更新包下載agent為 Microsoft-Delivery-Optimization(ms_do)

哎,這是個 Windows 的bug

更新包下載過程抓包如圖所示

哎,這是個 Windows 的bug

對以上抓包內容進行分析,可以得到以下描述過程,

哎,這是個 Windows 的bug

Microsoft-Delivery-Optimization(ms_do)首次請求下載更新地址後,未攜帶代理伺服器的認證資訊,在收到407(需要認證代理)的的返回報文後,再次請求下載更新地址後,攜帶認證資訊。此後收到了來自 update server的 302 重定向報文。此後,ms_do不再攜帶認證資訊進行新的地址請求。 對於更新包的下載

止步於此

!最終,下載超時後,提示下載失敗。

解決方案

這個問題在和微軟的同學多次交流後,他們承認了這是 Windows 的一個bug,並說不會在這個版本的 Windows 中修復了,會在後面的版本中修復。。。

哎,這是個 Windows 的bug

如果 Windows 一直沒有修復,針對這個問題有什麼解決方案呢?一個簡單的解決方案是將代理伺服器對使用者的認證要求去掉,這雖然能夠解決問題,但存在風險;進一步的方案是在代理伺服器上新增“白名單”,針對 Windows 更新包檔案的請求不再驗證使用者身份,直接放行,其他網路訪問要求認證。除了這兩個,還有個更復雜一些的方案,這個放到後面再聊。 ^

_

^

參考

How Windows Update works

Windows Server Update Services (WSUS)