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 防火墙的完整管理技能——从开放服务端口到配置复杂的访问控制策略。
目录
- 防火墙概述
- 1.1 防火墙的类型
- 1.2 Netfilter 与 Nftables
- 1.3 动态防火墙 vs 静态防火墙
- Firewalld 区域(zone)概念
- 2.1 预定义区域
- 2.2 数据包与区域的匹配规则
- 2.3 区域内规则的优先级
- firewall-cmd 命令行工具
- 3.1 运行时与永久配置
- 3.2 zone 管理
- 3.3 接口与来源管理
- 3.4 服务管理
- 3.5 端口管理
- 端口转发与伪装(NAT)
- 4.1 伪装(Masquerade)
- 4.2 端口转发(Forward Port)
- 富规则(Rich Rule)
- 5.1 富规则语法
- 5.2 实战示例:禁止 Ping 与白名单
- firewall-config 图形工具
- 总结与速查手册
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 work2.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-zones3.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 --reload3.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-interfacesens323.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/tcp3.6 协议管理
# 开放 ICMP 协议[root@centos7 ~]# firewall-cmd --add-protocol=icmp# 查看已开放的协议[root@centos7 ~]# firewall-cmd --list-protocolsicmp# 删除协议[root@centos7 ~]# firewall-cmd --remove-protocol=icmp4. 端口转发与伪装(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-masquerade4.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=805. 富规则(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 核心知识点一览
| 主题 | 关键点 |
|---|---|
| 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 思考与拓展
public区域和drop区域的区别是什么?
→public:拒绝未明确允许的流量,向客户端返回拒绝信息(如 ICMP port unreachable)。drop:直接丢弃所有未明确允许的流量,不返回任何响应,客户端会“卡住”等待超时,安全性更高。--reload和--complete-reload有什么区别?
→--reload:重新加载永久配置,保留现有的连接状态。--complete-reload:完全重新加载,中断所有现有连接。- 端口转发前为什么必须启用伪装?
→ 端口转发涉及 DNAT(目标地址转换)。如果没有伪装(SNAT),目标主机收到的数据包源 IP 仍是外网用户 IP,目标主机可能无法将响应包正确路由回外网用户。 - Firewalld 的“富规则”和普通服务/端口规则有什么区别?
→ 普通规则只能控制“允许什么服务/端口”;富规则支持更精细的条件(源 IP、时间、速率限制、日志记录),且优先级更高。 - 如何让 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 安全加固——了解它如何为每个进程和文件打上“安全标签”,如何阻止已遭泄露的服务访问用户数据,以及如何使用
chcon、restorecon、semanage和setsebool来管理和排障 SELinux 策略。敬请期待第二十二期!
