服务器端口不通如何排查
学会这套排查顺序,你就能在十分钟内定位绝大多数「服务器端口不通」的原因,而不是盲目重启服务或怀疑防火墙。下面按从近到远、从简到繁的顺序走一遍。
第一步:先确认「不通」到底是谁不通
你得到的结果是:明确问题出在客户端、网络链路还是服务端。这是所有后续排查的前提,因为「端口不通」这句话本身信息量太小。
在你自己电脑上执行(Windows 用 CMD 或 PowerShell,macOS/Linux 用终端):
telnet 服务器IP 端口
Windows 需要先在「控制面板 → 程序 → 启用或关闭 Windows 功能」里勾选「Telnet 客户端」。如果 telnet 提示「无法打开到主机的连接」,记录下具体报错文字,它区分了三种情况:
Connection refused:网络能到,但对端没人监听这个端口Connection timed out:数据包发出去没回应,多半被防火墙或安全组拦了Could not resolve host:域名解析问题,跟端口无关
Linux/macOS 也可以用更直观的 nc -vz 服务器IP 端口,或 curl -v telnet://服务器IP:端口。
注意:很多生产服务器只对特定来源 IP 开放端口。如果你在办公室能连、在家连不上,问题不在服务器,而在访问来源。
第二步:确认服务端进程真的在监听
你得到的结果是:判断「服务有没有起来」以及「起在哪个地址上」。
登录服务器后执行:
ss -lntp | grep 端口号
或者老系统用 netstat -lntp | grep 端口号,Windows 用 netstat -ano | findstr 端口号。
重点看输出的监听地址那一列:
- 显示
0.0.0.0:8080或*:8080:监听所有网卡,外部可访问 - 显示
127.0.0.1:8080:只监听本机回环地址,外部永远连不上,这是最常见的坑 - 完全没有输出:服务没起来,或者起在别的端口上
如果是 127.0.0.1 的情况,去改应用配置。以 Nginx 为例,在 /etc/nginx/nginx.conf 或 sites-enabled 下的站点配置里把 listen 127.0.0.1:8080; 改成 listen 0.0.0.0:8080;,然后 nginx -t 检查语法、systemctl reload nginx 生效。Spring Boot 则是改 application.yml 里的 server.address: 0.0.0.0。
第三步:在服务器本机回环测试
你得到的结果是:把「服务本身有问题」和「网络被拦」这两件事彻底分开。
在服务器上执行:
curl -v http://127.0.0.1:8080
如果本机能通、外网不通,那服务是好的,问题一定在防火墙、安全组或网卡绑定上,直接进入第四步。如果本机也连不上,先解决服务本身,别去折腾防火墙。
第四步:检查本机防火墙
你得到的结果是:确认服务器操作系统自身没有拦这个端口。
CentOS 7/8、Rocky、AlmaLinux 默认用 firewalld:
firewall-cmd --list-ports
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
Ubuntu/Debian 默认用 ufw:
ufw status
ufw allow 8080/tcp
iptables 直接看规则:iptables -L -n --line-numbers,注意 INPUT 链里有没有 DROP 或 REJECT。
注意:
firewall-cmd --add-port不加--permanent的话,重启后规则会消失,线上改完一定要确认持久化。
第五步:检查云平台安全组和网络 ACL
你得到的结果是:排除云厂商层面的拦截,这在自建机房里不存在,但用云服务器时是头号嫌疑犯。
以阿里云为例:登录控制台 → 云服务器 ECS → 左侧「实例」→ 点进目标实例 → 「安全组」标签 → 点击安全组 ID → 「入方向」→ 「手动添加」。规则填法:授权策略选「允许」,协议类型选「自定义 TCP」,端口范围填 8080/8080,授权对象填 0.0.0.0/0(或你公司的固定出口 IP,更安全)。
腾讯云路径是:控制台 → 云服务器 → 实例 → 「安全组」→ 编辑规则 → 入站规则。华为云是:控制台 → 弹性云服务器 → 安全组 → 配置规则 → 入方向规则。
如果你用了 VPC 的网络 ACL,还要单独检查子网的 ACL 入方向规则,它和安全组是两层独立的过滤。
第六步:分段定位网络链路
你得到的结果是:判断是路上断了,还是对端拦了。
在客户端执行:
tracert 服务器IP # Windows
traceroute 服务器IP # Linux/macOS
如果中途某跳之后全部超时,说明链路在那一跳之后断了,属于网络运维范畴。如果能一路到达服务器但端口仍不通,基本可以断定是第四、五步的拦截。
更精细的做法是在服务器上抓包:
tcpdump -i eth0 port 8080 -nn
然后从客户端再连一次。抓到 SYN 包说明请求到了服务器,服务器没回 SYN-ACK,就是本机防火墙拦的;完全抓不到包,说明包在到达服务器前就被丢了,回去查安全组和链路。
注意:tcpdump 需要 root 权限,生产环境抓包记得加
-c 100限制包数,避免刷屏和磁盘写满。
小结
- 先分清报错类型:refused 是没监听,timeout 是被拦截,解析失败跟端口无关
- 用
ss -lntp确认监听地址,127.0.0.1是最常见的「外网连不上」原因 - 在服务器本机
curl 127.0.0.1:端口,本机通外网不通就直接查防火墙和安全组 - 防火墙规则要
--permanent加--reload才持久 - 云服务器务必检查安全组入方向规则,它和系统防火墙是两层独立过滤
- 用 tracert 加 tcpdump 分段定位,能明确区分「路上丢了」和「对端拦了」
原文链接:https://www.gj0.com/thread-129.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。