☰
Windows下ConnectionRefusedError 10061排查:防火墙端口放行实战
2026/10/5 4:20:44 网站建设 项目流程

见过太多人被这句报错折磨了。

ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

第一次看到"积极拒绝"这四个字,我愣了半天,计算机还能"积极"拒绝我?后来才明白,这句翻译其实非常精确——你的连接请求被明确弹回来了,对方压根没打算处理。结合标题里的关键词,这篇就专门聊Windows环境下怎么处理这个问题,重点是防火墙端口放行,但我会先把报错背后的逻辑讲透,因为只教开端口不教排查,下次换个端口你照样抓瞎。

先说适用范围:Windows本机服务连不上、局域网内别的机器连不到你这台Windows、Docker容器端口映射之后外部无法访问、虚拟机里跑服务宿主机连不上,这几个场景都用得上。文章按"先搞懂报错原因 → 再确认服务状态 → 然后配置防火墙 → 最后处理特殊情况"的顺序来写,每一步都给出可复现的命令和操作。

1. 报错本质与定位思路:先搞清楚"积极拒绝"到底是谁在拒绝

1.1 WinError 10061和超时的本质区别

很多人分不清"拒绝连接"和"连接超时"的区别,这俩的排查方向完全不一样。

拿打电话做个类比。连接超时相当于你拨号之后对方一直不接,响了几十秒直到运营商提示"暂时无法接通"。而WinError 10061更像是你打过去,对方秒接然后说了一句"这里没人,你打错了",啪地挂了。这说明什么?说明链路是通的——数据包确实到达了目标机器,但目标机器的目标端口上,压根没有程序在监听,或者监听程序直接拒绝了你的请求。

这个区别在排查时特别关键。如果报错是timeout,你要查的是网络连通性,比如网段隔离、其他防火墙拦截、路由问题。但报错是ConnectionRefusedError,网络链路大概率没问题,问题出在目标端口对应的服务状态、监听地址设置,或者防火墙规则上。

1.2 三层排查法:先诊断,再动手开端口

标题虽然直接指向防火墙,但我必须说一句:遇到10061先别急着开防火墙,因为防火墙只是三层原因之一。我的习惯是先跑一遍"三层排查法":

  1. 服务监听层:目标服务真的在跑吗?监听在哪个IP和端口上?用netstat -ano | findstr 端口号看。
  2. 网络链路层:从客户端到服务端的IP路由和物理链路通不通?用ping和telnet验证。
  3. 防火墙过滤层:Windows防火墙(或第三方安全软件)是否拦截了入站连接?规则配错、配置文件不对、端口范围没覆盖都会导致问题。

三层都过了还连不上,那才是真正罕见的网络环境问题。而现实中,绝大多数10061要么是服务没起来,要么是防火墙端口没放行。标题既然聚焦防火墙,我会在第2章先把服务监听讲清楚,第3章再详细讲防火墙配置,避免你在错误的方向上白费力气。

2. 动手配防火墙之前:用netstat和telnet确认服务真实状态

2.1 查看端口监听状态的正确姿势

假设你要访问的是9200端口(Elasticsearch常见端口),在运行服务的Windows机器上打开命令行,执行:

netstat -ano | findstr 9200

这条命令的输出结果有几种情况,我逐一说明:

  • 没有任何输出:说明9200端口上根本没有程序监听。这时候去看服务是否启动,比如ES的进程是否正常,或者服务启动日志是否报错。
  • 输出形如TCP 0.0.0.0:9200 0.0.0.0:0 LISTENING 12345:说明服务正常监听,地址是0.0.0.0(所有网卡),PID是12345。
  • 输出形如TCP 127.0.0.1:9200 0.0.0.0:0 LISTENING 12345:这里要警惕,服务只监听了回环地址。这种状态下本机能连,但局域网其他机器、虚拟机、Docker容器统统连不上,而且这时候你配防火墙也没用,因为数据包根本到不了这个服务。

0.0.0.0表示监听所有网卡,127.0.0.1表示只监听本机回环。如果是后者,你需要修改服务的bind地址配置,把它改成0.0.0.0或者具体的内网IP,这是很多新手忽略的关键点。

顺带一提,很多把Windows当开发机的朋友习惯用127.0.0.1或者localhost访问服务,但同一局域网内其他电脑访问你这台机器时,必须要用这台Windows机器的内网IP,而不是localhost。这个看似基础的问题,实际排查时造成困惑的次数非常多。

