在服务器上起了个 web 服务,本机 curl localhost 是通的,换台电脑访问就不行。这种问题十有八九卡在端口没放行。linux开放端口要过三道关:服务监听、系统防火墙、云平台安全组,一关一关排查,五分钟能定位。
第一关:服务真的在监听吗
ss -tlnp | grep 8080输出里有 0.0.0.0:8080 或 :::8080 才算对外监听;只看到 127.0.0.1:8080,说明服务绑在本机回环地址上,外部永远连不进来,得去改服务配置里的监听地址。
第二关:系统防火墙放行
CentOS 7 之后默认用 firewalld,linux开放端口的命令是:
firewall-cmd --permanent --add-port=8080/tcpfirewall-cmd --reloadfirewall-cmd --list-portsUbuntu 上一般是 ufw:
ufw allow 8080/tcpufw status老系统还在用 iptables 的,往 INPUT 链加一条 ACCEPT 规则再保存。两个易错点:--permanent 不加的话,重启 firewalld 规则就丢;加了 --permanent 必须 reload 才真正生效,光敲第一条等于没放。
第三关:云平台的安全组
阿里云、腾讯云这类云主机,服务器里防火墙全关了外面照样不通,因为平台层还有安全组。去云控制台找到实例的安全组配置,加入方向规则:协议 TCP、端口 8080、来源按需填 0.0.0.0/0 或限定网段。改完安全组立刻生效,不用重启实例;规则里方向别选反,入方向才是外面访问你。安全组和系统防火墙是两套独立的门,都过了才通。
怎么验证真通了
在外部机器上执行 telnet 服务器IP 8080,或者 nc -zv 服务器IP 8080,能建立连接就说明放行成功。本机也可以先用 curl -v http://127.0.0.1:8080 确认服务本身响应正常,再从外部测,分清是服务问题还是网络问题;再不行就回头看服务日志和网关配置。
最后提醒:linux开放端口的原则是只开业务真正需要的,测试完的临时端口及时关回去,防火墙规则定期过一遍。全端口敞开的机器挂在公网上,被人扫到只是时间问题。