Linux(CentOS)系统管理入门笔记(第二十一期)——防火墙管理(Firewalld)——zone、服务端口、富规则与端口转发

Linux(CentOS)系统管理入门笔记(第二十一期)------防火墙管理(Firewalld)------zone、服务/端口、富规则与端口转发

Linux系统管理入门系列更多文章欢迎访问:

Linux入门------系统管理1Linux入门------系统管理2

我的主页:AOwhisky,这里有更多运维系统性知识整理和其他有趣内容,欢迎与我一起探讨学习~

引言:服务器的"门卫"------防火墙如何守护你的系统?

想象一下你管理着一栋写字楼。楼里有不同的区域:普通办公区、财务室、服务器机房、总裁办公室。你不可能让所有人都能随意进出所有房间------你需要一个 "门卫" 来把关。

Linux 系统中的防火墙就是这个"门卫"。它工作在网络边缘,对进出系统的数据包进行检查------合法的放行,非法的拦截。

CentOS 7 使用 Firewalld 作为默认防火墙管理工具。与传统的 iptables 不同,Firewalld 最大的特点是 动态------修改规则时不需要重启防火墙服务,不会中断现有连接。

Firewalld 引入了 区域(zone) 的概念,将不同的网络接口或来源分配到不同的信任等级区域中,简化了规则管理:

  • 你的家庭网络(信任度高)→ home 区域
  • 公司的内部网络(半信任)→ internal 区域
  • 互联网(不信任)→ public 区域
  • 完全不信任 → drop 区域(直接丢弃数据包)

本期将系统学习:

  • 防火墙的核心概念:Netfilter、Nftables、动态 vs 静态防火墙
  • Firewalld 区域(zone) :信任等级、匹配规则
  • firewall-cmd 命令:服务管理、端口管理、端口转发
  • 富规则(Rich Rule) :精细化访问控制

读完这一期,你将掌握 Firewalld 防火墙的完整管理技能------从开放服务端口到配置复杂的访问控制策略。
--- Compiled and Authored by Whisky --- Augest 1 st, 2026

目录

  1. 防火墙概述
    • 1.1 防火墙的类型
    • 1.2 Netfilter 与 Nftables
    • 1.3 动态防火墙 vs 静态防火墙
  2. Firewalld 区域(zone)概念
    • 2.1 预定义区域
    • 2.2 数据包与区域的匹配规则
    • 2.3 区域内规则的优先级
  3. firewall-cmd 命令行工具
    • 3.1 运行时与永久配置
    • 3.2 zone 管理
    • 3.3 接口与来源管理
    • 3.4 服务管理
    • 3.5 端口管理
  4. 端口转发与伪装(NAT)
    • 4.1 伪装(Masquerade)
    • 4.2 端口转发(Forward Port)
  5. 富规则(Rich Rule)
    • 5.1 富规则语法
    • 5.2 实战示例:禁止 Ping 与白名单
  6. firewall-config 图形工具
  7. 总结与速查手册

1. 防火墙概述

1.1 防火墙的类型

防火墙按保护范围可分为:

类型 作用范围 示例
主机防火墙 保护单台主机 Firewalld、iptables
网络防火墙 保护整个网络边界 硬件防火墙(华为、华三)

按实现方式可分为:

类型 说明 示例
硬件防火墙 专用硬件设备 华为 USG、天融信 NGFW
软件防火墙 运行在通用硬件上的软件 Firewalld、iptables

按网络协议层次可分为:

类型 工作层级 优点 缺点
网络层防火墙(包过滤) OSI 第 3-4 层 速度快,对用户透明 无法检查应用层数据
应用层防火墙(代理/WAF) OSI 第 7 层 可检测应用层攻击(SQL注入、XSS) 速度慢,处理复杂

1.2 Netfilter 与 Nftables

Linux 内核中的 Netfilter 子系统是防火墙的"幕后英雄"------它工作在内核态,对进入系统的每个数据包进行检查、修改、丢弃或路由。

text 复制代码
用户态                          内核态
┌─────────────┐            ┌─────────────────┐
│ Firewalld   │  ───────→  │    Nftables     │
│ (动态防火墙) │  配置规则   │   (规则引擎)     │
├─────────────┤            ├─────────────────┤
│  iptables   │  ───────→  │    Netfilter    │
│ (静态防火墙) │  配置规则   │  (内核过滤框架)   │
└─────────────┘            └─────────────────┘
                                    ↓
                              数据包过滤/转发

Netfilter 的多个前端工具

