An attempt was made to access a socket in a way forbidden by its access permissions 解决办法
关于 EnableExcludedPortRange 这个注册表键值,它的开启(1)和禁用(0)分别代表两种完全不同的端口分配策略。我整理了一张对照表,方便你理解:
| 设置状态 | 数值 | 行为表现 | 对你的影响 |
|---|---|---|---|
| 开启(系统默认) | 1 |
动态随机保留。每次重启,系统会在低端口(如 8000~9000)随机圈一块地作为系统专用。 | 缺点:你的 8002 随时可能被系统抽签抽中,导致报错。优点:系统会主动为 WSL2/Docker 的虚拟网络避让低端口,减少容器网络底层冲突。 |
| 禁用(推荐修复) | 0 |
取消随机保留。系统不再主动圈占低端口,所有端口(包括 8002)都允许普通程序监听。 | 优点:你的 8002 彻底解放,再也不会被随机抢走。缺点:系统不再主动为虚拟网络避让,极少数情况下容器映射端口可能与宿主机程序产生竞争关系(竞争,但非不能用)。 |
📌 准备工作:以管理员身份打开终端
所有操作都必须拥有最高权限。
- 按键盘上的
Win + X键。 - 在弹出的菜单中,点击 “终端(管理员)” 或 “命令提示符(管理员)”。
- 如果弹出用户账户控制(UAC)提示,点击 “是”。
第一步:查看当前状态(确认问题)
在执行修改前,先看一眼系统现在的样子,方便前后对比。
复制并粘贴以下命令,按回车:
netsh interface ipv4 show excludedportrange protocol=tcp
你会看到类似这样的输出:
Start Port End Port
---------- --------
8000 8010 <-- 如果这里包含 8002,就是它害你报错!
5000 5010
* ...
如果输出列表里确实有 8002,说明你的问题就是“随机保留”导致的。
第二步:关闭随机保留机制(核心修复)
这一步会直接解决你的报错。我们通过修改注册表,让系统别再乱圈 8002 这块地。
依次复制并执行以下 2 条命令(每条执行完按回车):
命令 1(创建注册表目录):
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Services\hns\State" -Force
命令 2(将随机保留功能关闭,设为 0):
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\hns\State" -Name "EnableExcludedPortRange" -Value 0
(注:执行完不会有任何成功提示,这是正常的)
第三步:必须重启电脑
这一步绝对不能省略! 注册表的修改必须经过重启才能被系统内核加载生效。
关闭所有工作,重启你的 Windows 11 电脑。
第四步:验证修复是否成功
电脑重启后,重新以管理员身份打开终端,再次执行第一步的查看命令:
netsh interface ipv4 show excludedportrange protocol=tcp
检查输出结果:
你会发现 8002 已经从保留列表中消失了!此时,再次启动你的程序,8002 端口应该就能顺利监听了。
🔄 附赠:万一出问题,怎么恢复原状(回滚教程)
如果你发现关闭随机保留后,WSL2 无法启动或 Docker 容器网络变得极其卡顿(虽然 99% 的情况下不会),可以按以下步骤一秒恢复系统默认设置:
- 以管理员身份打开终端。
- 执行以下命令(把
0改回1,代表重新开启随机保留):Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\hns\State" -Name "EnableExcludedPortRange" -Value 1 - 再次重启电脑,系统就彻底恢复成你改之前的原始状态了。
🛠️ 终极备用方案(不关随机,只保 8002)
如果你不想动注册表,只想让系统别抢 8002 这一个端口,也可以用 netsh 手动给它加个“永久护盾”:
(以管理员身份运行)
netsh int ipv4 add excludedportrange protocol=tcp startport=8002 numberofports=1 store=persistent
(将来想删除这个护盾,把 add 换成 delete 即可)
如果执行提示:The process cannot access the file because it is being used by another process.
以管理员身份按顺序执行以下两个命令重启服务,然后再执行上述命令就可以了
net stop winnat
net start winnat
📝 总结操作清单
为了不让你看花眼,你今天只需要做这三步:
- 管理员终端执行
Set-ItemProperty ... -Value 0。 - 重启电脑。
- 启动你的程序,收工。
- 绝大多数开发者将值设为
0(禁用)后,WSL2 和 Docker 都能完美运行,几乎没有副作用。 - 万一你真的遇到了网络异常,用我上面的回滚命令恢复即可,电脑不会因此变砖。

浙公网安备 33010602011771号