CentOS 7 防火墙:从 iptables 到 firewalld
CentOS 7 及后续版本中,默认的防火墙管理工具已从传统的 iptables 变更为 firewalld。Firewalld 提供了动态管理防火墙规则的能力,支持运行时修改配置而无需重启服务,并引入了“区域(zone)”的概念来简化网络安全管理。官方文档可参考:Red Hat Enterprise Linux 7 Security Guide。
Firewalld 服务管理
使用 systemctl 命令管理 firewalld 服务。
启动与停止服务
# 启动防火墙服务
systemctl start firewalld.service
# 停止防火墙服务
systemctl stop firewalld.service
设置开机自启
# 启用开机自启动
systemctl enable firewalld.service
# 禁用开机自启动
systemctl disable firewalld.service
Firewalld 基本状态与配置操作
查看状态与规则
# 查看防火墙运行状态
firewall-cmd --state
# 查看当前区域(默认为 public)的所有规则
firewall-cmd --list-all
重载配置
修改规则后,需要重载配置使其生效(不会中断现有连接)。
firewall-cmd --reload
端口管理
添加端口
使用 --add-port 参数添加端口。添加 --permanent 参数可使规则永久生效(重启后保留)。
# 临时添加单个 TCP 端口 9527(重启后失效)
firewall-cmd --add-port=9527/tcp
# 永久添加单个 TCP 端口 9527
firewall-cmd --permanent --add-port=9527/tcp
# 永久添加一个 TCP 端口范围(9527-10001)
firewall-cmd --permanent --add-port=9527-10001/tcp
指定区域操作
可以针对特定区域(如 public)进行操作。
# 在 public 区域永久添加 TCP 端口 8010
firewall-cmd --zone=public --permanent --add-port=8010/tcp
# 在 public 区域永久删除 TCP 端口 8010
firewall-cmd --zone=public --permanent --remove-port=8010/tcp
# 查询 public 区域是否开放了 TCP 端口 8010
firewall-cmd --zone=public --query-port=8010/tcp
查看端口监听状态
使用 ss 命令可以验证端口是否已在系统层面监听。
ss -tlnp | grep :80
服务管理
Firewalld 预定义了常见服务(如 http、https),直接添加服务比手动添加端口更方便。
为 Web 服务器开放端口
以下命令为 public 区域永久添加 HTTP (80) 和 HTTPS (443) 服务,并重载配置。
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
重要说明与最佳实践
- 永久规则:带
--permanent参数的规则会写入配置文件(/etc/firewalld/),但不会立即生效,需要执行firewall-cmd --reload或重启 firewalld 服务。 - 运行时规则:不带
--permanent的参数会立即生效,但重启服务后会丢失。测试时建议先添加运行时规则,验证无误后再添加为永久规则。 - 区域概念:Firewalld 通过区域管理不同信任级别的网络接口。如果不指定
--zone,默认对当前活动的默认区域(通常是 public)进行操作。使用firewall-cmd --get-default-zone查看默认区域。 - 配置备份:在进行重大修改前,建议备份配置文件:
sudo cp -r /etc/firewalld/ /etc/firewalld.backup。