在管理和维护 CentOS 服务器的过程中,网络配置是至关重要的一环,其中防火墙端口的开放是保障服务正常对外提供的基础操作,无论是部署 Web 应用、数据库服务,还是进行远程管理,都需要精确地控制防火墙规则,允许特定流量通过,本文将详细介绍在 CentOS 系统中,特别是针对不同版本,如何高效、安全地开放多个端口,涵盖现代的 firewalld 和传统的 iptables 两种主流防火墙管理工具,并提供最佳实践与常见问题解答。

使用 firewalld 开放端口(CentOS 7 及以上版本)
从 CentOS 7 开始,firewalld 成为了默认的防火墙管理工具,它引入了“区域”和“服务”的概念,使得防火墙管理更加动态和灵活。firewalld 支持运行时更改,无需重启防火墙服务即可生效,大大提升了管理效率。
1 理解 firewalld 的核心概念
在操作之前,简单理解几个核心概念有助于更好地配置:
- 区域:
firewalld将网络连接划分为不同的信任级别,每个级别对应一个区域,如public(公共区域,不信任)、trusted(信任区域)、dmz(隔离区)等,默认情况下,网络接口会被分配到public区域。 - 服务:预定义的端口和协议集合,
http服务对应 80 端口,https对应 443 端口,使用服务名比直接使用端口号更易于管理。 - 端口:直接指定需要开放的端口号和协议(TCP/UDP)。
2 基本操作流程
所有对 firewalld 的修改都应遵循“修改-重载-验证”的流程,以确保配置持久化并立即生效。
-
检查 firewalld 状态:
systemctl status firewalld
如果未运行,使用
systemctl start firewalld启动,并使用systemctl enable firewalld设置为开机自启。 -
查看当前区域和开放的端口:
firewall-cmd --get-active-zones firewall-cmd --zone=public --list-ports
3 开放多个端口的多种方法
firewalld 提供了多种方式来开放多个端口,可以根据实际场景选择最合适的一种。
逐个添加端口
这是最直接的方法,适用于端口数量不多且不连续的情况,使用 --add-port 选项,并配合 --permanent 参数使规则永久生效。
# 开放 80 端口 (HTTP) firewall-cmd --zone=public --add-port=80/tcp --permanent # 开放 443 端口 (HTTPS) firewall-cmd --zone=public --add-port=443/tcp --permanent # 开放 3306 端口 (MySQL) firewall-cmd --zone=public --add-port=3306/tcp --permanent
使用端口范围

如果需要开放一段连续的端口,使用端口范围是最高效的方式。
# 开放从 8000 到 8100 的所有 TCP 端口 firewall-cmd --zone=public --add-port=8000-8100/tcp --permanent
使用富规则
富规则是 firewalld 中功能最强大的特性,允许创建更复杂的防火墙规则,例如为特定 IP 地址开放多个端口。
# 允许来自 IP 192.168.1.100 的主机访问本机的 22 (SSH) 和 80 (HTTP) 端口 firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept' firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="80" accept'
富规则也可以一次性指定多个端口:
# 允许来自 192.168.1.0/24 网段的所有主机访问本机的 80 和 443 端口 firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="80" port="443" accept'
4 重载配置并验证
完成端口添加后,必须重载 firewalld 配置使 --permanent 规则生效。
firewall-cmd --reload
验证端口是否已成功开放:
firewall-cmd --zone=public --list-ports # 如果使用了富规则,可以用以下命令查看 firewall-cmd --zone=public --list-rich-rules
使用 iptables 开放端口(CentOS 6 及更早版本)
对于仍在使用 CentOS 6 或更早版本的服务器,iptables 是标准的防火墙工具。iptables 的规则是静态的,修改后需要保存才能在重启后依然有效。
1 基本操作流程
-
检查 iptables 状态:
service iptables status
-
查看当前规则:
iptables -L -n -v
2 开放多个端口的方法
iptables 中开放多个端口主要依赖于 multiport 模块,它允许在一条规则中指定多个不连续的端口。