2.2 用telnet或PowerShell命令做端口连通测试

确认服务在监听之后,从出问题的客户端机器上测试端口连通性。Windows自带的telnet客户端默认可能没启用,但你可以直接用PowerShell自带的测试命令:

Test-NetConnection 192.168.1.100 -Port 9200

这个命令会显示TcpTestSucceeded : True或False,非常直观。

如果你偏好传统方式,先在客户端Windows上启用telnet客户端,然后执行:

telnet 192.168.1.100 9200

如果屏幕全黑或显示一个光标在闪,说明连接成功。如果提示"正在连接...无法打开到主机的连接"或者直接快速退出,说明端口不通。

到这里你就能判断出问题大致出在哪一层了:

  • 本机能连(用localhost能访问),局域网机器不能连:大概率是监听地址或防火墙问题,重点看第3章。
  • 本机都不能连(localhost也报10061):服务本身没起来或监听在错误地址,先解决服务问题再谈防火墙。

2.3 关于服务启动方式的补充

这一节补充一点常见实践。像Elasticsearch、Redis这类服务在Windows上跑,很多人习惯直接双击bat文件或者用java -jar方式启动,窗口一关服务就没了。如果你希望服务常驻后台,建议注册成Windows服务或者用任务计划程序方式启动(即使用nssm这类工具也能实现)。服务监控这块容易忽略,经常出现你开机忘了启动服务,然后客户端那边疯狂报10061,排查半天以为是防火墙问题。

3. Windows防火墙端口放行:图形界面和命令行两种方式

3.1 使用图形界面(wf.msc)配置入站规则

如果前面确认了服务正常、监听在0.0.0.0,局域网却访问不了,那十有八九是Windows防火墙在拦截。打开防火墙配置界面:

  1. 按Win + R,输入wf.msc,回车,这是打开高级安全Windows Defender防火墙的快捷方式。
  2. 点击左侧"入站规则"。
  3. 在右侧操作栏点击"新建规则"。
  4. 规则类型选择"端口",下一步。
  5. 协议选择TCP(大多数服务都是TCP,如果你的服务是UDP,比如某些游戏服务器或DNS服务,就选UDP)。
  6. 特定本地端口填上你要放行的端口号,比如9200。如果要放行多个端口,用逗号分隔,比如9200,9300;如果是连续端口范围,用短横线,比如8000-9000。
  7. 操作选择"允许连接"。
  8. 配置文件勾选上"域"、"专用"、"公用"三个选项。这一步很多人会选错,后面单独讲。
  9. 名称填一个能认出来的,比如"Allow ES 9200",点完成。

这样入站规则就建好了。但实际使用中我经常发现一个问题:规则建好了依然不通。这时候优先检查配置文件勾选是否跟你当前的网络类型匹配。

3.2 三种网络配置文件的隐藏坑:域、专用、公用

Windows防火墙把网络环境分成三种配置文件:域配置文件(Domain)、专用配置文件(Private)、公用配置文件(Public)。系统会根据当前连接到的网络类型自动套用对应的配置文件。

这个机制是Windows防火墙最容易踩的坑。你新建规则时如果不小心只勾了"专用",而当前网络被系统识别为"公用",规则就不会生效。怎么确认当前网络类型?打开"设置 → 网络和 Internet → 状态",或者查看网络连接属性,Windows会标明当前网络是"公用网络"还是"专用网络"。

一个实用的建议:如果你不确定当前网络类型,新建规则时三个配置文件全勾上。这个方案虽然不够精细,但在内网调试环境下最省事。等确认问题解决了,再回头按需收紧。

3.3 用netsh命令快速添加、查看和删除规则

图形界面适合偶尔配置一次,但如果你要在多台Windows机器上重复配置,或者想把这套操作写进自动化脚本,命令行更高效。用管理员权限打开命令提示符或PowerShell,执行:

netsh advfirewall firewall add rule name="Allow ES 9200" dir=in action=allow protocol=TCP localport=9200

这条命令的含义是:添加一条入站规则,名为Allow ES 9200,方向为入站(in),动作为允许,协议为TCP,本地端口为9200。执行成功后会有"确定"提示。

查看当前已有的规则,确认是否添加成功:

netsh advfirewall firewall show rule name="Allow ES 9200"

比如要临时调试、事后删除规则,用:

netsh advfirewall firewall delete rule name="Allow ES 9200"

