理解 CentOS 防火墙基础
CentOS 作为一款广泛使用的 Linux 发行版,其防火墙系统是保障服务器安全的重要组件,在早期版本中,CentOS 默认使用 iptables 作为防火墙管理工具,而从 CentOS 7 开始,系统引入了 firewalld 作为默认的防火墙解决方案。firewalld 提供了动态管理防火墙规则的能力,支持区域(Zone)概念,能够更灵活地处理不同网络环境的防火墙策略,无论是 iptables 还是 firewalld,正确配置端口规则都是确保服务正常运行的关键步骤。

使用 firewalld 管理端口
在 CentOS 7 及更高版本中,firewalld 是默认的防火墙管理工具,要开启端口,首先需要确认 firewalld 服务是否正在运行,可以通过以下命令检查状态:
systemctl status firewalld
如果服务未运行,可以使用 systemctl start firewalld 启动它,并通过 systemctl enable firewalld 设置开机自启。
添加永久端口规则
firewalld 支持两种模式的规则:临时规则(立即生效但重启后失效)和永久规则(需重启后生效),建议在生产环境中使用永久规则以确保配置持久化,要永久开启 HTTP 服务的 80 端口,可以执行:
firewall-cmd --permanent --add-port=80/tcp
执行后,需要重新加载防火墙配置使规则生效:
firewall-cmd --reload
验证端口是否开启
可以通过以下命令检查指定端口是否已成功添加到防火墙规则中:
firewall-cmd --permanent --list-ports
该命令会列出所有已开启的端口,确保配置正确无误。
处理复杂端口场景
在实际应用中,可能需要处理更复杂的端口配置场景,例如批量添加端口或设置端口范围。firewalld 提供了灵活的命令来满足这些需求。
批量添加端口
如果需要同时开启多个端口,可以使用空格分隔的端口列表,开启 8080 和 9090 端口:
firewall-cmd --permanent --add-port=8080/tcp --add-port=9090/tcp
设置端口范围
对于连续的端口范围,可以使用 起始端口-结束端口 的格式,开启 6000-6005 端口:
firewall-cmd --permanent --add-port=6000-6005/udp
注意:在指定端口时,需明确协议类型(如 tcp 或 udp),以避免配置错误。
管理防火墙区域
firewalld 的区域功能允许根据网络环境(如家庭、公共、工作等)应用不同的防火墙规则,默认情况下,所有接口都属于 public 区域,如果需要为特定区域开启端口,可以使用 --zone 参数,为 internal 区域开启 3306 端口:

firewall-cmd --permanent --zone=internal --add-port=3306/tcp
查看和修改默认区域
可以通过以下命令查看当前默认区域:
firewall-cmd --get-default-zone
如果需要修改默认区域,例如将默认区域设置为 home:
firewall-cmd --set-default-zone=home
使用 iptables 的注意事项
虽然 firewalld 是 CentOS 7 及更高版本的默认工具,但某些场景下仍可能需要使用 iptables,在 CentOS 6 或某些特定应用中,iptables 仍然是主流选择。
基本端口操作
使用 iptables 开启端口时,需要通过 iptables -I INPUT 命令添加规则,开启 22 端口的 SSH 服务:
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
保存规则
iptables 的默认规则不会持久化,需要手动保存,在 CentOS 6 中,可以使用 service iptables save;而在 CentOS 7 中,需安装 iptables-services 并执行:
service iptables save
防火墙规则的删除与修改
无论是 firewalld 还是 iptables,都支持删除或修改已配置的规则。
firewalld 删除端口规则
要删除已开启的端口,只需将 --add-port 替换为 --remove-port。
firewall-cmd --permanent --remove-port=80/tcp
iptables 删除规则
删除 iptables 规则需要先匹配规则编号,然后使用 -D 参数。
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
防火墙日志与故障排查
在配置防火墙时,可能会遇到端口无法访问的问题,可以通过查看日志和排查规则来定位问题。
查看防火墙日志
firewalld 的日志通常位于 /var/log/firewalld 目录下,而 iptables 的日志可通过 dmesg 或 journalctl 查看。
journalctl -u firewalld
测试端口连通性
使用 telnet 或 nc 工具测试端口是否可达。

telnet localhost 80
如果连接失败,可能是防火墙规则或服务本身的问题。
安全建议与最佳实践
在配置防火墙时,遵循安全最佳实践至关重要。
最小化开放端口
仅开放必要的服务端口,避免暴露不必要的端口以减少攻击面,生产环境中应关闭不必要的测试端口。
定期审计规则
定期检查防火墙规则,确保无冗余或过时的规则,可以通过 firewall-cmd --list-all 或 iptables -L 查看当前配置。
相关问答 FAQs
如何在 CentOS 7 中永久关闭防火墙?
答:要永久关闭 firewalld,可以执行以下命令:
systemctl stop firewalld systemctl disable firewalld
但请注意,关闭防火墙会降低服务器安全性,建议仅在测试环境中使用。
防火墙端口已开启但服务仍无法访问,如何排查?
答:首先检查服务是否正常运行(如 systemctl status httpd),然后确认防火墙规则是否正确(firewall-cmd --list-ports),检查 SELinux 状态(getenforce),必要时临时关闭 SELinux 进行测试:setenforce 0。