firewalld的使用

firewalld的使用

  • [一、firewalld 的介绍](#一、firewalld 的介绍)
    • [1.1 zone 的概念与查看](#1.1 zone 的概念与查看)
    • [1.2 开放端口](#1.2 开放端口)
    • [1.3 开放服务](#1.3 开放服务)
    • [1.4 重载规则](#1.4 重载规则)
    • [1.5 查看规则](#1.5 查看规则)
  • [二、firewalld 常用命令](#二、firewalld 常用命令)
  • 三、高级配置
    • [3.1 富规则配置](#3.1 富规则配置)
    • [3.2 NAT与端口转发](#3.2 NAT与端口转发)
    • [3.3 ICMP控制](#3.3 ICMP控制)
  • 四、firewalld与iptables的区别

一、firewalld 的介绍

firewalld 防火墙是 CentOS 7 系统默认的防火墙管理工具,取代了之前的 iptables 防火墙。它同样工作在网络层,属于包过滤防火墙。

主要特性

  • 支持 IPv4、IPv6 防火墙设置以及以太网桥
  • 支持服务或应用程序直接添加防火墙规则接口
  • 拥有两种配置模式:临时模式(运行时生效,重启后失效)和永久模式(配置持久化,需重载生效)。

与 iptables 的关系

firewalld 和 iptables 都是用来管理防火墙的工具(属于用户态),用于定义防火墙的各种规则功能。它们的内部结构都指向 netfilter 网络过滤子系统(属于内核态)来实现包过滤防火墙功能。

firewalld 提供了支持网络区域(zone)所定义的网络连接以及接口安全等级的动态防火墙管理工具。

firewalld 定义的 9 个区域(zone)

firewalld 通过"区域(zone)"来管理不同信任级别的网络连接。每个区域预置了一套规则,管理员可以将网络接口或源 IP 地址绑定到特定区域。

下表列出了所有预定义的区域及其默认行为:

区域 说明
trusted(信任区域) 允许所有的传入流量。
public(公共区域) 允许与 sshdhcpv6-client 预定义服务匹配的传入流量,其余均拒绝 。是新添加网络接口的默认区域
external(外部区域) 允许与 ssh 预定义服务匹配的传入流量,其余均拒绝。通常用于伪装的外部网络(如路由器)。
home(家庭区域) 允许与 sshmdnssamba-clientdhcpv6-client 预定义服务匹配的传入流量,其他均拒绝
internal(内部区域) 默认值与 home 区域相同。
work(工作区域) 允许与 sshdhcpv6-client 预定义服务匹配的传入流量,其他均拒绝
dmz(隔离区域/非军事区) 允许与 ssh 预定义服务匹配的传入流量,其他均拒绝。用于对外公开的服务。
block(限制区域) 拒绝所有传入流量
drop(丢弃区域) 丢弃所有传入流量(无回复)。

区域(zone)核心概念

  • 安全程度由规则决定:一个区域的最终安全程度取决于管理员在该区域中设置的规则。
  • 安全门比喻:区域如同进入主机的安全门,每个区域都具有不同限制程度的规则,只会允许符合规则的流量传入。
  • 灵活部署:可以根据网络规模,使用一个或多个区域。但是,任何一个活跃区域至少需要关联源地址或接口。
  • 默认配置 :默认情况下,public 区域是默认区域,包含所有接口(网卡)。

1.1 zone 的概念与查看

zone(区域) 是 firewalld 的核心概念,它定义了不同信任级别的网络环境(如 public、home、internal 等),每个区域都预置了一套防火墙规则。通过将网络接口或源 IP 绑定到特定区域,可以快速应用相应的安全策略。

查看所有可用区域:

bash 复制代码
[root@docker ~]# firewall-cmd --get-zones
block dmz docker drop external home internal nm-shared public trusted work

查看当前默认区域:

bash 复制代码
firewall-cmd --get-default-zone

查看所有活跃区域及其绑定的接口:

bash 复制代码
[root@docker ~]# firewall-cmd --get-active-zones
public
  interfaces: ens33

1.2 开放端口

开放端口允许外部访问服务器上的特定网络服务。

临时开放端口(重启后失效):

bash 复制代码
# 开放单个端口(如 TCP 80 端口)
firewall-cmd --add-port=80/tcp

# 开放端口范围(如 UDP 10000-20000)
firewall-cmd --add-port=10000-20000/udp

永久开放端口(需重载规则):

bash 复制代码
# 永久开放端口
firewall-cmd --add-port=80/tcp --permanent

# 重载规则使永久配置生效
firewall-cmd --reload

查看已开放的端口:

bash 复制代码
# 查看当前区域开放的端口
firewall-cmd --list-ports

# 查看指定区域开放的端口
firewall-cmd --zone=public --list-ports

1.3 开放服务

firewalld 预定义了常见服务(如 http、ssh、mysql),开放服务比直接开放端口更语义化且安全。

查看所有预定义服务:

bash 复制代码
firewall-cmd --get-services

临时开放服务:

bash 复制代码
# 开放 HTTP 服务
firewall-cmd --add-service=http

# 同时开放多个服务
firewall-cmd --add-service={http,https,ssh}

永久开放服务:

bash 复制代码
firewall-cmd --add-service=http --permanent
firewall-cmd --reload

查看已开放的服务:

bash 复制代码
# 查看当前区域开放的服务
firewall-cmd --list-services

# 查看指定区域开放的服务
firewall-cmd --zone=public --list-services

1.4 重载规则

当修改了永久规则(--permanent)后,必须重载才能使新规则生效,同时不会中断现有连接。

bash 复制代码
# 重载防火墙规则
firewall-cmd --reload

注意:

  • --reload 会重新加载所有永久规则,并保留当前运行时规则。
  • systemctl restart firewalld 不同,--reload 是平滑重载,不会导致现有连接中断。

1.5 查看规则

查看当前生效的防火墙规则是日常管理和排错的关键

查看当前区域所有规则(最常用):

bash 复制代码
firewall-cmd --list-all

输出示例:

bash 复制代码
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: dhcpv6-client ssh http
  ports: 443/tcp
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

查看指定区域所有规则:

bash 复制代码
firewall-cmd --zone=internal --list-all

查看富规则(Rich Rules):

bash 复制代码
firewall-cmd --list-rich-rules

查看所有永久配置:

bash 复制代码
firewall-cmd --list-all --permanent

最佳实践建议:

  1. 修改规则前,先用 --list-all 查看当前状态。
  2. 测试规则时,先使用临时命令(不加 --permanent),确认无误后再转为永久规则。
  3. 每次使用 --permanent 参数修改后,必须执行 firewall-cmd --reload 使规则生效。
  4. 使用 firewall-cmd --runtime-to-permanent 可将当前所有临时规则一次性保存为永久规则。

二、firewalld 常用命令

bash 复制代码
# 1. 查看 firewalld 服务状态
systemctl status firewalld

# 2. 启动 firewalld 服务
systemctl start firewalld

# 3. 设置 firewalld 开机自启
systemctl enable firewalld

# 4. 查看所有可用区域
firewall-cmd --get-zones
# 输出示例:block dmz drop external home internal public trusted work

# 5. 查看当前默认区域
firewall-cmd --get-default-zone
# 输出示例:public

# 6. 设置默认区域(如设置为 public)
firewall-cmd --set-default-zone=public

# 7. 查看当前活跃区域及其绑定的网络接口
firewall-cmd --get-active-zones

# 8. 查看指定网络接口(如 ens33)绑定的区域
firewall-cmd --get-zone-of-interface=ens33

# 9. 为指定接口绑定到特定区域(如将 ens37 绑定到 dmz 区域)
firewall-cmd --zone=dmz --add-interface=ens37

# 10. 更改指定区域绑定的网络接口(如将 dmz 区域的接口改为 ens33)
firewall-cmd --zone=dmz --change-interface=ens33

# 11. 从指定区域移除绑定的网络接口(如从 dmz 区域移除 ens37)
firewall-cmd --zone=dmz --remove-interface=ens37

# 12. 查看默认区域的所有配置
firewall-cmd --list-all

# 13. 查看指定区域(如 dmz)的所有配置
firewall-cmd --zone=dmz --list-all

# 14. 查看指定区域(如 public)允许访问的服务
firewall-cmd --zone=public --list-services

# 15. 查看系统所有预定义的服务名称
firewall-cmd --get-services

# 16. 查看指定区域(如 public)允许访问的端口
firewall-cmd --zone=public --list-ports

# 17. 为指定区域临时添加允许访问的服务(如 public 区域添加 http 服务)
firewall-cmd --zone=public --add-service=http

# 18. 为指定区域删除允许访问的服务
firewall-cmd --zone=public --remove-service=http

# 19. 一次性添加多个服务(支持花括号扩展)
firewall-cmd --zone=public --add-services={http,https,redis,ssh}

# 20. 为指定区域添加允许访问的端口(可同时添加多个)
firewall-cmd --zone=public --add-port=22/tcp --add-port=80-100/tcp

# 21. 为指定区域删除允许访问的端口
firewall-cmd --zone=public --remove-port=22/tcp --remove-port=80-100/tcp

# 22. 将当前所有临时规则保存为永久规则(推荐工作流)
firewall-cmd --runtime-to-permanent

# 23. 直接添加永久规则(需重载生效)
firewall-cmd --permanent --zone=public --add-service=http

# 24. 重载防火墙规则(使永久配置生效)
firewall-cmd --reload
# 或使用服务重启(会中断现有连接)
systemctl restart firewalld

# 25. 禁止特定源 IP 访问(模拟 iptables 的 DROP)
# 将 192.168.100.134/24 网段添加到 drop 区域,直接丢弃其流量
firewall-cmd --add-source=192.168.100.134/24 --zone=drop

# 26. 拒绝特定源 IP 访问(模拟 iptables 的 REJECT)
# 将 192.168.100.134/24 网段添加到 block 区域,返回拒绝响应
firewall-cmd --add-source=192.168.100.134/24 --zone=block

# 27. 允许特定源 IP 完全访问(信任该源)
firewall-cmd --add-source=192.168.100.134/24 --zone=trusted

# 28. 添加端口转发规则
# 将到达本机 public 区域 80 端口的 TCP 流量转发到本机的 8080 端口
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080

# 29. 删除端口转发规则
# 删除将 80 端口转发到 192.168.100.134:80 的规则
firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.100.134

使用示例

bash 复制代码
# 1. 临时添加 http 服务
[root@hunan-sc ~]# firewall-cmd --add-service=http
success

# 说明:http 服务默认使用 80 端口,https 服务默认使用 443 端口

# 2. 临时添加端口(手动指定)
[root@hunan-sc ~]# firewall-cmd --add-port=443/tcp
success
[root@hunan-sc ~]# firewall-cmd --add-port=80/tcp
success

# 3. 查看当前所有规则(验证临时添加效果)
[root@hunan-sc ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client http ssh
  ports: 443/tcp 80/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

# 4. 重载规则(不影响临时规则)
[root@hunan-sc ~]# firewall-cmd --reload
success

# 5. 永久添加 80 端口规则
[root@hunan-sc ~]# firewall-cmd --add-port=80/tcp --permanent
success
# permanent 表示永久生效

# 6. 重载使永久规则生效
[root@hunan-sc ~]# firewall-cmd --reload
success

# 7. 查看规则,确认 80 端口已永久添加
[root@hunan-sc ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client ssh
  ports: 80/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

# 8. 删除永久规则
[root@hunan-sc ~]# firewall-cmd --remove-port=80/tcp --permanent
success
[root@hunan-sc ~]# firewall-cmd --reload
success

# 9. 查看最终规则状态
[root@hunan-sc ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client http mysql ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

三、高级配置

3.1 富规则配置

bash 复制代码
# 允许特定IP访问SSH(永久)
firewall-cmd --permanent --add-rich-rule='
  rule family="ipv4"
  source address="192.168.1.100/32"
  service name="ssh"
  accept'

# 拒绝某网段访问HTTP并记录日志
firewall-cmd --permanent --add-rich-rule='
  rule family="ipv4"
  source address="10.0.0.0/8"
  service name="http"
  log prefix="BLOCK_HTTP: " level="warning"
  reject'

# 限制SSH连接速率(防止暴力破解)
firewall-cmd --permanent --add-rich-rule='
  rule family="ipv4"
  service name="ssh"
  limit value="3/m"
  accept'

查看

bash 复制代码
firewall-cmd --list-rich-rules

rule family="ipv4" service name="ssh" accept limit value="3/m"
rule family="ipv4" source address="192.168.1.100/32" service name="ssh" accept
rule family="ipv4" source address="10.0.0.0/8" service name="http" log prefix="BLOCK_HTTP: " level="warning" reject

3.2 NAT与端口转发

bash 复制代码
# 启用IP伪装(NAT,共享上网)
firewall-cmd --permanent --zone=external --add-masquerade

# 端口转发(将80端口转发到8080)
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080

# 带IP的端口转发(转发到其他主机)
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.10:toport=8080

3.3 ICMP控制

bash 复制代码
# 允许ping(echo-request)
firewall-cmd --permanent --add-icmp-block-inversion
firewall-cmd --permanent --remove-icmp-block=echo-request

# 阻止 traceroute(time-exceeded)
firewall-cmd --permanent --add-icmp-block=time-exceeded

四、firewalld与iptables的区别

对比维度 firewalld iptables
设计理念 动态管理,区域化抽象,易用优先 静态规则,底层直接操作,灵活优先
配置方式 运行时 + 永久双模式,支持增量更新 直接替换规则集,修改需重启服务
性能 CentOS 8+ 使用 nftables 后端,高效匹配 线性匹配,规则越多越慢
适用场景 日常运维、快速部署、多区域网络 高度自定义、复杂策略、性能敏感场景
规则结构 基于区域分组,逻辑清晰 链 - 表 - 规则结构,层级复杂
相关推荐
z202305083 小时前
以太网之VLAN介绍
linux·服务器·网络·人工智能·ai
孙高飞3 小时前
直播预告 - 周日晚 7 点半-AI 驱动 UI 自动化
运维·自动化
qq_196976173 小时前
硬核多语言办公方案:基于Gemini境像站的实时翻译与双语文档自动化生成管道(国内免费镜像实测)
运维·自动化
拉不拉斯4 小时前
Linux 性能调优实战指南:从 perf 实时监控到火焰图生成
linux·运维·服务器·perf
Agent手记4 小时前
环保排放数据自动上报全流程自动化—— 2026企业级智能体(Agent)落地全指南
运维·人工智能·ai·自动化
LCG元4 小时前
RAG工程指南:从基础检索到生产部署全解析
java·运维·数据库
小生迷途知返4 小时前
影响巨大!Linux 提权大洞速速复现!!!暂无补
linux·运维·服务器
FreeBuf_4 小时前
Claude Mythos Preview 实现自动化漏洞研究突破,可构建PoC漏洞利用链
运维·自动化
风静如云5 小时前
VMware:下载
运维