按常见实践讲几个细节:

  • dir=in是入站方向,处理别人访问你这台机器时用。设置出站规则用dir=out,但绝大多数连接失败场景是入站方向的问题。
  • 协议要跟服务端的传输层协议一致。TCP服务开了TCP端口规则,UDP服务要单独开UDP规则。
  • 如果既要TCP又要UDP(比如某些RPC服务),需要分别添加两条规则,没法一条命令同时指定两种协议。
  • 规则名不要起得太随意,后面你排查问题、清理规则时,规则名清晰会省很多事。

3.4 配置完成后立即可验证的命令组合

添加规则后,在你自己的Windows机器上马上自测一下:

Test-NetConnection localhost -Port 9200

再从另一台局域网机器测试一次:

Test-NetConnection 192.168.1.100 -Port 9200

如果本机通过,局域网机器不通,多半是网络配置文件或监听地址的问题,回到前面的章节对照检查。

提示:添加完规则之后,有些环境不需要重启防火墙服务或重启机器就能生效。但如果发现规则明明添加了却不生效,可以试试重启一下"Windows Defender Firewall"服务,或者用gpupdate /force强制刷新组策略。这个方法虽然听起来很基础,但在某些域环境下实测是有效的。

4. 常见服务场景与组合配置:Elasticsearch、Docker、虚拟机端口映射

4.1 Elasticsearch在Windows上的端口放行组合

Elasticsearch在Windows上跑时报10061,是本地开发者和运维都比较常见的问题。ES默认监听9200端口(HTTP协议)和9300端口(节点间传输协议)。很多教程只说放行9200,但如果你搭建的是多节点集群,9300也需要放行。

netsh advfirewall firewall add rule name="Allow ES 9200" dir=in action=allow protocol=TCP localport=9200 netsh advfirewall firewall add rule name="Allow ES 9300" dir=in action=allow protocol=TCP localport=9300

ES的配置文件elasticsearch.yml里还有一项非常关键:network.host。默认值是127.0.0.1,这会导致ES只监听回环地址,只有本机可以访问。想被局域网或远程访问,需要改成:

network.host: 0.0.0.0

或者指定具体IP,比如network.host: 192.168.1.100。改完配置记得重启ES进程。这个点非常典型:很多人把防火墙端口开了,发现还是连不上,一看ES监听在127.0.0.1,问题根本不在防火墙。ES 8.x版本默认开启了HTTPS和认证,用浏览器直接访问9200会看到安全提示或401,这个是正常现象,别以为是配置错了。

JDK17、ES和Windows的兼容性,也是实践中常遇到的问题。ES版本和JDK版本有对应的兼容矩阵,如果跑ES时报"future versions of Elasticsearch will require Java 11 or later"之类的提示,或者干脆起不来,先确认JDK版本是否满足当前ES版本的要求。

4.2 Docker Desktop映射端口后外部无法访问的排查

Windows上跑Docker有两种常见模式,处理防火墙的方式不同。

第一种是Docker Desktop + WSL2后端。容器端口映射用-p 9200:9200方式,宿主机(Windows)能访问,但局域网其他机器访问不了。这种情况通常是Windows防火墙拦截了宿主机上的映射端口。解决办法就是按第3章的方法,在Windows防火墙中放行宿主机的映射端口(比如9200)。需要特别注意,Docker的端口映射是宿主机端口对应容器端口,防火墙放行的应该是宿主机端口(冒号前那个)。

另一种是Windows容器模式(Windows Container)。这种模式下网络走的是Windows自身的网络栈,配置更加繁琐,涉及docker network和NAT网络,防火墙规则往往需要配合New-NetFirewallRule之类的PowerShell命令来配置。Windows容器的端口映射局限性比较多,如果业务场景要用Windows容器,建议先把网络这块的官方文档读透,排错思路和Linux容器完全不一样。

如果按照上述操作配置后仍然不通,建议试试清理并重建Docker的网络,重启Docker Desktop。如果宿主机安全软件对Docker进程有网络限制,还需要在安全软件中一并放行。

4.3 虚拟机NAT模式和桥接模式下的防火墙差异

