服务连不上:先分清是没人监听、被墙,还是队列满了

Linux · 3 分钟阅读· 181 次阅读

「连不上」是一句含糊的描述。refused 说明对端明确拒绝(没人监听或被拒规则拦),timeout 说明包没回来(网络或防火墙丢包),reset 说明连接被中途掐断(中间设备或应用层)。

这三种现象对应的排查工具完全不同,混着查会浪费大量时间。

先说结论

先拿到确切错误类型,再用 ss 看本机状态,最后 tcpdump 确认包到没到。

  • refused → ss -lntp 看有没有监听
  • timeout → tcpdump 看 SYN 有没有回
  • reset → 查中间设备/连接数上限
  • TIME_WAIT 多 → 看是否短连接过多
  • conntrack 满 → dmesg 有 nf_conntrack 报错

先把问题说清楚

云环境还有一层安全组:本机 iptables 放行了,安全组没放,表现就是 timeout。

高并发短连接场景下,TIME_WAIT 会吃满本地端口,表现为「连不上但有监听」。

具体怎么做

按顺序执行,每步都验证完再进下一步:

  • 记录确切错误:Connection refused / timed out / reset by peer
  • ss -lntp | grep 端口 确认监听地址(0.0.0.0 还是 127.0.0.1)
  • ss -s 看连接总量与 TIME_WAIT 数量
  • tcpdump -i any -nn port 端口 抓包,看 SYN 是否有 SYN-ACK
  • 查安全组/防火墙与 conntrack 上限(sysctl net.netfilter.nf_conntrack_count)

参数与成本对照

把关键数值摊开,方便判断该选哪条路:

错误 含义 优先检查
Connection refused 对端明确拒绝 是否监听、监听地址
Connection timed out 包被丢/无回应 防火墙、安全组、路由
Connection reset 连接被中断 中间设备、应用超时、连接数限制
Too many open files 句柄耗尽 ulimit、应用连接池

服务连不上

几个容易踩的坑

下面这些是最常见的错误做法:

  • 只在本机 curl 127.0.0.1 就认为没问题:绕过了防火墙和安全组
  • 改 iptables 不开持久化,重启后失效
  • 把 TIME_WAIT 调到极小值:可能引发端口复用冲突
  • 忽略 IPv6:监听在 :: 上,v4 连不上

最后补两句

把三种错误类型记牢,排查效率会立刻不一样:refused 查监听,timeout 查链路,reset 查中间层。

工具是手段,理解机制才是能力。命令记不住没关系,知道「该看什么」就够了。

评论 (3)

阿
阿哲

照着做了一遍,确实少走弯路。第二步最容易漏,建议顺手加个检查清单。

南
南风

比「一键脚本」有用多了,知道为什么比知道怎么做重要。

K
Kevin

补充一句:不同版本行为会变,动手前先确认自己的版本号。

发表评论

验证码

提交后需站长审核,通过后才会显示。