记一次愚蠢的错误——微软的动态端口导致应用无法监听端口

发布于 2021-02-14  1.81k 次阅读


简述问题

之前Clash for Windows一直有无法监听端口,即General——Port一栏端口为0,代理无法正常工作的问题,但出现频率较低,并没有影响正常使用

后来屡次出现此问题,查看log得报错

Start Mixed(http and socks5) server error: listen tcp :7890: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

第一反应为端口占用/权限问题

尝试①:使用管理员启动Clash 未解决

尝试②:多种方法排查端口占用

tasklist|findstr "7890"
netstat -aon | findstr :7890
Get-Process -Id (Get-NetTCPConnection -LocalPort 7890).OwningProcess

均未找到于代理有关端口的任何应用,排除此猜想

故询问群友以提出解决方案

解决方案一

换端口,关闭Mixin

未解决(但一定程度上,思路对了,为之后问题定位提供了条件)

解决方案二

使用高端口

@Ragnarokkr.Xia 提出的解决方案

代理服务器成功运行,至此问题初步排查完毕

问题定位

通过查询GitHub中Dreamacro/clash项目的一篇discussion得知此问题并非个例,笔者联想到此前在Docker for win中遇到的相同报错,便在Docker的issues中查询问题,果然找到了有关issue,标题为:Unable to bind ports: Docker-for-Windows & Hyper-V excluding but not using important port ranges #3171

实用信息:

可知此问题并不来源于Clash/Docker,而是Windows的动态端口策略导致的错误,至此问题定向完成。

有关信息:微软文档中关于默认动态端口范围的文档

链接:https://docs.microsoft.com/en-US/troubleshoot/windows-server/networking/default-dynamic-port-range-tcpip-chang

文中可知设置动态端口范围的方法

netsh int ipv4 set dynamicport tcp start=[start_port] num=[end_port - start_port + 1]

注:请替换关键字,[start_port]为分配的起始端口,[end_port - start_port + 1]为须分配的端口数量

解决问题

To comply with Internet Assigned Numbers Authority (IANA) recommendations, Microsoft has increased the dynamic client port range for outgoing connections in Windows Vista and Windows Server 2008. The new default start port is 49152, and the new default end port is 65535. This is a change from the configuration of earlier versions of Windows that used a default port range of 1025 through 5000.

文档内注明了IATA所给的端口范围,故按照标准修改

首先设置Windows的动态端口范围,我这里使用的是按照标准的49152~65535,当然你也可以按照您生产环境中的实际需求来改动

添加动态端口范围:

netsh int ipv4 set dynamicport tcp start=49152 num=16384
netsh int ipv4 set dynamicport udp start=49152 num=16384

删除注册表中的一个键值:

reg delete HKLM\SYSTEM\CurrentControlSet\Services\hns\State /v EnableExcludedPortRange /f

重启电脑,完成更改

重新检查端口排除范围

完美

检查Clash是否能正常运行

问题解决

后记

微软是傻逼


铁路民航 | 轨交摄影 | 街机音游 | 集群运维