方法:使用 multiport 模块
这是在 iptables 中开放多个不连续端口的推荐方法,简洁高效。
# 开放 TCP 协议的 80, 443, 3306 端口 iptables -I INPUT -p tcp -m multiport --dports 80,443,3306 -j ACCEPT # 开放 UDP 协议的 53, 161 端口 iptables -I INPUT -p udp -m multiport --dports 53,161 -j ACCEPT
-I INPUT:将规则插入到INPUT链的顶部(优先匹配)。-p tcp:指定协议为 TCP。-m multiport:加载multiport模块。--dports:指定目标端口列表,用逗号分隔。-j ACCEPT:匹配规则的动作是“接受”。
3 保存配置
与 firewalld 不同,iptables 的规则在内存中,重启后会丢失,必须手动保存。
service iptables save
这会将当前规则写入 /etc/sysconfig/iptables 文件中,确保系统重启后自动加载。
最佳实践与注意事项
- 最小权限原则:只开放业务所必需的端口,避免开放过多端口增加安全风险。
- 优先使用服务名:在
firewalld中,如果端口对应一个标准服务(如http,https,mysql),优先使用--add-service=<服务名>的方式,这比--add-port更具可读性和可维护性。 - 注意云平台安全组:如果您的 CentOS 服务器部署在阿里云、腾讯云、AWS 等公有云平台上,除了操作系统内部的防火墙,还需要在云平台控制台配置“安全组”规则,允许相应的流量进入,两者需要同时配置。
- SELinux 的影响:在某些情况下,即使防火墙端口已开放,服务可能仍然无法访问,这可能是 SELinux(Security-Enhanced Linux)的限制,可以使用
getsebool -a | grep <服务名>查看相关策略,并使用setsebool -P <策略名>=on来调整。
firewalld 与 iptables 对比简表
| 特性 | firewalld (CentOS 7+) | iptables (CentOS 6) |
|---|---|---|
| 管理方式 | 动态,支持运行时修改,无需重启 | 静态,修改后需保存并重启服务 |
| 核心概念 | 区域、服务 | 链、规则、表 |
| 易用性 | 更高,命令更直观,支持富规则 | 相对复杂,需要理解链和表的逻辑 |
| 默认状态 | CentOS 7+ 默认安装并启用 | CentOS 6 默认安装并启用 |
| 持久化 | 使用 --permanent 参数 |
使用 service iptables save 命令 |
相关问答 (FAQs)
我已经按照文章中的命令开放了端口,但是从外部仍然无法访问,可能是什么原因?
解答: 这是一个常见的排查问题,可能的原因有以下几点:
- 防火墙未重载:使用
firewalld时,如果添加规则时使用了--permanent,必须执行firewall-cmd --reload才能使规则生效。 - 服务未监听:确认您要开放端口对应的服务程序已经启动,并且正在监听正确的 IP 地址和端口,可以使用
ss -tulnp或netstat -tulnp命令来检查。 - 云平台安全组:如上文最佳实践所述,检查您的云服务商控制台,确保安全组入站规则已允许这些端口的流量。
- SELinux 限制:检查 SELinux 状态(
getenforce),如果是Enforcing,它可能会阻止服务,可以临时设置为Permissive模式(setenforce 0)测试是否为 SELinux 导致,如果是,则需要调整相应的 SELinux 布尔值。 - 网络链路问题:排查服务器与客户端之间的网络设备,如物理防火墙、路由器等,是否存在访问控制策略。
firewalld 和 iptables 我应该用哪个?它们可以同时使用吗?
解答:
- 选择哪个:这取决于您的 CentOS 版本,对于 CentOS 7 及以上版本,强烈推荐使用系统默认的
firewalld,因为它更现代、更易于管理,并且与 systemd 服务管理器集成得更好,对于 CentOS 6,您只能使用iptables。 - 能否同时使用:绝对不能。
firewalld和iptables是两种不同的防火墙管理工具,它们底层都操作内核的 netfilter 框架,但使用不同的规则集和机制,同时启用两者会导致规则冲突,行为不可预测,最终可能导致防火墙完全失效或出现严重的安全问题,在系统中,应该确保只有一个防火墙服务是激活状态,在 CentOS 7 中,如果您想改用iptables,需要先停止并禁用firewalld,然后安装并启用iptables-services,但对于绝大多数用户来说,坚持使用系统默认的工具是最佳选择。