端口不通时,如何区分应用没监听、防火墙拦截和云安全组问题?
简化版
端口不通要按链路分层排查:应用是否监听正确 IP 和端口,本机防火墙是否放行,云安全组/NACL 是否放行,路由和网络 ACL 是否可达。Connection refused 更像目标主机可达但端口没人监听或主动拒绝;timeout 更像中间链路丢弃、防火墙或安全组拦截。
详细版
排查顺序可以是:服务端 ss -lntp 看监听;客户端 nc -vz host port 或 telnet 测连通;服务端 tcpdump 看 SYN 是否到达;如果 SYN 到达但无响应,查本机防火墙或应用;如果 SYN 不到,查安全组、路由、NACL、负载均衡和中间网络。
关键是不要只在客户端测一次就下结论。端口不通可能发生在客户端出口、服务端入口、云网络、容器网络、负载均衡、应用监听地址等多个位置。
完整版教学
一、端口连通性是端到端问题
客户端连接一个端口,要经过客户端本机、客户端出口网络、云安全组、负载均衡、服务端防火墙、应用监听等多层。任意一层拦截,最终都可能表现为连接失败。
client -> client firewall -> network -> security group -> host firewall -> app
所以排查端口问题不能只问“服务起了吗”,也不能只问“安全组开了吗”。要沿路径逐段确认。
二、先确认应用是否监听
在服务端先看端口是否真的监听,以及监听在哪个地址上。监听 127.0.0.1:8080 只能本机访问,外部访问会失败。
ss -lntp | grep 8080
127.0.0.1:8080 -> only local
0.0.0.0:8080 -> all IPv4 interfaces
10.0.1.5:8080 -> specific private IP
很多“端口不通”其实是应用只绑定了 localhost,或服务监听了容器内部端口但没有映射到宿主机。
三、refused 和 timeout 的差别
Connection refused 通常表示目标主机可达,但目标端口没有进程监听,或中间设备主动返回 RST。Connection timed out 通常表示 SYN 发出去后没人回应,可能被防火墙或安全组静默丢弃。
| 现象 | 常见含义 | 排查重点 |
|---|---|---|
| refused | 主机可达,端口拒绝 | 监听/本机防火墙/RST |
| timeout | 包被丢弃或路由不通 | 安全组/路由/ACL |
| no route | 本机路由问题 | route/ip addr |
| reset | 对端或中间设备重置 | 应用/代理/防火墙 |
这个区别不是绝对结论,但能帮助缩小方向。
四、用 tcpdump 判断包到没到
服务端抓包是分界点。客户端发起连接时,如果服务端网卡能看到 SYN,说明包已经到主机;如果看不到 SYN,问题在主机之前。
tcpdump -ni any tcp port 8080
SYN arrives, no SYN+ACK -> host firewall/app issue
SYN not arrives -> security group/route/LB issue
SYN SYN+ACK ACK exists -> connection established
抓包能把猜测变成证据。云环境里还可以结合 VPC flow log。
五、云安全组和 NACL
云安全组通常是实例级或网卡级的状态型防火墙,NACL 常是子网级、可能无状态。入站和出站规则都可能影响连接。
security group inbound: allow tcp 8080 from client
security group outbound: allow response
NACL inbound/outbound: allow both directions
如果 NACL 是无状态的,返回流量也要显式允许临时端口。不同云厂商细节不同,但“入站和出站都要看”是通用原则。
六、负载均衡和容器网络
服务前面有负载均衡时,还要看监听器、后端健康检查、目标组端口、转发规则。容器场景要看容器端口、宿主机端口、Service、Ingress。
client -> LB:443 -> target:8080 -> container:8080
外部端口通,不代表后端目标健康;后端监听正常,也不代表 LB 规则转发到了它。每层都要分别验证。
七、排查 checklist
建议固定顺序:DNS 解析到哪里,路由能否到,安全组是否放行,主机是否收到 SYN,应用是否监听正确地址,返回包是否出去,代理/LB 是否健康。
resolve -> route -> security group -> tcpdump -> ss -> firewall -> app log
记忆钩子:端口不通要先用抓包切一刀,SYN 到没到服务端,决定你往主机内查还是往网络外查。
八、常见误区与追问
- 误区:服务启动了端口就一定对外可访问。 还要看监听地址、防火墙、安全组和端口映射。
- 误区:安全组入站放行就够。 出站、NACL、返回路径和临时端口也可能影响。
- 误区:客户端 timeout 一定是服务挂了。 中间丢包、防火墙静默丢弃更常见。
- 追问:如何判断 SYN 是否到服务端? 在服务端用 tcpdump 抓目标端口。
- 追问:监听 127.0.0.1 有什么影响? 只能本机访问,外部无法直接连。
- 追问:容器端口通不通怎么查? 分别查容器监听、端口映射、Service/Ingress 和宿主机防火墙。
- 追问:为什么云 NACL 要看返回方向? 无状态 ACL 不会自动放行响应流量。
九、加强记忆
端口不通排查要把链路拆开:应用监听、本机防火墙、云安全组、NACL、负载均衡、路由和客户端出口。最关键的证据是服务端是否收到 SYN:收到就往主机和应用查,没收到就往安全组、路由、LB 和中间网络查。refused 偏“到了但拒绝”,timeout 偏“路上被丢”,这个判断能快速缩小范围。