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

📅 2026/8/2 1:39:27 👁️ 阅读次数 📝 编程学习
Linux(CentOS)系统管理入门笔记(第二十一期)——防火墙管理(Firewalld)——zone、服务端口、富规则与端口转发

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

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

Linux入门——系统管理1、Linux入门——系统管理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子系统是防火墙的“幕后英雄”——它工作在内核态,对进入系统的每个数据包进行检查、修改、丢弃或路由。

用户态 内核态 ┌─────────────┐ ┌─────────────────┐ │ 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🔒 最低丢弃所有传入流量(不响应)高安全场景
# 查看所有可用区域[root@centos7 ~]# firewall-cmd --get-zonesblock dmz drop external home internal public trusted work

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

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

① 数据包的源 IP 是否匹配某个区域的 source? ├─ 是 → 使用该区域 └─ 否 → 继续↓ ② 数据包进入的网卡(接口)是否关联了某个区域? ├─ 是 → 使用该区域 └─ 否 → 继续↓ ③ 使用默认区域(default zone)

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

2.3 区域内规则的优先级

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

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 查看区域状态

# 查看默认区域[root@centos7 ~]# firewall-cmd --get-default-zonepublic# 查看当前激活的区域(有接口或来源关联)[root@centos7 ~]# firewall-cmd --get-active-zonespublic interfaces: ens32# 查看默认区域的完整规则[root@centos7 ~]# firewall-cmd --list-allpublic(active)target: default icmp-block-inversion: no interfaces: ens32 sources: services: cockpit dhcpv6-clientsshports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:# 查看所有区域的所有规则[root@centos7 ~]# firewall-cmd --list-all-zones

3.2 区域管理

# 设置默认区域[root@centos7 ~]# firewall-cmd --set-default-zone=trusted[root@centos7 ~]# firewall-cmd --get-default-zonetrusted# 恢复默认[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-zonesblock 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 接口管理

# 查看接口属于哪个区域[root@centos7 ~]# firewall-cmd --get-zone-of-interface=ens32public# 将接口绑定到特定区域[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-interfacesens32

3.4 服务管理

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

# 查看所有预定义服务[root@centos7 ~]# firewall-cmd --get-services... http https imap ipp ipp-client ipsec iscsi-target...# 查看某个服务的定义[root@centos7 ~]# cat /usr/lib/firewalld/services/http.xml<?xmlversion="1.0"encoding="utf-8"?><service><short>WWW(HTTP)</short><description>HTTP is the protocol used to serve Web pages...</description><portprotocol="tcp"port="80"/></service># 添加服务(运行时)[root@centos7 ~]# firewall-cmd --add-service=httpsuccess# 添加服务(永久)[root@centos7 ~]# firewall-cmd --add-service=http --permanentsuccess# 查看已开放的服务[root@centos7 ~]# firewall-cmd --list-servicescockpit dhcpv6-client httpssh# 查询服务是否已开放[root@centos7 ~]# firewall-cmd --query-service=httpyes# 删除服务[root@centos7 ~]# firewall-cmd --remove-service=http

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

3.5 端口管理

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

# 开放 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-ports5900/tcp# 查询端口是否已开放[root@centos7 ~]# firewall-cmd --query-port=5900/tcpyes# 删除端口[root@centos7 ~]# firewall-cmd --remove-port=5900/tcp

3.6 协议管理

# 开放 ICMP 协议[root@centos7 ~]# firewall-cmd --add-protocol=icmp# 查看已开放的协议[root@centos7 ~]# firewall-cmd --list-protocolsicmp# 删除协议[root@centos7 ~]# firewall-cmd --remove-protocol=icmp

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

4.1 伪装(Masquerade)

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

内网主机 10.1.8.10 → Firewalld(10.1.8.88) → 外网 源IP:10.1.8.10 源IP被伪装为 10.1.8.88
# 启用伪装(需在 external 等区域启用)[root@centos7 ~]# firewall-cmd --add-masquerade# 查看伪装状态[root@centos7 ~]# firewall-cmd --query-masqueradeyes# 禁用伪装[root@centos7 ~]# firewall-cmd --remove-masquerade

4.2 端口转发(Forward Port)

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

外网用户访问 10.1.8.88:8000 → 转发 → 10.1.8.10:80

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

# 启用伪装[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-portsport=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 富规则语法

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 本机

[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-rulesrule protocolvalue="icmp"drop# 删除富规则[root@centos7 ~]# firewall-cmd --remove-rich-rule='rule protocol value="icmp" drop'

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

# 方法:先禁止所有 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 限速

# 来源 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

# 安装(CentOS 7 默认已安装)[root@centos7 ~]# yum install -y firewall-config# 启动(需图形界面环境)[root@centos7 ~]# firewall-config

主要功能区域

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

7. 总结与速查手册

7.1 核心知识点一览

主题关键点
NetfilterLinux 内核防火墙框架,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 常用区域速查

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

7.4 富规则速查表

需求富规则
禁止 Pingrule protocol value=icmp drop
允许特定 IP Pingrule 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 foundFirewalld 未安装yum install -y firewalld
FirewallD is not running服务未启动systemctl start firewalld
添加端口后仍无法访问端口转发未启用伪装firewall-cmd --add-masquerade
富规则不生效规则顺序问题检查规则优先级,使用--complete-reload
--permanent规则未生效未执行 reloadfirewall-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