[英]How to see what is reserving ephemeral port ranges on Windows?
我有一個需要使用端口50005
和50006
的 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
並確認端口50005
和50006
上沒有運行任何內容。
我怎么知道是什么添加了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 解決方法對我有用,步驟是:
禁用 hyper-v(這將需要重新啟動幾次)
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
當你完成所有必需的重啟后,保留你想要的端口,這樣 hyper-v 就不會保留它
netsh int ipv4 add excludedportrange protocol=tcp startport=50051 numberofports=1 store=persistent
重新啟用 hyper-V(需要重啟幾次)
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
當您的系統恢復后,您將能夠成功綁定到該端口。
我們設法解決了這個問題,因為您無法將端口的需求更改到其他位置(例如不可配置的應用程序)。
當您發出命令時:
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
假設您的開發在端口 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.