Windows 11 网络访问异常
目录
不知你们是不是有过这样的经历,在 windows 10 或者 windows 11 下,在某一次系统更新后,原来一些可以连接网络的程序,报告程序异常。 有悟前后碰到过两次,同一个程序。第一次没细究,换了新端口号重启后能继续正常使用,就没有细究,以为端口被占用了。其实还有另外一种可能的情况。
有悟第一次碰到 系统更新后程序无法访问网络的情况 是发生在 windows 10 上。原使用端口 1090
,在网络上找了一个类似问题的答案后,把端口尝试改为 2090
以后,该程序可以正常连接网络。
有悟半信半疑,1090
的端口可能被占用了,但是还是很怀疑,因为使用 netstat
查不到 1090
的记录,难道有隐藏的占用?不应该吧,虽然有悟对 netstat
命令不熟悉,但微软的系统管理维护工具不可能这么弱鸡吧。反正可以用了,就没管它。
最近(2021年12月15日),有悟更新了 windows 11 了 2021年12月累积更新 包,之前的状况又再一次出现了。由于同一个问题多次出现,那就有必要深入了解下,看是否能把问题搞清楚。
而程序命令所反馈的错误是这样的:
...
A unified platform for anti-censorship.
2021/12/15 18:34:22 [Info] main/jsonem: Reading config: ..\config.json
Failed to start app/proxyman/inbound: failed to listen TCP on 2096 > transport/internet: failed to listen on address: 0.0.0.0:2096 > transport/internet/tcp: failed to listen TCP on 0.0.0.0:2096 > listen tcp 0.0.0.0:2096: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
...
日志中反应了无法正常建立网络连接,无法监听 2096
端口。其中重点是 bind: An attempt was made to access a socket in a way forbidden by its access permissions,它是操作系统返回来的错误信息,如果使用 python 或者 其它语言编写网络程序,请求监听 2090
端口,都是返回这个相同的错误。
那么它到底是什么意思呢?从字面意思理解,结合常识,第一反应是防火墙,但直觉告诉有悟,很可能不是。因为如果是防火墙问题,应该会自动弹出连接网络的确认对话框(有悟并没有对系统的防火墙做过禁用方面的设置。)
在国外一些技术论坛的相关问答帖子上,有悟找到了答案。出现程序无法访问网络的原因,大概有如下原因:
- windows denfender 防火墙
- 系统预留端口(有些系统组件或者服务需要使用一些端口,系统会预留出端口段,以保证系统服务的正常启动)
windows defender 防火墙 #
一般,如果你没有设置过系统自带的 defender 防火墙的,那么是不需要理会它的,因为通常情况下防火墙会识别出请求访问网络的程序是否已经允许的名单上,如无记录,会自动提示。 不过,有时可能太久了,并没这方面的印象,那么可以按照下面介绍的方法去查看。在 允许应用通过 Windows 防火墙 中查找相关的程序配置是相当费眼神的,建议可以先看是否是程序使用的端口号是系统禁用的预留端口号,因为后者可以很快就得到答案。关于如果查询系统所禁用的预留端口号,请看下一节。
防火墙的设置有两个地方:
- 允许应用通过 Windows 防火墙
- 高级安全 Windows Defender 防火墙
以上两个的直接入口在:
打开以上设置的路径有几个:
- 如果习惯从控制面板进入的,在 控制面板 地址栏、资源管理器 地址栏输入
控制面板\系统和安全\Windows Defender 防火墙
。 - 如果已经习惯使用开始菜单搜索功能的,在开始菜单搜索 安全中心、 防火墙和网络保护 、允许应用通过 Windows 防火墙。
建议学习开始菜单的搜索功能,因为你只要记得名称或者关键词即可,无需花时间去记隐藏在多个应用子菜单下的功能。
系统预留端口 #
使用命令 netsh interface ipv4 show excludedportrange protocol=[tcp|upd]
查看系统预留的端口号段,命令的输出长这样:
> netsh interface ipv4 show excludedportrange protocol=tcp
协议 tcp 端口排除范围
开始端口 结束端口
---------- --------
1359 1458
1459 1558
1669 1768
2001 2100
2222 2321
5357 5357
18000 18000
50000 50059 *
* - 管理的端口排除。
> netsh interface ipv4 show excludedportrange protocol=udp
协议 udp 端口排除范围
开始端口 结束端口
---------- --------
49671 49770
50000 50059 *
55199 55298
55299 55398
55910 56009
58133 58232
* - 管理的端口排除。
如果你的程序在系统更新后无法正常连接网络时,可以先查下程序是否有指定的固定端口号,该端口是否包含在上面两个命令所列出端口号段列表中(因为它比你查看 windows defender 防火墙配置方便),若是,先把端口号改一下再重启程序看看。
有悟的使用的 2096
端口就在 tcp 协议的预留端口号段 2001-2100 区间上,所以被系统阻止了。
微软工具的汉语翻译有点奇怪,就不能请几个正常的中国人来参与 i18n 吗。
你们看 excluded port range 应该如何翻译呢?到底是相于什么的 excluded 呢?是用户不能使用,还是防火墙会默认不拦截呢?
本文部分内容参考了这个问答, https://stackoverflow.com/questions/58216537/what-is-administered-port-exclusions-in-windows-10