用 ss 与 tcpdump 定位 Linux 服务端口监听异常
服务明明已经启动,浏览器却连不上,先别急着重启。多数端口问题都可以先分清四件事:进程有没有监听、监听在哪个地址、本机能不能连通、外部的包有没有到达。本文就用 ss 与 tcpdump 按这个顺序定位,避免在配置里盲目改端口或反复重启。
第一步:先看监听状态
ss 是查看套接字的首选工具,-tlnp 分别表示 TCP、只看监听态、显示数字地址端口、显示进程信息:
ss -tlnp
ss -tlnp | grep ':8080'
重点看监听地址那一列,结果通常有三种含义:
0.0.0.0:8080:监听所有 IPv4 地址,外部一般可以到达,问题多半在防火墙或上游。127.0.0.1:8080:只监听回环地址,本机可以访问,但局域网和其他机器连不上,这是最常见的“本地能用、别人连不上”的原因。- 根本没有这一行:进程没有真正监听成功,要先看服务日志和启动参数,而不是先改防火墙。
如果看到 *:8080 或 [::]:8080,也要注意 IPv4 与 IPv6 的区别。有的服务只监听 IPv6 通配地址,是否接受 IPv4 连接取决于系统与服务的双栈配置,不能只凭端口号下结论。
第二步:本机先连通,再谈外部
在监听确认无误后,先用本机回环地址验证服务本身:
curl -v http://127.0.0.1:8080/
ss -tnp | grep ':8080'
如果本机回环都失败,问题在服务本身、监听地址或本地策略;如果本机成功、外部失败,再把排查范围收窄到防火墙、安全组、路由和反向代理。
同时看一眼已建立连接的状态也很有用。ESTABLISHED 很多但响应慢,往往是后端处理慢,而不是端口没开;SYN-SENT 徘徊不前,则说明对端没有回包或回包被丢弃。
第三步:用 tcpdump 看包到底到没到
这是区分“没到达”和“到达但被拒绝”的关键一步。抓包需要相应权限,生产环境要控制抓包数量和时间,避免抓到敏感报文内容:
tcpdump -i any -nn -c 50 port 8080
tcpdump -i eth0 -nn 'tcp port 8080 and tcp[tcpflags] & tcp-syn != 0'
常见现象与判断如下:
- 能看到客户端的 SYN,但没有 SYN-ACK:服务可能没有监听该地址,或者回包路径、防火墙把包丢了。
- 看到 RST:对端明确拒绝连接,可能是端口未监听、服务刚重启,或者中间设备直接复位了连接。
- 外部接口上完全看不到包:问题在客户端、安全组、路由或上游代理之前,继续在本机改配置没有意义。
如果只想确认到达情况,可以只抓 SYN,不必长时间抓完整流量。需要留档时用 -w 写到文件,再离线分析,不要在终端里长时间滚动输出。
第四步:按顺序排除防火墙与代理
确认包到达后再检查本地防火墙规则,例如:
nft list ruleset | grep 8080
# 或在仍使用 iptables 的系统上
# iptables -L -n | grep 8080
还要注意云服务器安全组、容器端口映射和反向代理这三层。容器里监听正常,不代表宿主机端口已经映射;反向代理返回 502,也不等于后端端口没开。每一层都要用上一层的实际观测结果说话。
一张排查清单
| 现象 | 优先检查 |
|---|---|
ss 里没有监听行 |
服务日志、启动参数、端口占用 |
只监听 127.0.0.1 |
服务绑定地址配置 |
| 本机通、外部不通 | 防火墙、安全组、路由、代理 |
| 有 SYN 无 SYN-ACK | 监听地址、回包路径、中间设备 |
| 看到 RST | 端口状态、服务重启、中间复位 |
| 外部接口无包 | 客户端、上游网络、安全组 |
小结
定位端口问题时,先用 ss 确认监听事实,再用本机连通性缩小范围,最后用 tcpdump 确认包的到达情况。按“监听、回环、本机连通、外部到达”这个顺序走一遍,很多看似玄学的问题都会变成一个可以复现、可以验证的具体环节。
- 点赞
- 收藏
- 关注作者
评论(0)