Linux防火墙firewalld配置
很多新手在Linux服务器上部署网站后,发现本地能访问,外网却打不开,最常见的原因就是防火墙没有放行网站端口。
本文以CentOS 7/8、RHEL等使用firewalld的系统为例,手把手教你开放80、443等常用网站端口,并验证配置是否生效。
先确认firewalld是否在运行
firewalld是Linux上常用的动态防火墙管理工具,通过区域(zone)和规则来管理端口。
操作前,先用以下命令检查它的状态:
systemctl status firewalld
如果显示active (running),说明防火墙已开启。
如果显示inactive,可以启动并设为开机自启:
systemctl start firewalld
systemctl enable firewalld
注意:如果服务器上安装了iptables且正在运行,建议先停止并禁用它,避免和firewalld冲突。
查看当前已开放的端口
开放端口前,先看看现在有哪些规则,避免重复添加:
firewall-cmd --list-all
输出中会显示ports:和services:字段。
如果ports为空,说明还没有自定义端口。
默认情况下,public区域可能只开放了ssh服务。
开放网站端口(80和443)
网站通常使用HTTP(80端口)和HTTPS(443端口)。
根据你的需求,选择以下一种方式:
方式一:直接开放端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
--permanent表示永久生效,否则重启防火墙后规则会丢失。
方式二:开放服务
firewalld预置了http和https服务,也可以直接放行:
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent
两种方式效果类似,选一种即可。
重载防火墙使规则生效
添加规则后,必须重新加载firewalld才能生效:
firewall-cmd --reload
验证:再次执行firewall-cmd --list-all,确认ports或services中已包含你添加的端口或服务。
测试端口是否真正开放
从另一台机器(或使用在线端口检测工具)测试端口连通性:
telnet 你的服务器IP 80
如果显示Connected,说明端口已开放。
如果卡住或提示Connection refused,请检查:
- 防火墙规则是否添加正确,是否执行了
--reload - 网站服务(如Nginx、Apache)是否正在监听该端口,可用
ss -tlnp | grep 80查看 - 云服务器安全组是否也放行了该端口(阿里云、腾讯云等需在控制台单独设置)
避坑指南
- 不要忘记
--permanent:不加这个参数,重启firewalld后规则会消失。 - 云服务器安全组:firewalld只是系统层防火墙,云平台还有安全组,两者都需要放行。
- 端口冲突:如果80端口被占用,先停止占用程序或改用其他端口。
- 区域选择:默认使用
public区域,如果你的网卡绑定了其他区域,请用firewall-cmd --get-active-zones查看并替换。
常见问题
问:开放端口后仍然无法访问,怎么办?
先确认firewalld规则已生效,再检查云安全组和网站服务监听状态。可以临时关闭firewalld测试:systemctl stop firewalld,如果关闭后能访问,说明问题在防火墙规则;否则检查服务本身。
问:如何关闭某个已开放的端口?
使用--remove-port参数,例如:firewall-cmd --zone=public --remove-port=80/tcp --permanent,然后重载。
问:firewalld和iptables有什么区别?
firewalld是更上层的管理工具,底层仍然调用iptables,但支持动态更新和区域概念,更适合新手。
按照以上步骤操作后,你的网站端口应该已经成功开放。
如果遇到问题,优先检查规则是否永久生效、云安全组是否放行,以及服务是否正常监听。