工具 作用
iptables 过滤 IPv4 数据包
ip6tables 过滤 IPv6 数据包
arptables 过滤 ARP 协议数据包
ebtables 过滤数据链路层数据包

Nftables 是 Netfilter 的增强版,优势包括:

  • 更快的数据包处理
  • 更快的规则集更新
  • 使用单个 nft 工具管理所有协议

1.3 动态防火墙 vs 静态防火墙

维度 静态防火墙(iptables) 动态防火墙(Firewalld)
规则加载方式 修改规则后重新加载全部规则 仅更新变更部分
连接中断 重新加载可能中断现有连接 不中断现有连接
配置方式 直接编辑规则文件或命令 通过 firewall-cmd 管理
区域概念 ❌ 无 ✅ 有(zone)

2. Firewalld 区域(zone)概念

2.1 预定义区域

Firewalld 将网络划分为不同的 区域(zone) ,每个区域有一套独立的规则集。系统默认提供了 9 个区域:

区域 信任等级 默认行为 适用场景
trusted 🔒 最高 允许所有流量 内部可信网络
home 🔒 高 允许 SSH、mDNS、Samba 等 家庭网络
internal 🔒 高 与 home 类似 企业内部网络
work 🔒 中高 允许 SSH、DHCPv6 等 办公网络
public 🔒 中 允许 SSH、DHCPv6(新接口默认 公共网络(最常用)
external 🔒 中 允许 SSH,启用伪装 路由器外网接口
dmz 🔒 中低 仅允许 SSH 非军事区(DMZ)
block 🔒 低 拒绝所有传入流量(返回拒绝信息) 黑名单场景
drop 🔒 最低 丢弃所有传入流量(不响应) 高安全场景
bash 复制代码
# 查看所有可用区域
[root@centos7 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

2.2 数据包与区域的匹配规则

当数据包到达系统时,Firewalld 按以下顺序决定使用哪个区域:

text 复制代码
① 数据包的源 IP 是否匹配某个区域的 source?
   ├─ 是 → 使用该区域
   └─ 否 → 继续↓

② 数据包进入的网卡(接口)是否关联了某个区域?
   ├─ 是 → 使用该区域
   └─ 否 → 继续↓

③ 使用默认区域(default zone)

⚠️ 重要lo(回环接口)默认映射到 trusted 区域,确保本地服务通信不受限制。

2.3 区域内规则的优先级

同一区域内,规则匹配顺序如下:

text 复制代码
1. 端口转发(Port Forwarding)
2. 伪装(Masquerade)
3. 允许规则(Accept)
4. 拒绝规则(Reject)
5. 默认行为(default 为拒绝,trusted 为允许)

💡 富规则(Rich Rule) 的优先级高于区域内所有普通规则。

3. firewall-cmd 命令行工具

firewall-cmd 是 Firewalld 的主要管理工具。核心概念:

概念 说明
运行时(runtime) 修改后立即生效,重启 Firewalld 后丢失
永久(permanent) 修改写入配置文件,需 --reload 后生效
默认区域 新接口默认关联的区域,CentOS 7 默认为 public

💡 最佳实践:生产环境建议先配置永久规则,再 reload,或同时添加两条(一条永久 + 一条运行时)。

3.1 查看区域状态

bash 复制代码
# 查看默认区域
[root@centos7 ~]# firewall-cmd --get-default-zone
public

# 查看当前激活的区域(有接口或来源关联)
[root@centos7 ~]# firewall-cmd --get-active-zones
public
  interfaces: ens32

# 查看默认区域的完整规则
[root@centos7 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens32
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

# 查看所有区域的所有规则
[root@centos7 ~]# firewall-cmd --list-all-zones

3.2 区域管理

bash 复制代码
# 设置默认区域
[root@centos7 ~]# firewall-cmd --set-default-zone=trusted
[root@centos7 ~]# firewall-cmd --get-default-zone
trusted

# 恢复默认
[root@centos7 ~]# firewall-cmd --set-default-zone=public

# 创建新区域(必须使用 --permanent)
[root@centos7 ~]# firewall-cmd --permanent --new-zone=myweb
[root@centos7 ~]# firewall-cmd --reload
[root@centos7 ~]# firewall-cmd --get-zones
block dmz drop external home internal myweb public trusted work

# 删除区域
[root@centos7 ~]# firewall-cmd --permanent --delete-zone=myweb
[root@centos7 ~]# firewall-cmd --reload

# 设置区域 target(default/ACCEPT/DROP/REJECT)
[root@centos7 ~]# firewall-cmd --permanent --zone=myweb --set-target=REJECT
[root@centos7 ~]# firewall-cmd --reload

3.3 接口管理

bash 复制代码
# 查看接口属于哪个区域
[root@centos7 ~]# firewall-cmd --get-zone-of-interface=ens32
public

# 将接口绑定到特定区域
[root@centos7 ~]# firewall-cmd --add-interface=ens32 --zone=home

# 将接口变更到另一个区域
[root@centos7 ~]# firewall-cmd --change-interface=ens32 --zone=public

# 从区域中删除接口
[root@centos7 ~]# firewall-cmd --remove-interface=ens32 --zone=home

# 查看区域绑定的接口列表
[root@centos7 ~]# firewall-cmd --list-interfaces
ens32

3.4 服务管理

服务是预定义的端口/协议组合。例如,http 服务 = TCP 端口 80。

bash 复制代码
# 查看所有预定义服务
[root@centos7 ~]# firewall-cmd --get-services
... http https imap ipp ipp-client ipsec iscsi-target ...
# 查看某个服务的定义
[root@centos7 ~]# cat /usr/lib/firewalld/services/http.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>WWW (HTTP)</short>
  <description>HTTP is the protocol used to serve Web pages...</description>
  <port protocol="tcp" port="80"/>
</service>

# 添加服务(运行时)
[root@centos7 ~]# firewall-cmd --add-service=http
success

# 添加服务(永久)
[root@centos7 ~]# firewall-cmd --add-service=http --permanent
success

# 查看已开放的服务
[root@centos7 ~]# firewall-cmd --list-services
cockpit dhcpv6-client http ssh

# 查询服务是否已开放
[root@centos7 ~]# firewall-cmd --query-service=http
yes

# 删除服务
[root@centos7 ~]# firewall-cmd --remove-service=http

⚠️ 注意--permanent 修改后需执行 firewall-cmd --reload 使其生效。

3.5 端口管理

当服务不在预定义列表中时,可直接开放端口。

bash 复制代码
# 开放 TCP 端口 5900(VNC)
[root@centos7 ~]# firewall-cmd --add-port=5900/tcp

# 开放端口范围(如 5900-5910)
[root@centos7 ~]# firewall-cmd --add-port=5900-5910/tcp

# 查看已开放端口
[root@centos7 ~]# firewall-cmd --list-ports
5900/tcp

# 查询端口是否已开放
[root@centos7 ~]# firewall-cmd --query-port=5900/tcp
yes

# 删除端口
[root@centos7 ~]# firewall-cmd --remove-port=5900/tcp

3.6 协议管理

bash 复制代码
# 开放 ICMP 协议
[root@centos7 ~]# firewall-cmd --add-protocol=icmp

# 查看已开放的协议
[root@centos7 ~]# firewall-cmd --list-protocols
icmp

# 删除协议
[root@centos7 ~]# firewall-cmd --remove-protocol=icmp

4. 端口转发与伪装(NAT)

4.1 伪装(Masquerade)

伪装(Masquerade) 是 SNAT(源网络地址转换)的一种形式,让内部网络的主机通过防火墙访问外部网络。

text 复制代码
内网主机 10.1.8.10  →  Firewalld(10.1.8.88) → 外网
          源IP:10.1.8.10      源IP被伪装为 10.1.8.88
bash 复制代码
# 启用伪装(需在 external 等区域启用)
[root@centos7 ~]# firewall-cmd --add-masquerade

# 查看伪装状态
[root@centos7 ~]# firewall-cmd --query-masquerade
yes

# 禁用伪装
[root@centos7 ~]# firewall-cmd --remove-masquerade

4.2 端口转发(Forward Port)

端口转发 将访问防火墙某端口的流量转发到其他主机或端口。

text 复制代码
外网用户访问 10.1.8.88:8000 → 转发 → 10.1.8.10:80

⚠️ 先决条件 :启用端口转发前,必须先在对应区域启用 masquerade

bash 复制代码
# 启用伪装
[root@centos7 ~]# firewall-cmd --add-masquerade

# 语法:port=源端口:proto=协议[:toport=目标端口][:toaddr=目标IP]

# 转发本机 8000 端口到本机 80 端口
[root@centos7 ~]# firewall-cmd --add-forward-port=port=8000:proto=tcp:toport=80

# 转发到其他主机(10.1.8.10:22)
[root@centos7 ~]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.8.10

# 查看端口转发规则
[root@centos7 ~]# firewall-cmd --list-forward-ports
port=8000:proto=tcp:toport=80:toaddr=
port=1022:proto=tcp:toport=22:toaddr=10.1.8.10

# 删除端口转发
[root@centos7 ~]# firewall-cmd --remove-forward-port=port=8000:proto=tcp:toport=80

5. 富规则(Rich Rule)

富规则(Rich Rule) 是 Firewalld 中最灵活的规则配置方式,可以实现:

  • 对特定源 IP 的访问控制
  • 记录日志和审计
  • 速率限制
  • 更精细的 icmp 控制

5.1 富规则语法

text 复制代码
rule [family="ipv4|ipv6"]
     [source address="CIDR"]
     [destination address="CIDR"]
     service|port|protocol|icmp-block|icmp-type|masquerade|forward-port
     [log [prefix="text"] [level="level"] [limit="rate"]]
     [audit [limit="rate"]]
     [accept|reject|drop|mark]

5.2 实战示例

示例 1:禁止所有主机 Ping 本机

bash 复制代码
[root@centos7 ~]# firewall-cmd --add-rich-rule='rule protocol value=icmp drop'

# 或明确拒绝类型
[root@centos7 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 protocol value=icmp reject type=net-prohib'

# 查看富规则
[root@centos7 ~]# firewall-cmd --list-rich-rules
rule protocol value="icmp" drop

# 删除富规则
[root@centos7 ~]# firewall-cmd --remove-rich-rule='rule protocol value="icmp" drop'

示例 2:只允许特定 IP(10.1.8.10)Ping 本机

bash 复制代码
# 方法:先禁止所有 Ping,再允许特定 IP
[root@centos7 ~]# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="10.1.8.10" icmp-type name="echo-request" accept'
[root@centos7 ~]# firewall-cmd --permanent --add-icmp-block-inversion
[root@centos7 ~]# firewall-cmd --complete-reload

示例 3:来源 IP 限速

bash 复制代码
# 来源 10.1.8.0/24 访问 HTTP 服务,每秒限制 3 次
[root@centos7 ~]# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="10.1.8.0/24" service name="http" accept limit value="3/s"'

# 带日志的版本
[root@centos7 ~]# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="10.1.8.0/24" service name="http" log prefix="HTTP-LIMIT" level="info" limit value="1/s" accept limit value="3/s"'

6. firewall-config 图形工具

对于不熟悉命令行的用户,Firewalld 提供了图形界面工具 firewall-config

bash 复制代码
# 安装(CentOS 7 默认已安装)
[root@centos7 ~]# yum install -y firewall-config

# 启动(需图形界面环境)
[root@centos7 ~]# firewall-config

主要功能区域

菜单/区域 功能
选项 → 重载防火墙 重新加载永久配置
选项 → 改变默认区域 设置默认区域
选项 → 应急模式 启用 panic 模式(拒绝所有流量)
服务 勾选开放的服务
端口 添加/删除开放端口
伪装 启用/禁用 NAT
端口转发 配置端口转发规则
富规则 添加/删除富规则

7. 总结与速查手册

7.1 核心知识点一览

主题 关键点
Netfilter Linux 内核防火墙框架,Nftables 是其增强版
动态防火墙 Firewalld 修改规则不中断现有连接
区域(zone) public 默认,trusted 允许所有,drop 丢弃所有
运行时 vs 永久 运行时立即生效,永久需 --reload
服务 vs 端口 服务是预定义的端口/协议组合
伪装 SNAT,让内网主机通过防火墙访问外网
端口转发 将流量转发到其他端口或主机
富规则 最灵活的规则配置,支持源 IP、限速、日志

7.2 firewall-cmd 命令速查表

操作 命令
查看默认区域 firewall-cmd --get-default-zone
查看激活区域 firewall-cmd --get-active-zones
查看区域规则 firewall-cmd --list-all
设置默认区域 firewall-cmd --set-default-zone=zone
开放服务 firewall-cmd --add-service=http
开放端口 firewall-cmd --add-port=8080/tcp
查看开放服务 firewall-cmd --list-services
查看开放端口 firewall-cmd --list-ports
删除服务 firewall-cmd --remove-service=http
删除端口 firewall-cmd --remove-port=8080/tcp
启用伪装 firewall-cmd --add-masquerade
添加端口转发 firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80
添加富规则 firewall-cmd --add-rich-rule='rule ...'
永久保存 --permanent 后执行 firewall-cmd --reload

7.3 常用区域速查

区域 默认行为 典型用途
trusted ACCEPT 内网可信主机
public 拒绝,仅开放指定服务 默认,互联网访问
internal 拒绝,仅开放指定服务 企业内部网络
external 拒绝,启用伪装 路由器外网接口
drop DROP(不响应) 高安全环境
block REJECT(返回拒绝) 黑名单

7.4 富规则速查表

需求 富规则
禁止 Ping rule protocol value=icmp drop
允许特定 IP Ping rule family=ipv4 source address="10.1.8.10" icmp-type name="echo-request" accept
来源 IP 限速 rule family=ipv4 source address="10.1.8.0/24" service name="http" accept limit value="3/s"
带日志的规则 rule service name="http" log prefix="HTTPS" level="info" accept

7.5 常见错误排查

错误 原因 解决方案
firewall-cmd: command not found Firewalld 未安装 yum install -y firewalld
FirewallD is not running 服务未启动 systemctl start firewalld
添加端口后仍无法访问 端口转发未启用伪装 firewall-cmd --add-masquerade
富规则不生效 规则顺序问题 检查规则优先级,使用 --complete-reload
--permanent 规则未生效 未执行 reload firewall-cmd --reload

7.6 思考与拓展

  1. public 区域和 drop 区域的区别是什么?
    public:拒绝未明确允许的流量,向客户端返回拒绝信息(如 ICMP port unreachable)。drop:直接丢弃所有未明确允许的流量,不返回任何响应,客户端会"卡住"等待超时,安全性更高。
  2. --reload--complete-reload 有什么区别?
    --reload:重新加载永久配置,保留现有的连接状态--complete-reload:完全重新加载,中断所有现有连接
  3. 端口转发前为什么必须启用伪装?
    → 端口转发涉及 DNAT(目标地址转换)。如果没有伪装(SNAT),目标主机收到的数据包源 IP 仍是外网用户 IP,目标主机可能无法将响应包正确路由回外网用户。
  4. Firewalld 的"富规则"和普通服务/端口规则有什么区别?
    → 普通规则只能控制"允许什么服务/端口";富规则支持更精细的条件(源 IP、时间、速率限制、日志记录),且优先级更高。
  5. 如何让 Firewalld 规则永久生效?
    → 执行 --permanent 选项添加规则,然后执行 firewall-cmd --reload。或者先添加运行时规则,再执行 firewall-cmd --runtime-to-permanent

7.7 生产环境最佳实践

场景 建议
默认区域 保持 public,按需开放服务,不要使用 trusted
规则添加 同时配置 --permanent 和运行时规则,避免意外 reload 丢失
SSH 管理 确保 ssh 服务始终开放,否则可能把自己锁在门外
端口转发 生产环境使用富规则配合日志记录,便于审计
调试规则 使用 --timeout 选项临时开放端口进行测试:firewall-cmd --add-port=8080/tcp --timeout=300(5 分钟后自动关闭)
规则备份 定期备份 /etc/firewalld/ 目录

下期预告 :防火墙是 Linux 安全的第一道防线,而 SELinux 是第二道------也是更深层次的一道防线。下一期我们将学习 SELinux 安全加固 ------了解它如何为每个进程和文件打上"安全标签",如何阻止已遭泄露的服务访问用户数据,以及如何使用 chconrestoreconsemanagesetsebool 来管理和排障 SELinux 策略。敬请期待第二十二期!
--- Compiled and Authored by Whisky --- Augest 1 st, 2026

相关推荐
腾飞开源1 小时前
01_K8s干货笔记之认识K8s
运维·笔记·云原生·容器·kubernetes·k8s·容器化部署
疯狂打码的少年2 小时前
【面向对象】UML结构图:类图(类的关系:依赖/关联/聚合/组合/泛化/实现)
笔记
aaaameliaaa7 小时前
字符函数和字符串函数
c语言·笔记·算法
lsh曙光8 小时前
延时at指令和定时cron指令
linux·服务器·网络
圆山猫8 小时前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
笨鸟先飞,勤能补拙8 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
布鲁飞丝8 小时前
vivo Pulsar 万亿级消息处理实践()-Ansible运维部署
运维·ansible
XR1234567888 小时前
企业全光网络架构选型技术白皮书:从物理层到运维层的全链路分析
运维·网络·架构
加密狗复制模拟8 小时前
使用x64dbg进行超级狗super dog 加密狗逆向分析复制 超级狗克隆备份
安全·软件工程·个人开发·同态加密