“拒绝连接”(Connection refused)表示TCP三次握手未完成,根本原因是目标地址端口无监听或被拦截;需分三层排查:路由通路(ip route、tcpdump)、端口暴露(nc/telnet、ss -tlnp)、服务监听(systemctl status、日志),并结合errno 111等错误码精确定位。

“拒绝连接”(Connection refused)在 Nginx 代理场景中,不是网络延迟或丢包,而是明确告知:**TCP 三次握手根本没完成**——目标地址和端口对 Nginx 来说“不可达”或“没人应答”。排查重点不在传输质量,而在路由通路、端口暴露、服务监听这三层是否连通。
确认 Nginx 能否发出 SYN 包到目标地址
这是链路起点。在 Nginx 所在服务器上执行:
-
用 telnet 或 nc 测试裸 TCP 连通性:
nc -zv upstream_ip port或telnet upstream_ip port。若提示Connection refused,说明目标端口未监听或被本机防火墙拦截;若提示Connection timed out,才进入路由/中间设备排查 -
检查本地路由表:
ip route get upstream_ip。输出应显示下一跳网关和出接口。若返回Network is unreachable或No route to host,说明系统内核已判定无可达路径——可能是子网配置错误、VPC 路由缺失、Docker/K8s 网络插件异常 -
抓包验证 SYN 是否发出:
tcpdump -i any host upstream_ip and port port -nn,再触发一次请求。若完全看不到 SYN 包,问题在本地路由或 iptables OUTPUT 链;若看到 SYN 但无 SYN-ACK 回复,则卡在上游或中间链路
检查中间网络策略是否静默拦截
很多环境(尤其是云平台)会默认限制出向连接,且不返回 ICMP 不可达,只让 TCP 连接挂起或直接拒绝。
-
查本机防火墙规则:
sudo iptables -L OUTPUT -n -v或sudo nft list chain ip filter OUTPUT。重点关注是否有REJECT或DROP规则匹配目标 IP+端口,特别是位置靠前的 catch-all 拒绝规则 - 查云平台安全组 / 网络 ACL:确认“出方向(egress)”规则允许目标 IP 和端口。注意:部分平台默认只放行 80/443,其他端口需手动添加;K8s Service 类型为 ClusterIP 时,外部地址不可直接访问,需走 NodePort 或 Ingress
-
查容器或 Pod 网络隔离:Docker 使用
bridge网络时,upstream_ip若是宿主机地址(如 127.0.0.1),容器内无法直连,必须用host.docker.internal或172.17.0.1;K8s 中跨 namespace 调用需确认 NetworkPolicy 是否放行
验证上游服务是否真正监听且绑定正确
“拒绝连接”的常见原因是上游压根没在目标地址+端口上监听,或者绑定了错误的地址。
-
登录上游机器,检查监听状态:
ss -tlnp | grep :port。关键看两列:Local Address:Port是否为0.0.0.0:port或[::]:port(表示接受所有来源);若为127.0.0.1:port,则仅限本地回环可连,Nginx 在另一台机器就必然失败 -
确认上游服务进程存活且无启动报错:
systemctl status your-upstream-service,并查看其日志(如/var/log/upstream/error.log)。常见陷阱:服务启动成功但因配置错误退出,或监听端口被其他进程占用 -
若 upstream 是域名,先排除 DNS 问题:
nslookup domain和dig +short domain确认解析结果正确;再用curl -v http://resolved-ip:port绕过 DNS 直连测试,避免混淆 DNS 失败与连接拒绝
结合错误日志快速定位 errno 编码
Nginx 错误日志中出现的系统错误码,是判断故障层级的关键线索:
- errno 111(Connection refused):上游未监听、防火墙拦截、SELinux 拒绝、或上游服务崩溃后端口释放。这是最典型的“拒绝连接”信号
- errno 113(No route to host):路由层中断。常见于 Docker 容器访问宿主机服务时用了错误网关地址,或 K8s Pod 访问 ClusterIP 时 CoreDNS 或 kube-proxy 异常
-
errno 99(Cannot assign requested address):通常是 DNS 解析失败后 Nginx 尝试连接空地址,或 ephemeral port 耗尽导致 bind 失败。此时要查
netstat -an | grep TIME_WAIT | wc -l和cat /proc/sys/net/ipv4/ip_local_port_range



















