簡體   English   中英

如何查看在 Windows 上保留臨時端口范圍的內容?

[英]How to see what is reserving ephemeral port ranges on Windows?

我有一個需要使用端口5000550006的 Windows 應用程序,但它被阻止了。

當我運行netsh int ip show excludedportrange protocol=tcp時,我看到以下內容:

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
5357        5357
49709       49808
49809       49908
49909       50008
50009       50108
50109       50208
50280       50379

* - Administered port exclusions.

所以我機器上的某些東西將端口49909保留到50008 ,這可能是導致我的應用程序失敗的原因。 我嘗試使用以下命令刪除此excludedportrange

netsh int ip delete excludedportrange protocol=tcp numberofports=100 startport=49909

但我看到一個錯誤Access is denied. ,這讓我認為保留此端口的任何東西都在積極運行,但我不知道那可能是什么。

同樣奇怪的是,在運行該命令后,即使我看到一個錯誤,如果我重新啟動, excludedportrange也會有所不同。

作為健全性檢查,我還運行resmon.exe並確認端口5000550006上沒有運行任何內容。

我怎么知道是什么添加了excludedportrange

編輯:我已將其縮小到 Hyper-V。 如果我禁用 Hyper-V,則不會排除這些端口。

調查並釋放港口

Hyper-V 似乎保留了隨機端口(或至少與 Hyper-V 相關的端口)。 使用netsh int ip show excludedportrange protocol=tcp確認不工作的端口在輸出中。

對我來說可以釋放端口。 這對我來說似乎並不打擾(25 個豎起大拇指):

這通常是由 Windows NAT 驅動程序 (winnat) 引起的,停止並重新啟動該服務可能會解決問題。

 net stop winnat docker start ... net start winnat

在此之后端口不再保留,但我的 WSL2 終端不再連接到互聯網,因此我需要在此之后重新啟動以使一切恢復正常。

從現在開始保留港口

如果你不做更多的事情,你很可能會再次遇到這個問題。 因此,例如保留端口 9012 和 9013 以供您將來使用(因此winnat從不嘗試使用它們):

netsh int ipv4 add excludedportrange protocol=tcp startport=9012 numberofports=2

(感謝@Venryx 提醒我)

其他方法

在回答關於為什么docker 無法打開端口(24 個贊)的類似問題時,這也對我有用:

netcfg -d --這將清理所有網絡設備,並需要重新啟動

不過,確實有人對此提出警告(4 個豎起大拇指)。 您的郵件可能會有所不同。 它對我有用,主要是因為我在成功運行它之后才看到以下警告......

那個( netcfg -d )是危險的命令,它破壞了我的 docker 並且不再啟動。 即使在重新安裝 HyperV 之后。 並重新啟動機器。 該命令似乎刪除了幾個網絡適配器。 重新啟動也無濟於事。 我不得不重置(松散)容器和圖像,但這導致了另一個問題

另一個對類似 docker question 的回答(129 點贊)有這個,但對我來說似乎更重要,所以我沒有嘗試:

@veqryn 解決方法對我有用,步驟是:

  1. 禁用 hyper-v(這將需要重新啟動幾次)

    dism.exe /Online /Disable-Feature:Microsoft-Hyper-V

  2. 當你完成所有必需的重啟后,保留你想要的端口,這樣 hyper-v 就不會保留它

    netsh int ipv4 add excludedportrange protocol=tcp startport=50051 numberofports=1 store=persistent

  3. 重新啟用 hyper-V(需要重啟幾次)

    dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

當您的系統恢復后,您將能夠成功綁定到該端口。

在不沖突的地方設置 Windows“動態端口范圍”

我們設法解決了這個問題,因為您無法將端口的需求更改到其他位置(例如不可配置的應用程序)。

當您發出命令時:

netsh int ip show excludedportrange protocol=tcp

您會得到一個輸出,其中包含保留的端口范圍列表:

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
     33474       33573
     50000       50059     *
     58159       58258
     58259       58358
     58359       58458
     58459       58558
     58559       58658
     58659       58758
     58759       58858

* - Administered port exclusions.

最可能的原因是 Windows Hyper-V(微軟的硬件虛擬化產品)保留了隨機端口范圍(通常是 100 個端口的塊)。 這變得很痛苦,因為如果您正在開發使用多個端口的應用程序或更大的解決方案,有時您會遇到沖突,而有時在重新啟動系統后不會

要查找“動態端口范圍” ,您可以發出命令:

netsh int ipv4 show dynamicport tcp

答案:

Protocol tcp Dynamic Port Range
---------------------------------
Start Port      : 1024
Number of Ports : 64511

您可以指示 Windows 在沖突區域之外修改此范圍。

假設您的開發在端口 60000 以下,您可以發出以下命令來限制動態端口范圍(您必須具有管理員權限)

netsh int ipv4 set dynamic tcp start=60001 num=5534

要使 Hyper-V(和一般的 Windows)使用這個新的動態范圍,您必須重新啟動系統。

現在,如果我們請求排除的端口范圍:

netsh int ip show excludedportrange protocol=tcp

響應已更改:

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
     50000       50059     *
     63904       64003
     64004       64103
     64105       64204
     64205       64304
     64305       64404
     64405       64504
     64505       64604
     64605       64704

* - Administered port exclusions.

只有“管理的端口排除”仍然低於端口 60001

我遇到了同樣的問題並卸載了 Hyper-V,但保留端口仍然存在。 經過幾次嘗試,我確定Windows Sandbox是要卸載的罪魁禍首

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM