2.5.3 firewalld使用与区域管理

firewalld 是基于“区域(zone)”的动态防火墙管理工具,通过把网络接口绑定到不同区域,应用不同信任级别的访问策略。理解“接口 → 区域 → 服务/端口/富规则”的关系,是进行安全控制与可维护配置的基础。

原理草图(区域与接口、服务的关系):

文章图片

安装与启动(以 RHEL/CentOS 7/8 为例):

# 安装
sudo yum install -y firewalld

# 启动并设置开机自启
sudo systemctl enable --now firewalld

# 确认状态
sudo systemctl status firewalld

基础概念与关键命令说明:
- firewall-cmd --get-active-zones:查看当前激活的区域与绑定接口
- firewall-cmd --zone=<zone> --list-all:查看某区域的服务、端口、富规则
- firewall-cmd --set-default-zone=<zone>:设置默认区域
- --permanent:写入永久配置
- firewall-cmd --reload:重载规则(使永久配置生效)

区域与接口管理示例(含命令解释):

# 1) 查看当前区域与接口绑定
firewall-cmd --get-active-zones
# 预期:显示如 public: interfaces: eth0

# 2) 将外网接口 eth0 绑定到 public
firewall-cmd --zone=public --change-interface=eth0

# 3) 将内网接口 eth1 绑定到 internal
firewall-cmd --zone=internal --change-interface=eth1

# 4) 设置默认区域为 public
firewall-cmd --set-default-zone=public

# 5) 查看 public 区域的详细规则
firewall-cmd --zone=public --list-all

服务与端口放行示例(先运行时验证,再永久化):

# 1) 运行时开放 http 服务
firewall-cmd --zone=public --add-service=http

# 2) 运行时开放 8080/tcp 端口
firewall-cmd --zone=public --add-port=8080/tcp

# 3) 验证规则生效
firewall-cmd --zone=public --list-all

# 4) 永久开放 http 与 8080/tcp
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-port=8080/tcp --permanent

# 5) 重载使永久配置生效
firewall-cmd --reload

富规则(rich rule)示例:按来源放行/拒绝(适合数据库等敏感端口)

# 仅允许 10.0.0.0/24 访问 3306
firewall-cmd --zone=internal --add-rich-rule='
rule family="ipv4"
source address="10.0.0.0/24"
port protocol="tcp" port="3306"
accept' --permanent

# 拒绝单一来源 1.2.3.4 访问本机
firewall-cmd --zone=public --add-rich-rule='
rule family="ipv4"
source address="1.2.3.4"
reject' --permanent

# 重载规则
firewall-cmd --reload

验证与排错流程(含命令解释):

# 1) 确认接口绑定到正确区域
firewall-cmd --get-active-zones

# 2) 检查区域内服务/端口/富规则
firewall-cmd --zone=public --list-all
firewall-cmd --zone=internal --list-all

# 3) 检查端口是否监听
ss -lntp | grep -E '80|8080|3306'

# 4) 从客户端验证连通性(示例)
curl -I http://<server_ip>:80
nc -vz <server_ip> 8080

# 5) 若运行时规则有效但重启失效
firewall-cmd --runtime-to-permanent

常见排错点:
- 规则加在错误区域(接口未绑定或默认区域不符合预期)。
- 只加了运行时规则,未永久化。
- 应用本身未监听端口(需结合 ss -lntp 排查)。

综合场景示例(外网仅开放 80/443/22,内网允许 3306):

# 外网口 eth0 -> public
firewall-cmd --zone=public --change-interface=eth0

# 内网口 eth1 -> internal
firewall-cmd --zone=internal --change-interface=eth1

# public 仅开放 22/80/443
firewall-cmd --zone=public --add-service=ssh --permanent
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent

# internal 允许 3306 仅对 10.0.0.0/24
firewall-cmd --zone=internal --add-rich-rule='
rule family="ipv4"
source address="10.0.0.0/24"
port protocol="tcp" port="3306"
accept' --permanent

# 应用配置
firewall-cmd --reload

练习与实操:
1. 将 eth0 绑定到 public,开放 22/80/443,并验证外网可访问。
2. 新建一条富规则,仅允许 192.168.10.0/24 访问 8080,验证其他网段被拒绝。
3. 将运行时规则同步为永久规则,重启 firewalld 后验证仍生效。