服务器端口不通如何排查

juming
juming 正式会员超兽战士
发布于 2026-10-07 06:43 ·0 浏览 ·0 回复

学会这套排查顺序,你就能在十分钟内定位绝大多数「服务器端口不通」的原因,而不是盲目重启服务或怀疑防火墙。下面按从近到远、从简到繁的顺序走一遍。

第一步:先确认「不通」到底是谁不通

你得到的结果是:明确问题出在客户端、网络链路还是服务端。这是所有后续排查的前提,因为「端口不通」这句话本身信息量太小。

在你自己电脑上执行(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 分段定位,能明确区分「路上丢了」和「对端拦了」
版权声明:本文来自 GJ论坛《服务器端口不通如何排查》
原文链接:https://www.gj0.com/thread-129.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~