虚拟机(VMware或Hyper-V)里跑Linux或Windows,宿主机连不上时,也要区分网络模式。

  • 桥接模式(Bridged):虚拟机直接从物理网络获取IP,相当于局域网内的一台独立机器。这时候虚拟机自己的防火墙要放行端口,Windows宿主机的防火墙通常不涉及(除非宿主机的安全软件拦截了跨网段流量)。
  • NAT模式:虚拟机通过宿主机共享网络,外部访问虚拟机服务时,需要在VMware或Hyper-V的虚拟网络编辑器里做端口映射,把宿主机的某个端口映射到虚拟机的某个端口。这种情况下,Windows宿主机防火墙放行的应该是宿主机映射端口,而不是虚拟机里的服务端口。

很多人在虚拟机上开了一个服务,宿主机用虚拟机IP:端口访问报10061,结果去配宿主机防火墙,方向搞反了。先确认当前虚拟机用的是什么网络模式,再决定在哪一层放行端口。

4.4 Xftp等SSH/SFTP工具连Windows的连接方式

热词里出现了"xftp连接windows",这里必须特别讲一下。Xftp的本质是SSH/SFTP协议连接,默认端口22。Windows 10/11默认情况下不安装SSH服务端,所以如果你用Xftp连Windows报10061,第一件事不是开防火墙,而是检查Windows有没有启动OpenSSH Server。

查看服务状态:

sc query sshd

如果没有这个服务,需要先安装。在管理员PowerShell中执行:

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

安装完成后启动服务并设为开机自启:

Start-Service sshd Set-Service -Name sshd -StartupType 'Automatic'

然后才是防火墙放行22端口:

netsh advfirewall firewall add rule name="Allow SSH 22" dir=in action=allow protocol=TCP localport=22

Windows自带的OpenSSH Server登录用的账号是Windows系统用户,Xftp登录时用户名密码用Windows账号就行。如果连上后出现权限问题,检查用户有没有被加入到sshd_users组。这个链路如果不写清楚,很多人会陷入"防火墙端口也开了,为什么Xftp还是连不上"的死循环。

5. 配置完还是连不上?一条可复现的排查链路

5.1 按方向、协议、配置文件逐级排除

最让人崩溃的情况是:防火墙规则明明加了,服务也在监听,客户端还是报10061。出现这种情况,按下面这个顺序逐级排查。

第一步:方向对不对。入站规则必须添加在"入站规则"节点下。如果误加到了出站规则,对入站连接没有任何作用。用命令检查时,注意看dir=in字段。

第二步:端口和协议是否精确匹配。有些服务(比如某些RPC服务)会从高位动态端口接受连接,你只放行了一个固定端口,实际通信用的却是另一个端口。这时候要查服务的官方文档,把动态端口范围也加进去。

第三步:配置文件是否匹配当前网络。这个在前面详细说过了,这是最隐蔽的坑。建议临时把规则配置文件改成"所有配置文件",确认问题后再收紧。

第四步:连接源IP是否命中规则。如果你的规则里设置了"远程IP地址"限制,比如只允许某个网段访问,而你的客户端不在这个网段内,也会被拒绝。查看规则属性时,重点确认"作用域"标签页的配置,它是专门控制远程IP范围的。

5.2 "阻止"规则的优先级:Windows防火墙的隐藏行为

Windows防火墙有一个容易被误解的机制:阻止规则优先于允许规则。哪怕存在一条显式的允许规则,只要还有另一条阻止规则匹配了同一流量,最终结果也是阻止。

这种情况多发生在第三方安全软件安装之后。比如某安全软件为了防止勒索病毒,自动添加了对445端口或某个开发端口的阻止规则,你后面再添加允许规则也无济于事。排查时看规则列表,特别留意名字里带"Block"的规则,以及第三方安全软件创建的规则。

5.3 一条命令查看当前所有规则,快速定位问题

在管理员命令提示符中执行:

netsh advfirewall firewall show rule name=all dir=in

这条命令会列出所有入站规则,信息量比较大。建议配合findstr过滤关键词:

netsh advfirewall firewall show rule name=all dir=in | findstr /i "9200"

查找所有跟9200端口相关的规则,能快速看出有没有冲突规则、方向是否正确、协议和端口是否匹配。

如果需要检查服务监听状态,用:

netstat -ano | findstr 9200

如果看到LISTENING状态,说明服务监听没问题。如果是TIME_WAIT或CLOSE_WAIT状态,说明曾经有连接但已断开,可能需要检查持久连接或应用层配置。

5.4 最后一招:临时关闭防火墙做交叉验证

为了快速判断是不是防火墙的问题,可以临时关闭防火墙测试一次,确认后再重新打开。这个操作要谨慎,毕竟关闭防火墙等于把机器暴露在网络上,只在受信的内网测试环境做,且测试完必须立刻恢复。

