跳到主要内容
  1. Blog/

Windows 11 网络访问异常

··字数 1670·4 分钟

不知你们是不是有过这样的经历,在 windows 10 或者 windows 11 下,在某一次系统更新后,原来一些可以连接网络的程序,报告程序异常。 有悟前后碰到过两次,同一个程序。第一次没细究,换了新端口号重启后能继续正常使用,就没有细究,以为端口被占用了。其实还有另外一种可能的情况。

有悟第一次碰到 系统更新后程序无法访问网络的情况 是发生在 windows 10 上。原使用端口 1090,在网络上找了一个类似问题的答案后,把端口尝试改为 2090以后,该程序可以正常连接网络。 有悟半信半疑,1090 的端口可能被占用了,但是还是很怀疑,因为使用 netstat 查不到 1090 的记录,难道有隐藏的占用?不应该吧,虽然有悟对 netstat 命令不熟悉,但微软的系统管理维护工具不可能这么弱鸡吧。反正可以用了,就没管它。

系统更新
系统更新

最近(2021年12月15日),有悟更新了 windows 112021年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 防火墙 中查找相关的程序配置是相当费眼神的,建议可以先看是否是程序使用的端口号是系统禁用的预留端口号,因为后者可以很快就得到答案。关于如果查询系统所禁用的预留端口号,请看下一节。

防火墙的设置有两个地方:

  1. 允许应用通过 Windows 防火墙
    允许应用通过 windows 防火墙
    允许应用通过 windows 防火墙
  2. 高级安全 Windows Defender 防火墙
    高级安全 windows defender
    高级安全 windows defender

以上两个的直接入口在:

控制面板\系统和安全\Windows Defender 防火墙
控制面板\系统和安全\Windows Defender 防火墙

打开以上设置的路径有几个:

  • 如果习惯从控制面板进入的,在 控制面板 地址栏、资源管理器 地址栏输入 控制面板\系统和安全\Windows Defender 防火墙
  • 如果已经习惯使用开始菜单搜索功能的,在开始菜单搜索 安全中心防火墙和网络保护允许应用通过 Windows 防火墙

建议学习开始菜单的搜索功能,因为你只要记得名称或者关键词即可,无需花时间去记隐藏在多个应用子菜单下的功能。

在win菜单中搜索
在win菜单中搜索

系统预留端口 #

使用命令 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