许多个人站长在搭建网站时,经常会遇到一个令人困惑的问题:我在系统里明明已经设置了Web服务(如Nginx或Apache)监听80端口,并且服务正在运行,但为什么外网还是无法通过IP地址访问我的网站?
答案通常非常简单,但涉及两个层面的“防火墙”概念,它们必须同时放行你的请求:系统内部防火墙和云平台安全组。
我们将按照排查顺序,一步步找出问题的所在。
步骤一:确认Web服务是否正在监听
首先,你需要确认你的Nginx或Apache服务是否真的在运行,并且监听了正确的地址和端口(通常是0.0.0.0:80)。
登录到你的VPS或云主机,执行以下命令:
# 使用ss命令检查端口监听情况
ss -tulpn | grep 80
# 或者使用netstat命令 (如果ss不可用)
# netstat -tulpn | grep 80
预期结果: 你应该能看到类似 LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:((“nginx”,pid=1234,fd=6))) 的输出。如果看不到任何监听80端口的服务,说明你的Web服务配置错误或根本没有启动。
步骤二:检查操作系统内部防火墙
即使服务正在监听,操作系统内部的防火墙(如UFW或firewalld)也可能阻止外部连接进入。这是最常见的内部障碍。
1. Debian/Ubuntu (使用 UFW)
检查UFW状态,如果状态是 active,你需要放行80端口:
# 检查UFW状态
ufw status
# 允许TCP 80 端口
udo ufw allow 80/tcp
# 重新加载或启用UFW
udo ufw reload
2. CentOS/RHEL (使用 firewalld)
检查firewalld状态,如果服务是活跃的,你需要将80端口加入到永久规则中:
# 检查firewalld状态
firewall-cmd --state
# 开放80端口 (http 服务)
firewall-cmd --zone=public --add-service=http --permanent
# 或者直接开放端口
# firewall-cmd --zone=public --add-port=80/tcp --permanent
# 重新加载防火墙规则
firewall-cmd --reload
步骤三:检查云平台安全组/网络ACL(最有可能的元凶)
如果你的VPS或虚拟机是部署在阿里云、腾讯云、AWS、Azure或Google Cloud等公有云平台上,它们都在VM实例之前设置了一个额外的、独立于操作系统的虚拟防火墙,即安全组(Security Group)。
安全组的默认策略通常是:拒绝所有入站流量。 即使你在系统内部开放了80端口,如果安全组没有显式放行,流量根本无法到达你的VPS。
操作步骤:
- 登录你的云服务商控制台。
- 找到你的VPS/VM实例的管理页面。
- 进入“安全组”、“防火墙”或“网络ACL”配置界面。
- 找到与你的实例关联的安全组规则。
- 添加入站(Inbound)规则,配置如下:
- 协议(Protocol): TCP
- 端口范围(Port Range): 80/80
- 源地址(Source/Source IP): 0.0.0.0/0 (表示允许所有外部IP访问)
- 保存规则并等待数秒使其生效。
总结排查流程
当你遇到外网无法访问80端口的问题时,请记住这个排查顺序:
- 服务监听检查: ss -tulpn | grep 80 (服务在运行吗?)
- 系统防火墙检查: 检查UFW或firewalld是否已放行80端口。
- 云平台安全组检查: 确保云控制台的安全组规则允许来自外部(0.0.0.0/0)的TCP 80流量。
汤不热吧