公网连接VPS的Python Socket服务报Connection refused如何解决
问题根因
ConnectionRefusedError: [Errno 111] Connection refused代表你的TCP连接请求已经到达VPS,但目标端口没有可被公网访问的监听服务,直接被系统拒绝。核心问题出在服务端配置:
你当前Server.py中绑定的地址是localhost(对应回环地址127.0.0.1),这个地址仅允许VPS本机内部的进程访问,公网发来的请求根本不会被这个监听端口接收。
修复步骤
- 修改服务端监听地址
将服务端的绑定地址从localhost改为0.0.0.0,这个配置代表监听VPS上所有的网络接口,同时兼容本地回环访问和公网访问。另外注意TCP服务端必须调用listen()初始化连接队列才能正常接受连接,缺失这一步也会导致连接异常。
修改后的完整Server.py代码如下:
- 修改服务端监听地址
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) # 监听所有网络接口,设置最大等待连接队列长度为5 sock.bind(('0.0.0.0', 8884)) sock.listen(5) while True: try: client, addr = sock.accept() except KeyboardInterrupt: sock.close() break else: client.setblocking(True) result = client.recv(1024) client.close() print(f'Received message from {addr}: {result.decode("utf-8")}')
修改完成后重启Server.py脚本。
- 放通端口访问规则
代码改完还需要确认两层防火墙配置,否则公网流量还是会被拦截:
- 登录VPS服务商管理后台,找到对应实例的安全组/防火墙配置,添加入站规则:允许TCP协议8884端口,源地址设为
0.0.0.0/0(如果仅想自己家用电脑访问,也可以单独填你家的公网IP,安全性更高) - 检查VPS系统内部的防火墙规则:如果用的是ufw(Ubuntu/Debian默认),执行
ufw allow 8884/tcp放通端口;如果是firewalld(CentOS/RHEL默认),执行firewall-cmd --add-port=8884/tcp --permanent && firewall-cmd --reload生效。
- 放通端口访问规则
- 验证连通性
先在VPS本地运行原来的本地测试Client.py,确认本地收发正常,再回到家用电脑运行指向公网IP的Client.py,就能正常收到来自公网的测试消息了。
- 验证连通性
排查技巧:如果改完配置还是报连接拒绝,可以在VPS上执行
ss -tulnp | grep 8884查看端口监听状态,如果看到Local Address列显示0.0.0.0:8884就代表代码层面的监听配置已经生效,问题出在防火墙/安全组规则上。
内容的提问来源于stack exchange,提问作者IvanZabolotniy
相关产品推荐
相关产品推荐

