连接失败主因有四:一是防火墙或安全组丢弃SYN包;二是服务未监听外网地址(如仅绑定127.0.0.1);三是syncookies启用导致NAT环境下ACK丢失;四是TIME_WAIT占满端口或本地端口耗尽。
连接被防火墙或安全组拦截
Linux 主机上 iptables、nftables 或云平台安全组规则,会直接丢弃 SYN 包,导致客户端收不到 SYN+ACK。现象是客户端 tcpdump 只能看到发出的 SYN,服务端抓包看不到任何入向 SYN。
- 检查本地防火墙:
sudo iptables -L -n -v或sudo nft list ruleset,重点关注 INPUT 链中是否有拒绝 TCP 目标端口的规则 - 云服务器务必确认安全组是否放行目标端口(不仅是协议和端口,还要检查源 IP 范围)
- 若使用
ufw,运行sudo ufw status verbose查看实际生效策略
服务进程未监听或绑定错误地址
netstat -tlnp 或 ss -tlnp 显示服务没在目标端口 LISTEN,或只绑定了 127.0.0.1(即 localhost),无法响应外部连接。
- 确认服务配置中监听地址不是
127.0.0.1:8080,而应为0.0.0.0:8080或具体外网 IP - 某些服务(如 Nginx、Redis)默认只监听本地,需显式修改配置项,例如 Redis 的
bind行要删掉或改成bind 0.0.0.0(注意配合protected-mode no) - 若服务启动失败但没报错,检查日志:
journalctl -u your-service-name -n 50
Syncookies 启用但客户端异常丢包
当连接请求洪峰到来时,内核可能启用 net.ipv4.tcp_syncookies=1(默认开启),此时不维护半连接队列,改用加密 cookie 回复 SYN+ACK。但如果客户端网络路径中存在 NAT 设备或中间件篡改 TCP 序列号,SYN+ACK 可能被丢弃或 ACK 无法返回,连接卡在 SYN_SENT。