firewalld开放80端口需同时执行--permanent添加和--reload重载,缺一不可;还需确认firewalld运行、selinux未拦截、服务监听0.0.0.0:80及云平台安全组放行。

CentOS 7 默认不开放 80 端口,即使 Web 服务(如 Nginx/Apache)已正常运行,外网也访问不到——核心原因是 firewalld 拦截了流量,且默认 zone(public)未放行该端口。
确认 firewalld 是否在运行
很多问题其实卡在这一步:防火墙根本没启动,却反复执行添加端口命令,自然无效。
- 运行
firewall-cmd --state,输出running才算启用;若报错或输出not running,需先启动:systemctl start firewalld - 顺手加开机自启:
systemctl enable firewalld,否则重启后又得重配 - 别依赖
systemctl status firewalld的“active (running)”就认为规则已生效——它只说明服务进程活着,不保证规则加载成功
用 firewall-cmd 开放 80/tcp 端口
必须带 --permanent + --reload,缺一不可。漏掉 --permanent 会导致重启后失效;漏掉 --reload 则规则根本没进运行时。
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
- 执行:
firewall-cmd --zone=public --add-port=80/tcp --permanent - 立即重载:
firewall-cmd --reload - 验证是否写入成功:
firewall-cmd --zone=public --query-port=80/tcp(返回yes) - 注意:不要用
firewall-cmd --list-ports查全部端口——它只显示当前 runtime 规则,不反映--permanent配置;应改用firewall-cmd --zone=public --list-ports
SELinux 可能静默拦截 80 端口
即使 firewalld 放行了,curl http://localhost 能通、但外网 telnet your_ip 80 超时,大概率是 SELinux 在作祟——它默认不允许 http_port_t 绑定到非标准上下文的进程(比如你手动改过 Apache/Nginx 的监听路径或用了非标准用户)。
- 临时验证:执行
setenforce 0(不重启),再测外网连通性;若恢复,则锁定为 SELinux 问题 - 永久解决(生产慎用):
vi /etc/selinux/config,把SELINUX=enforcing改成SELINUX=disabled,然后reboot - 更安全做法:保留 enforcing 模式,用
semanage port -a -t http_port_t -p tcp 80显式授权(需先装policycoreutils-python)
额外检查点:服务监听地址和网卡绑定
firewalld 和 SELinux 都没问题,还是不通?常见于虚拟机或云服务器场景。
- 确认 Web 服务监听的是
0.0.0.0:80或*:80,而非127.0.0.1:80(后者仅本机可访问) - 查监听状态:
ss -tlnp | grep ':80',看Local Address:Port列是否含*:80 - 云服务器(如阿里云/腾讯云)还需检查安全组规则,必须显式放行 TCP 80;VMware NAT 模式要确认 Linux 网卡(如
ens33)确实在publiczone:firewall-cmd --get-zone-of-interface=ens33
真正卡住人的从来不是“怎么开”,而是开了之后还连不上——firewalld 规则、SELinux 上下文、服务绑定地址、云平台安全组,四层漏一个就白忙。尤其 --permanent 和 --reload 必须成对出现,这是最常被跳过的硬性步骤。










