连接Google VPS时出现Socket超时/关闭错误求助
问题排查与解决步骤
1. 修复服务的IPv4监听问题
你当前的Java服务仅监听了IPv6的8080端口(tcp6 0 0 :::8080 :::* LISTEN),如果客户端通过IPv4发起连接,或者VPS未配置公网IPv6,就会出现连接超时。
- 修改服务监听配置,强制绑定IPv4的
0.0.0.0:8080(同时兼容IPv6):- 若用Spring Boot,在
application.properties添加:server.address=0.0.0.0 - 原生Java Socket开发的话,将绑定地址改为
InetAddress.getByName("0.0.0.0")
- 若用Spring Boot,在
- 重启服务后,用
netstat -tunlp确认输出中包含tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN
2. 补全IPv6的iptables规则(若启用IPv6)
当前配置的iptables规则仅针对IPv4,若VPS开启了IPv6,需添加对应放行规则:
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT sudo ip6tables -A INPUT -p tcp --dport 8080 -j ACCEPT
保存IPv6规则:
sudo netfilter-persistent save
3. 检查Google Cloud云层面防火墙
Google VPS的云平台防火墙优先级高于服务器内部iptables,即使本地规则放行,云防火墙拦截也会导致连接失败:
- 登录Google Cloud控制台,找到对应VM实例的VPC网络防火墙规则页
- 添加两条入站规则:
- 允许指定来源(或所有IP)的TCP 80端口流量
- 允许指定来源(或所有IP)的TCP 8080端口流量
- 规则生效后重新测试连接
4. 定位Postman 500错误的根源
Postman返回500说明请求已到达服务器,但服务处理出错,和网络连接无关:
- 查看Java服务的日志文件,提取500错误的堆栈信息,排查是接口路径不匹配、参数错误还是服务内部逻辑异常
- 核对Retrofit的
baseUrl格式,确保末尾斜杠与服务端接口定义匹配
5. 验证端口转发有效性
在服务器本地执行命令,测试80端口转发是否正常:
curl http://localhost:80
若返回服务正常响应,说明转发生效;若失败,用iptables -t nat -L -n --line-numbers确认PREROUTING规则排在最前面(你用-I插入的规则默认在开头,一般没问题)
内容的提问来源于stack exchange,提问作者randomdude0
相关产品推荐
相关产品推荐

