服务监听地址错误是端口不通的主因:若ss或netstat显示127.0.0.1或::1,则仅本机可访问;0.0.0.0或*才监听所有ipv4接口;具体ip则限于对应网卡子网。

先确认服务到底监听在哪个地址上
很多“端口开了但不通”的问题,根本不在防火墙,而在服务自己没绑对地址。netstat 或 ss -tlnp 显示端口在 LISTEN,不代表它能接收外部流量。
重点看输出第四列(Local Address:Port):
- 如果是
127.0.0.1:8080或::1:8080:只响应本机回环请求,公网/局域网访问必失败 - 如果是
0.0.0.0:8080或*:8080:监听所有 IPv4 接口,正常 - 如果是
172.16.10.5:8080(具体内网 IP):仅响应来自该网卡的流量,需确认客户端是否在同一子网
改法因服务而异:Nginx 要检查 listen 指令是否带 IP;Spring Boot 默认绑 0.0.0.0,但若配置了 server.address=127.0.0.1 就会锁死;Node.js 的 app.listen(8080, '127.0.0.1') 同理。
firewalld 放行的是端口+协议组合,不是“端口号”本身
很多人执行 firewall-cmd --add-port=53/tcp 就以为 DNS 通了,结果 UDP 查询全丢——因为 DNS 主要用 UDP 53,而这条命令只放行 TCP。
正确做法是按协议分别加:
- DNS:必须同时加
firewall-cmd --add-port=53/tcp和firewall-cmd --add-port=53/udp - HTTP/HTTPS:
80/tcp和443/tcp足够,它们不用 UDP - 自定义服务:先用
ss -tulpn | grep :端口看进程实际用的是 tcp 还是 udp,再对应放行
漏掉 /tcp 或 /udp 后缀,命令会静默失败(firewalld 不报错,但规则不生效);加完别忘 firewall-cmd --reload。
别忘了内核转发开关,特别是做 NAT 或代理时
CentOS/RHEL 系统默认关闭 net.ipv4.ip_forward,这会导致即使防火墙放行、服务也监听 0.0.0.0,流量仍卡在内核路由层。
检查和启用:
- 查状态:
sysctl net.ipv4.ip_forward→ 返回net.ipv4.ip_forward = 0就得开 - 临时开启:
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:在
/etc/sysctl.conf里加一行net.ipv4.ip_forward = 1,再运行sysctl -p
这个值为 0 时,firewalld 的 masquerade 或 forward 区域规则会失效,现象就是“本地 telnet 通,外网连不上”。
安全组和系统防火墙是两层,阿里云/腾讯云上必须都过
云服务器上,流量路径是:公网 → 安全组(云厂商虚拟防火墙)→ Linux 内核 → firewalld/iptables → 服务进程。任一层拦截都会表现为“连接超时”。
排查顺序不能乱:
- 先去云控制台确认安全组入方向规则已添加,协议选“全部”或明确填
TCP/UDP,端口范围写准(比如8080-8080而非8080) - 再在服务器上跑
firewall-cmd --list-all,确认 zone 里真有那条ports规则 - 最后用
telnet 公网IP 端口(从外网机器)或curl -v http://公网IP:端口验证,别只测127.0.0.1
容易被忽略的一点:有些云平台的安全组规则有“优先级”或“规则叠加”,旧规则可能隐式拒绝新端口,删掉冲突项再试。











