在Linux系统中配置防火墙与开放端口,许多用户误以为只需简单“开启”或“关闭”即可。然而实际运维中,即便停用了firewalld或ufw服务,应用程序仍可能无法被外部访问。这通常源于服务监听配置、云平台安全组策略或SELinux安全机制等多层因素。因此,正确的操作流程是:首先根据您的Linux发行版选择对应的防火墙管理工具,然后进行系统性、分层级的故障排查。

如何确认当前系统使用的是 firewalld 还是 ufw
首要步骤切勿混淆:不同Linux发行版本默认的防火墙解决方案各异,使用错误的命令将无法生效。
- 在CentOS、RHEL或Fedora等Red Hat系发行版上,通常默认采用
firewalld。执行sudo systemctl status firewalld命令,若输出显示active (running)状态,则表明该服务正在运行。 - 在Ubuntu或Debian等Debian系发行版上,默认防火墙工具为
ufw。使用sudo systemctl status ufw检查其状态,active表示服务已启用。 - 如果上述两个服务均显示为
inactive,但执行sudo iptables -L -n却能查看到规则列表,则说明系统直接使用了底层的iptables。这种情况常见于较旧的系统环境或某些容器宿主机。
关键注意事项:firewalld与ufw不建议同时启用,二者可能存在规则冲突。若决定使用其中一种,请确保将另一种服务彻底停止并禁用,而非仅执行临时停止操作。
在 firewalld 中开放或关闭指定端口
使用firewalld时,最常见的误区是配置规则未生效。其规则分为“运行时”与“永久”两种类型,若需配置在系统重启后持续有效,必须遵循两个核心步骤:添加--permanent参数以保存规则,随后执行--reload重载配置。
- 开放TCP端口(以8080为例):
sudo firewall-cmd --permanent --add-port=8080/tcp - 开放UDP端口(以53为例):
sudo firewall-cmd --permanent --add-port=53/udp - 删除已开放的端口:
sudo firewall-cmd --permanent --remove-port=8080/tcp - 重载配置(关键步骤!):
sudo firewall-cmd --reload - 查看当前已开放的端口列表:
sudo firewall-cmd --list-ports
补充说明:协议类型/tcp或/udp为必须指定项,仅输入端口号如8080将导致命令执行失败。
使用 ufw 快速管理端口开关
ufw的命令语法相对直观,但仍需注意其特定行为。首先,该服务默认可能处于禁用状态,需先启用。
- 首次启用UFW服务:
sudo ufw enable - 开放TCP端口:
sudo ufw allow 8080(默认协议为TCP),也可显式指定sudo ufw allow 8080/tcp - 开放UDP端口:
sudo ufw allow 53/udp - 删除规则:此处需掌握技巧。不能直接通过端口号删除,需先执行
sudo ufw status numbered查看规则编号,再根据编号删除,例如删除第二条规则:sudo ufw delete 2。直接运行ufw deny 8080并不会移除原有的允许规则,反而会在其前添加一条拒绝规则,可能导致策略混乱。 - 查看所有生效规则:
sudo ufw status verbose
重要提示:ufw的规则匹配具有顺序性。若一条deny规则排列在allow规则之前,则放行将失效。除非您非常熟悉其工作机制,否则建议仅通过命令行工具增删规则,避免手动编辑/etc/ufw/user.rules等配置文件。
关闭防火墙不等于端口畅通:还需通过三层检查
这是最易令人困惑的环节:防火墙已关闭,端口也已配置,为何连接仍失败?问题可能存在于以下多个层面。
- 服务监听状态验证:防火墙已放行,但服务进程是否在监听?使用
sudo ss -tlnp | grep :8080或sudo netstat -tlnp | grep :8080进行核查。若未发现对应进程,可能是服务未启动,或仅绑定在127.0.0.1(本地回环地址)上,导致外部无法访问。 - 云服务器安全组配置:如果您使用的是阿里云、腾讯云、AWS等云服务商,在系统防火墙之上还存在一层“安全组”或“网络ACL”策略。此层配置具有更高优先级,必须登录云服务商的管理控制台,确保目标端口及相应IP范围已被放行。
- SELinux安全策略限制:在RHEL、CentOS等系统中,SELinux可能会拦截网络连接。可临时测试:执行
sudo setenforce 0将其切换至宽容模式。但请注意,这仅是临时解决方案;长期而言,应配置恰当的SELinux策略,而非简单地将其关闭。 - 最终连通性测试:切勿仅依赖配置检查。本地测试可使用
telnet 127.0.0.1 8080,远程服务器则推荐使用nc -zv 服务器公网IP 8080命令验证端口实际连通性。
最后,再次强调两个最高频的疏忽点:在firewalld中添加永久规则后忘记执行--reload;在ufw中删除规则时未核对编号,导致误删其他条目。这两步一旦遗漏,之前的所有配置工作都将前功尽弃。
