Python Socket跨路由器连接Ubuntu报ConnectionRefusedError咨询
跨公网Socket连接ConnectionRefusedError [Errno 111] 排查方案
按以下顺序逐一排查,每步验证通过再走下一步:
- 第一步:验证服务端端口监听状态
在服务端设备执行命令:sudo ss -tulpn | grep 5000
正常返回需存在python3进程绑定0.0.0.0:5000或:::5000的记录;如果仅绑定127.0.0.1:5000,说明服务仅监听本地回环,外部设备无法访问。当前示例代码bind空字符串默认监听所有地址,这步主要排查程序启动异常、端口被其他进程占用的问题。 - 第二步:放行服务端本地防火墙
Ubuntu默认启用ufw防火墙,先执行sudo ufw status查看规则,若没有5000/TCP端口允许入站的记录,执行以下命令放行:sudo ufw allow 5000/tcp - 第三步:配置服务端所在路由器的端口转发
你通过curl拿到的公网IP归属服务端连接的路由器WAN口,并非服务端笔记本本身的地址,必须在服务端接入的路由器管理后台配置端口映射规则:将WAN口入站的5000/TCP请求,转发到服务端笔记本在局域网内的私有IP(可在服务端执行ip a查看对应网卡的inet地址获取,一般为192.168.x.x、10.x.x.x段)的5000端口。注意:如果查看路由器WAN口拿到的IP是10.x.x.x、100.64.x.x、172.16-31.x.x、192.168.x.x段的私有地址,说明运营商做了CGNAT,没有给你分配独立公网IP,普通端口转发无法生效,需要联系运营商申请公网IP,或使用内网穿透、虚拟组网方案实现连接。
- 第四步:网络层连通性校验
保持服务端程序运行,在客户端设备先执行端口连通性测试,不要直接运行业务代码:nc -zv 服务端公网IP 5000
命令返回连接成功标识后,再运行客户端代码即可正常建立连接;如果仍返回连接拒绝,回退检查前面的防火墙、端口转发配置是否正确。 - 第五步:排除客户端代码问题
你当前客户端代码类属性myIP在__init__方法内直接引用存在作用域风险,测试阶段可以先用最简代码排除语法问题:import socket s = socket.socket() # 替换为实际服务端公网IP s.connect(("123.456.789.123", 5000)) print("连接成功")
内容的提问来源于stack exchange,提问作者Mathew
相关产品推荐
相关产品推荐

