线上服务端口连不上?完整排查指南(从进程到客户端)
来源:刘军军 | 发布日期:2026-06-01
三种报错快速定位
| 报错 | 含义 | 优先排查方向 |
|---|---|---|
| Connection refused | 端口没在监听,或被 iptables REJECT | 服务是否启动、端口是否监听 |
| Connection timed out | 数据包被丢弃了 | 防火墙 DROP 规则、云安全组、网络路由 |
| No route to host | 网络层不通 | 路由、网卡状态、跨网段配置 |
排查主流程(从内到外)
服务进程 → 端口监听 → 本机防火墙 → 云安全组 → SELinux → 网络路由 → DNS
一层一层排,哪层断了就在哪层修。
第一步:确认服务进程
# 查看进程
systemctl status nginx # 显示 running/failed/dead
ps aux | grep java
# 服务没起来?看启动日志
journalctl -u nginx -n 100 --no-pager
tail -n 100 /var/log/syslog
常见失败原因:配置文件语法错误、端口被占用、权限不足(1024 以下端口需 root)、依赖服务未启动。
第二步:确认端口监听
# 查看监听状态
ss -tlnp | grep 8080
netstat -tlnp | grep 8080
监听地址的坑——最常见的翻车点:
| 监听地址 | 含义 |
|---|---|
0.0.0.0:8080 |
所有网卡,外部可访问 ✅ |
127.0.0.1:8080 |
只有本机能访问 ❌ |
::1:8080 |
IPv6 回环,外部无法访问 ❌ |
本机自测排除网络因素:curl http://127.0.0.1:8080 或 nc -zv 127.0.0.1 8080。本机通、外部不通 → 问题在防火墙或网络层。
配置修改示例:
| 服务 | 配置 | 改法 |
|---|---|---|
| Nginx | listen 80; 即 0.0.0.0:80 |
或 listen 0.0.0.0:80; |
| Spring Boot | application.properties |
server.address=0.0.0.0 |
| MySQL | my.cnf |
bind-address = 0.0.0.0 |
| Redis | redis.conf |
bind 0.0.0.0 |
第三步:本机防火墙
firewalld(CentOS 7+):
firewall-cmd --list-all # 看当前放行规则
firewall-cmd --permanent --add-port=8080/tcp && firewall-cmd --reload # 永久放行(必须加 --permanent)
firewall-cmd --remove-port=8080/tcp # 关闭端口
iptables(Ubuntu/底层):
iptables -L INPUT -n -v --line-numbers # 看入站规则
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT # 临时放行
# 默认策略是 DROP? → 注意 INPUT 链 policy
ufw(Ubuntu): ufw allow 8080/tcp && ufw reload
临时关闭防火墙测试(仅排查用):
iptables -F && iptables -P INPUT ACCEPT,用完立即恢复。
第四步:云安全组
生产环境最易忽略的一层。安全组丢弃的数据包服务器根本看不到,tcpdump 也无输出。
# 判断方式:服务器上抓包
tcpdump -i eth0 port 8080 -nn
# 客户端发起请求后,tcpdump 无任何输出 → 安全组拦截了
阿里云 → ECS 实例 → 安全组 → 入方向规则 → 放行 TCP:8080/8080,授权对象 0.0.0.0/0。腾讯云/AWS 操作类似。
第五步:SELinux(CentOS/RHEL)
getenforce # Enforcing/Permissive/Disabled
grep denied /var/log/audit/audit.log # 看有没有 SELinux 拦截
semanage port -a -t http_port_t -p tcp 8888 # 放行非标准端口
第六步:网络路由与 DNS
ip addr show # 网卡状态和 IP
ip route show # 路由表
ping -c 4 目标IP # ICMP 连通性
traceroute -T -p 8080 目标IP # TCP 路由追踪
nslookup yourdomain.com # DNS 解析
cat /etc/hosts # hosts 覆盖
速查清单
systemctl status 服务名ss -tlnp | grep 端口号curl http://127.0.0.1:端口firewall-cmd --list-all/iptables -L INPUT -n -vtcpdump -i eth0 port 端口 -nn(看包是否到服务器)getenforce+grep denied /var/log/audit/audit.loglsof -i :端口(查端口占用)ip route show/traceroutenslookup 域名(域名访问时)
常用命令速查
| 目的 | 命令 |
|---|---|
| 查进程 | ps aux | grep 服务名 |
| 查端口监听 | ss -tlnp | grep 端口 |
| 本机测试 | nc -zv 127.0.0.1 端口 |
| 查防火墙规则 | firewall-cmd --list-all |
| 查 iptables | iptables -L INPUT -n -v |
| 抓包验证 | tcpdump -i eth0 port 端口 -nn |
| 查 SELinux | getenforce |
| 查端口占用 | lsof -i :端口 |
| 追踪路由 | traceroute -T -p 端口 目标IP |
| 查服务日志 | journalctl -u 服务名 -n 100 |
真实案例
案例一:Spring Boot 只监听了 127.0.0.1
本机 curl 通、外部超时。ss -tlnp 看到 127.0.0.1:8080。修复:server.address=0.0.0.0。
案例二:firewalld 重启后规则丢失
之前用 --add-port(临时),重启后失效。须用 --permanent --add-port。
案例三:云安全组未放行 服务器 tcpdump 收不到包。登录云控制台入方向添加 TCP 端口放行。
案例四:SELinux 阻止 Nginx 绑定 8888 端口
journalctl 报 Permission denied,audit.log 有 denied 记录。semanage port -a -t http_port_t -p tcp 8888 解决。
案例五:端口被僵尸进程占用
lsof -i :8080 发现残留进程,kill -9 后重启。
关联页面
| 页面 | 关联点 |
|---|---|
| network-troubleshooting-order | 服务器网络排障方法论(七步法) |
| fullstack-performance-troubleshooting | 全栈性能排障 |
| container-networking-troubleshooting | 容器网络排障 |
| journalctl-log-tracking-guide | systemd 日志管理 |
| linux-essential-commands-reference | Linux 命令速查 |
| network-packet-loss-troubleshooting | 网络丢包排查全链路指南:从 ping 到 tcpdump 逐层排查,含物理/逻辑丢包区分、8 步排查 |
| nginx-config-pitfalls | Nginx 配置踩坑 |