用管理员命令:

netsh advfirewall set allprofiles state off

关闭后,从客户端再测一次连接。如果能通了,说明防火墙确实拦截了;如果还是10061,那基本可以排除防火墙,回头检查服务监听和应用配置。

测试完毕立刻恢复:

netsh advfirewall set allprofiles state on

这个方法的定位效率非常高。不过我要啰嗦一句:测试完一定要马上打开,不要图省事开着防火墙测试环境跑一天,尤其Windows机器如果暴露在不可信网络里,风险非常大。

5.5 443、445等常见端口的类似报错

热词里提到"远程计算机不接受端口445上的连接,这可能是由于防火墙或安全策略设置",这个报错本质是Windows访问共享文件夹(SMB协议)时被拦截,网络上是常态现象。微软出于安全考虑,公网默认封禁445端口,内网使用也建议只在可信网络放开。如果你是在内网访问共享文件夹遇到这个问题,通常是本机或对端防火墙放行了NetBIOS和SMB相关端口(137/138/139/445),但我建议先确认这个共享方式是否必要,是否能用其他更安全的方式替代。这类"拒绝连接"的报错背后,端口只是一方面,安全策略往往才是决定因素。

6. 从一次实际排错看配置的先后顺序与经验总结

最后复盘一个典型的实战过程,按照实际的配置顺序与排查经验串一遍。

有一台Windows Server机器,上面跑了Elasticsearch和Redis。第一次从局域网另一台机器用Python连接ES的9200端口,报错正好是标题里的ConnectionRefusedError: [WinError 10061]。

我的排查过程是这样的:

  1. 先在Windows Server本机执行netstat -ano | findstr 9200,确认9200端口处于LISTENING状态,且监听地址是0.0.0.0。这一步排除了"服务没启动"和"监听地址不对"两个原因。
  2. 在本机执行Test-NetConnection localhost -Port 9200,通了。说明服务本身没问题。
  3. 在客户端机器上执行ping 192.168.1.100,通了,说明网络物理链路没问题。
  4. 在客户端机器上执行Test-NetConnection 192.168.1.100 -Port 9200,显示TcpTestSucceeded : False,说明端口不通。
  5. 此时基本锁定防火墙问题。在Windows Server上执行检查防火墙入站规则,发现没有任何包含9200的规则。
  6. 执行添加规则的命令:
netsh advfirewall firewall add rule name="Allow ES 9200" dir=in action=allow protocol=TCP localport=9200
  1. 重新在客户端测试,通了。三次握手正常,问题解决。

整个过程不到五分钟。如果一开始就盲目去配防火墙,反而会多走弯路。我自己的排错习惯是固定的:先看监听、再测本机、再测远程、最后动防火墙配置。这个顺序看着简单,但能帮你少走很多弯路。很多人一看到10061就去防火墙开端口,结果开了半天发现是服务压根没起来,白瞎。

再说几个容易被忽略的小细节:

  • 命令执行完后,最好用show rule确认一下规则确实存在,防止因为权限问题导致命令静默失败。
  • 如果Windows机器开了第三方防火墙(比如360等),Windows自带的防火墙规则不一定管用,需要在第三方防火墙里也放行对应端口。这类软件有时会接管系统防火墙,把你加的规则屏蔽掉。
  • 配置完规则后,很多服务不需要重启。但如果服务端有连接池或缓存,建议重启一下客户端应用再试。
  • 极少数情况下,Windows防火墙服务本身停止会导致所有规则失效,查看一下Windows Defender Firewall服务是否在运行。这个状态比较矛盾:服务关了反而可能让端口全通,但也可能因为其他安全策略导致更严重的问题。

根据个人经验,如果你在公司或学校的域环境里,组策略可能会强制执行某些防火墙配置,你手动添加的规则可能在下次策略刷新时被覆盖掉。域环境下排查10061,先确认有没有组策略层面的限制,否则你在本地加规则可能会做无用功。

排错本身是有方法论的。按照"服务监听 → 链路连通 → 防火墙配置 → 安全策略"这个顺序,一层一层往下走,每个层面都有明确的命令和验证方法,10061这个问题基本不会卡住超过十分钟。配置防火墙端口这件事,不是死记命令,而是搞清楚流量从客户端到服务端经过哪几道关卡,每一关为什么要查什么、怎么查。把这几个问题想明白,Windows防火墙相关的报错就难不住你了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询