Connection refused错误主因是TCP全连接队列溢出、监听地址绑定为127.0.0.1、云安全组或本地防火墙拦截、somaxconn过小或SYN洪水攻击;需依次检查ss -lnt队列状态、ss -tunlp监听地址、云安全组与ufw/firewalld规则、调大somaxconn及tcp_max_syn_backlog,并启用syncookies。

如果您观察到服务器进程仍在运行,但客户端持续收到Connection refused错误,则问题并非源于服务未启动,而是连接请求在抵达应用层前已被操作系统内核拒绝。核心原因通常指向TCP连接队列溢出、端口监听范围不当或防火墙策略拦截等底层机制异常。以下是解决此问题的步骤:
一、检查全连接队列是否溢出
三次握手完成后,连接进入全连接队列(Accept Queue),等待应用程序调用accept()。若该队列已满,内核将直接丢弃新SYN包并返回RST,表现为Connection refused。
1、执行命令查看监听端口队列状态:ss -lnt
2、检查输出中Recv-Q值是否大于或等于Send-Q值,例如显示LISTEN 129 128 *:3306即表明队列已溢出
3、统计历史溢出次数:netstat -s | grep -i "listen",若出现times the listen queue of a socket overflowed且数值持续增长,确认存在队列瓶颈
二、验证服务监听地址是否绑定至外部接口
服务进程虽在运行,但若仅监听127.0.0.1或localhost,将拒绝所有来自本机外部的连接请求,导致客户端无法建立TCP连接。
1、使用命令查看实际监听地址:ss -tunlp | grep :端口号(将“端口号”替换为实际端口)
2、确认Local Address列显示为*:端口或0.0.0.0:端口,而非127.0.0.1:端口
3、若发现绑定地址为127.0.0.1,需修改对应服务配置文件(如Nginx的listen指令、Tomcat的address属性、Redis的bind参数),将其改为0.0.0.0或服务器实际内网IP
三、排查云平台安全组与系统防火墙双重拦截
在云环境中,连接请求需依次通过云厂商安全组和服务器本地防火墙。任一环节未放行目标端口,均会导致内核直接拒绝连接,不经过服务进程。
1、登录云服务商控制台,定位对应实例的安全组规则,确认入站规则中已添加允许客户端IP访问目标端口的条目
2、在服务器内部执行:sudo ufw status verbose(Ubuntu)或sudo firewall-cmd --list-all(CentOS/RHEL),检查对应端口是否处于allowed状态
3、临时禁用防火墙测试连通性:sudo ufw disable 或 sudo systemctl stop firewalld,若此时连接恢复,说明防火墙规则配置有误
四、增大全连接队列容量
全连接队列大小由min(backlog, somaxconn)决定。默认somaxconn常为128,远低于高并发场景需求,易造成队列饱和。
1、查看当前系统限制:cat /proc/sys/net/core/somaxconn
2、临时提升上限:sudo sysctl -w net.core.somaxconn=65535
3、修改应用层backlog参数:Nginx配置中添加listen 80 backlog=65535;Tomcat配置中设置acceptCount="1000";Spring Boot中配置server.tomcat.accept-count=1000
五、检测半连接队列是否遭受SYN洪水攻击
当服务收到大量SYN包但未完成三次握手时,半连接队列(SYN Queue)可能被占满,新SYN包被丢弃,客户端超时后报Connection refused。
1、统计当前SYN_RECV状态连接数:ss -n state syn-recv | wc -l
2、若数值异常高于正常水平(如超过数百),检查是否存在SYN Flood特征流量
3、增大半连接队列上限:sudo sysctl -w net.ipv4.tcp_max_syn_backlog=65535,并启用SYN Cookies:sudo sysctl -w net.ipv4.tcp_syncookies=1











