網路功能
追蹤難以捉摸的網路問題
Christopher Stoneff
摘要:
- 網路問題的常見起因
- 忽略最明顯的因素
- 當疑難排解工具沒用時
- 為什麼需要設定連線限制
這種情況您可能見過很多次 — 您的機器無法跟其他機器通訊,是什麼原因您完全沒有頭緒。您的管理系統位於路由網路的其中一段,透過路由器的方式 (例如 Microsoft Internet
Security and Acceleration (ISA) Server 或其他硬體裝置) 與其他網路區段連線。當您嘗試管理 10、20 或甚至 100 部系統時,不會遇到什麼問題。但是當您嘗試管理 500 部系統時,除了電腦已經開啟連線的機器以外,它無法在網路上進行通訊。您無法與任何其他系統通訊,連不上網際網路,但是網路上 (包括您區段上) 的電腦都沒有發生這個情況。您要先從哪裡著手找出問題呢?
診斷問題
這種情況最常見的判斷是管理軟體有問題。許多主動式管理工具都會連線到您的系統並進行管理,但是有時候您嘗試追蹤的問題可能是這些工具本身所引起的。這是因為主動式管理工具可能會假借促進管理之名,產生上千個連線連到您的裝置。Windows® 預設會讓這些連線保持開啟狀態達兩分鐘的時間,即使連線閒置也一樣,除非工具、應用程式或服務讓它們存留更久的時間。換句話說,即使您的管理系統在兩分鐘內未與任何機器交談,還是可能有超過 1,000 個開啟中的連線 (您可以在命令提示執行 NETSTAT 來查看開啟中的連線。NETSTAT 命令會向您顯示系統所有開啟中、擱置中和關閉中的連線,並提供它們的狀態。狀態訊息的說明可在 RFC 793 中找到,網址是 tools.ietf.org/html/rfc793)。
若要排除故障的管理軟體,您可以建立一個批次檔來建立與遠端系統的連線。如果在執行批次檔時還是遇到相同的問題,您就知道管理軟體和它的執行緒是清白的。下面是所需批次檔的內容範例:
Net use \\system01\ipc$ Net use \\system02\ipc$ Net use ...
如果剛剛提到的管理程式剛好會實作自己的網路和驗證堆疊,它有可能正是罪魁禍首,但是在沒有代理程式的解決方案中 (這些管理套件絕大多數都是這種情況),工具便會使用作業系統的網路和驗證堆疊來執行網路作業。使用批次檔來啟動一樣多的網路連線而不導致失敗,便可證明問題並非出自於程式使用作業系統的網路和驗證堆疊,因為批次檔也同樣使用它們。
越幫越忙的記錄檔和錯誤訊息
您可能已經注意到隨著連線開始失敗,您也跟著收到錯誤的失敗資訊:錯誤 53 — 找不到網路路徑,錯誤 64 — 網路名稱已刪除,以及錯誤 1203 — 網路提供者都不接受指定的網路路徑。所有這些錯誤通常可能表示是名稱解析的問題,但是所有其他機器在解析名稱和連線到相同系統時並沒有任何問題。若要確認您的電腦設定沒有錯,只要執行 ipconfig 來確認您的設定是否正確。
接下來,由於問題似乎是跟您的管理系統有關,因此您應該查看事件記錄檔。搜尋應用程式記錄檔沒什麼斬獲,但是在系統記錄檔中您發現到事件來源 TCP/IP 發出一個警告事件 4226,指出已達最大連線數目 (見 [圖 1])。
Figure 1** TCP connection limit has been reached **
在 Microsoft® 知識庫徹底搜尋連線限制方面的資訊,可以找到有對未完成的連線施加的連線限制,但對已完成連線並沒有任何限制。您可以在 HKLM\System\CurrentControlSet\Services\TCPIP\Parameters 底下調整下列登錄項目來控制上述因素:TcpNumConnections 是用來 TCP 可以同時開啟的最大連線數目 (預設為 10)。TCPTimedWaitDelay 則會設定連線在關閉時保持 TIME_WAIT 狀態的時間。預設一半的時間是 120 秒,也就是說連線基本上是使用 4 分鐘的時間。最後,MaxFreeTcbs 也在最大連線數目扮演著舉足輕重的角色。如果 TCP 控制區塊全都在使用中,即使 TCPTimedWaitDelay 尚未到期,TCP 還是應該釋放列為 TIME_WAIT 狀態的連線,以建立更多連線。TCPTimedWaitDelay 的值範圍是 30-300 秒 (0x1E – 0x12C)。
根據您的情況而定,變更這些登錄內容可能可以在整體效能上看到微幅的改進。另外一個您可以嘗試的步驟是修補 TCPIP.sys 檔案來移除這些限制,但這只能提升 P2P 應用程式的效能。
網路擷取
在試過其他解決連線問題的方法都不成功後,對相關機器進行網路擷取看似蠻有希望的。在我執行 Microsoft 網路監視器 (Netmon) 後,它產生的擷取所顯示的結果跟我在管理工具和測試指令碼中看到的一模一樣:剛開始一切運作正常,後來就失常了,連一個錯誤訊息都沒有。
**[圖 2]**顯示執行 Netmon 的結果,指出前 n 個系統間的通訊成功。請注意,我是取得 RPC 要求的認可。您想看到的結果是 — 成功的雙向通訊。
Figure 2** Successful communication in Netmon **(按影像可放大)
您現在需要查看一下從管理系統和看似出現錯誤 53/1203 的遠端系統所得的擷取。如您所預期,沒什麼好看的,因為機器之間並沒有通訊。在 [圖 3] 中的網路擷取,管理系統已解析 IP 位址,並嘗試透過連接埠 445 (Microsoft SMB 連接埠) 連線到系統,但是沒有收到任何回應。
Figure 3** Attempts to connect to the system over port 445 yield no response **(按影像可放大)
當您擁有的執行緒超過機器目前可以連線的數目時,所收到的錯誤不一定都是一樣的。在某些情況下,您可能會從來源系統看到錯誤 53,指出您已收到名稱解析,但是怎麼樣就是找不到 IP 位址。這表示 DNS 提供了一個您無法連線的位址。您也可能收到錯誤 1203,指出沒有任何機器回應您所要求的名稱或 IP 位址。錯誤 1203 在這種情況下表示您無法使用 DNS。如果您執行 nslookup,也會碰到這種情況。
此時您肯定是信心大挫,但還有其他選項可以考慮。由於問題以下面的方式自我呈現,因此絕大多數的人甚至不會想到要查看連線基礎結構:您的機器是唯一不能連線到網路其餘部分的電腦,而事件記錄檔指出您的機器已達允許連線的最大數目,因此問題看起來不像是架構上的問題。
雖然您的管理解決方案並不會同時起始上千個連線,但是一直存留的傳輸和連線逾時,可能表示在任一時刻擁有的開啟中連線比您想像中得多。因此,您也必須檢查那些連接到您的網路其餘部分的系統。
且聽我一一分曉,我之前說過,隨著網路流量通過您的網路,它也會通過交換機、路由器,甚或是防火牆。通過當中任何一點時 (通常是路由器或防火牆),您可能會碰到入侵偵測系統。受管理的交換機和路由器也可能採用流量篩選。無論是您或其他對這些裝置有控制權的使用者,都需要檢查記錄檔以尋找錯誤或警告。通訊問題很可能就出於這些系統內。
由於您是從內部系統連線到其他內部系統,所以可能發現並未產生任何警示,因為裝置上並沒有設定警示功能,或是因為問題根本不算是入侵或阻絕服務 (DoS) 攻擊。同樣地,您應該從記錄檔著手。舉 ISA Server 為例,這些記錄檔可在 ISA Server 管理主控台中找到,位置是 [陣列]\[<陣列名稱>]\[監視]\[記錄]。
如果封鎖您的是原則,您可以 (就 ISA Server 的例子而言) 尋找下列結果碼,當中的來源 IP 是您的管理電腦:
- 0xc0040037FWX_E_TCP_RATE_QUOTA_EXCEEDED_DROPPED
- 0xc004000dFWX_E_POLICY_RULES_DENIED
- 0xc0040017FWX_E_TXP_SYN_PACKET_DROPPED
如果找到這類的結果,表示您已找出連線問題的根源。
實作解決方案
識別出問題後,解決辦法也許很簡單,但是部門原則可能會使它難以實作。在進行任何變更之前,確定您有適當的權限進行這個動作,因為您不一定可以在防火牆、路由器和/或入侵偵測系統上建立安全性設定的排除原則。
同樣舉 ISA Server 為例,下列步驟說明如何增加特定主機或網路中所有機器的最大連線數目 (如 [圖 4] 所示)。開啟 ISA Server 管理主控台,並巡覽至 [陣列]\[<陣列名稱>]\[設定]\[一般]\[設定洪水安全防護功能設定]。
Figure 4** Increase the maximum number of connections for one host or all machines using ISA Server **
兩個值得注意的設定是 [每一 IP 位址的同時 TCP 連線數上限],以及 [每分鐘,每一 IP 位址的 TCP 連線要求數上限]。[每一 IP 位址的同時 TCP 連線數上限] 一般所設的值就足以應付沒有發生任何主動管理的情況,表示沒有任何電腦可以快速地主動連線至上千部其他機器。在 ISA Server 中,同時 TCP 連線數上限的預設限制是 160。每分鐘,每一 IP 位址的 TCP 連線要求數上限是為了限制網路掃描的毀損和可見度而設計的。預設限制是每分鐘每一 IP 有 600 個連線要求。
前面曾提到,如果沒有其他項目嘗試保存連線,則即使連線不在使用中,Windows 會也讓連線存留一段為時兩分鐘的預設時間。這表示即使您已經成功管理一部電腦,而且不再需要與它通訊,連線還是會保持作用狀態。這個開啟的連線也會計入您分配的連線總數。重複這個程序超過 160 次而不移除任何連線的話,您就會發現到所有嘗試的連線都會遭到您的路由器拒絕。即使您的管理程式主動刪除工作階段,Windows 還是可能把連線保持在 time_wait 的狀態,等候目標機器同意中斷工作階段的連線。
開始對嫌疑最大的兇手進行調整:每一 IP 位址的同時 TCP 連線數上限。您應該設定這個值,這樣一來您的管理機器就能夠建立所需的全部連線來管理您的系統,而不會遭到存取拒絕。按一下設定旁邊的 [編輯] 按鈕,並變更各值。
下一個提示 (見 [圖 5]) 有個 [限制] 方塊,代表預設限制,適用於所有用戶端。[自訂限制] 會套用到洪水安全防護功能對話方塊的 [IP 例外狀況] 索引標籤上定義的所有機器、網路等。如果您希望允許每部機器建立更多連線,那麼請變更 [限制] 的值。若只要設定管理機器的例外狀況,請調整 [自訂限制],然後將您的機器新增至 [IP 例外狀況] 索引標籤。一般來說,只允許您自己的機器的例外狀況是比較妥當的做法。
Figure 5** Default connection limit and custom connection limit **
如果您希望使用自訂限制,只針對特定系統修改此值,那麼請變更 [自訂限制] 欄位中的值,然後按一下 [確定]。接著將您的機器新增至洪水安全防護功能對話方塊上的 [IP 例外狀況] 索引標籤。若要將單部電腦新增至例外狀況清單,請在 [IP 例外狀況] 上按一下 [新增] 以叫出 [電腦組] 對話方塊。按一下 [新增] 來新建一個網路組,以包含您的系統 (如果包含這些機器的網路組不存在的話)。選取這個網路組,再按一下 [新增] 以加入 [內部網路] 網路組,然後按一下 [關閉]。再次選取 [內部網路] 網路組,並按一下 [編輯]。這將開啟 [內部網路] 的內容 (見 [圖 6])。按一下此對話方塊上的 [新增] 來顯示子功能表,您可以從中選擇新增電腦、位址範圍或子網路;請選擇電腦。輸入用來識別項目的名稱、機器的 IP 位址,以及描述,讓稍後查看這個項目的使用者不會覺得有必要移除您的系統 (見 [圖 7])。按一下 [確定] 以新增您的系統,再按一次以新增例外狀況。做了這些變更之後,您必須套用設定。
Figure 6** Internal networks properties settings **
Figure 7** Enter computer name, IP address, and description to ensure your system is not removed **
再試一次您的主動式管理工具,您應該會發現效能改善許多,而且連線並未失敗 — 至少不會因為網路流量造成失敗。結果原來問題並不是出在軟體所啟始的連線數目,而是因為對那些連線缺乏妥善規劃而導致服務中斷。
心得
在 IT 業中最頭痛的問題之一,就是遇到和解決真的很難以捉摸的問題。這些問題不是使用者製造的,不是伺服器小組引起的,也不是支援工程師了解的,而不幸的是,您可能得靠自己解決這些問題。有很多工具可以幫助您進行疑難排解、隔離和解決問題,但有時光靠工具是不夠的。工具有時候甚至會誤導您,這時您得要機靈點,別被工具騙了。
下次要是發現自己無緣無故沒法在網路的幾部機器上建立連線,不妨試試本文描述的步驟。遵循這些步驟、仔細查看您的管理軟體,還有適當設定可允許的連線,您很有可能就可以順利解決問題。
Christopher Stoneff 在 Lieberman Software (liebsoft.com) 擔任產品經理,這是一家安全性和系統管理軟體的開發商。Chris 所持有的技術認證多得誇張。他的幹勁來自於不只要知道事情的運作方式,還要了解背後的原因。
© 2008 Microsoft Corporation and CMP Media, LLC. 保留所有權利;未經允許,嚴禁部分或全部複製.