在大多数基于 RPM 的 Linux 发行版(如 CentOS、RHEL、Fedora)上,使用 firewall-cmd 命令添加端口并重载配置是最稳妥的做法。
先说结论:该方案适合 CentOS 7+ 及 RHEL 系列系统,操作前需确保拥有 root 权限,完成后务必通过外部连接测试验收。
- 适合:默认使用 firewalld 管理的 Linux 发行版
- 先准备:确认防火墙服务运行状态及 root 权限
- 验收:使用外部设备测试端口连通性
命令速用版
# 开放 8080/tcp 端口(永久生效)
sudo firewall-cmd `--permanent` `--add-port`=8080/tcp
# 重载配置使更改生效
sudo firewall-cmd `--reload`为什么会这样
firewalld 是动态管理防火墙规则的服务,默认策略通常拒绝未明确允许的入站流量。直接修改底层 iptables 或 nftables 规则可能在服务重启后丢失,而通过 firewall-cmd 配置能确保规则写入持久化配置文件。
分步处理
1. 确认防火墙状态
systemctl status firewalld如果显示 inactive,需先启动服务:systemctl start firewalld。
2. 添加端口规则
使用 `--permanent` 参数确保重启后规则依然保留,指定协议通常为 tcp。
sudo firewall-cmd `--permanent` `--add-port`=8080/tcp3. 重载配置
添加永久规则后不会立即生效,必须重载。
sudo firewall-cmd `--reload`4. 检查本地规则列表
sudo firewall-cmd `--list-ports`确认输出中包含 8080/tcp。
怎么验证是否生效
本地查看列表只能确认规则已添加,真实生效需从外部测试。
1. 外部连接测试
在另一台机器上使用 curl 或 telnet:
curl -v http://<服务器 IP>:8080
# 或
telnet <服务器 IP> 80802. 查看日志
如果连接被拒,可查看防火墙日志确认是否有丢弃记录:
journalctl -u firewalld -n 50常见坑
- 忘记加 `--permanent`:仅当前会话生效,重启后规则丢失。
- 忘记 reload:添加了永久规则但未重载,当前流量仍被拦截。
- 协议选错:服务使用 UDP 却开放了 TCP,需根据实际业务选择。
- SELinux 拦截:防火墙放行了但服务仍不可达,需检查 SELinux 是否允许该端口(公开资料中没有看到可靠的量化数据表明 SELinux 拦截概率,但这是常见排查方向)。
参考来源
- firewalld 官方文档,firewall-cmd man page,URL: https://firewalld.org/documentation/man-pages/firewall-cmd.html
- Red Hat 文档,Using firewalld,URL: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/using-firewalld_configuring-and-managing-networking