关于防火墙firewalld

在 CentOS 7 中,防火墙系统从传统的 iptables 升级为了 firewalld。它并非一个全新的东西,而是一个更高级的“管理员”,底层依然调用 iptablesnftables 与内核的 Netfilter 框架通信 。最大的变化是引入了 区域(zone)服务(service) 的概念,让规则的配置变得更灵活、更易于理解。

下面,我将从概念和操作两个层面,为你详细介绍 CentOS 7 的防火墙技术。

第一部分:firewalld 核心概念介绍

理解下面这两个核心概念,是掌握 firewalld 的关键。

🚩 1. 区域(Zone)

“区域”本质上是一套预设好的信任级别的规则集合。你可以把服务器的不同网络接口(比如连接公网的网卡、连接内网的网卡)分配到不同的“区域”里,从而实现差异化安全策略 。

CentOS 7 默认预定义了多个区域,常见的包括 :

  • drop (丢弃):信任等级最低。所有传入的连接都会被直接丢弃,并且没有任何回应。
  • block (阻止):所有传入的连接都会被拒绝,并回复一个 ICMP 拒绝消息。
  • public (公共)默认区域。代表不可信的公共网络环境。你只允许选定的、必要的传入连接(如 SSH、HTTP) 。
  • external (外部):用于开启了 NAT 伪装(Masquerading)的路由器型场景,保护内网。
  • dmz (隔离区):用于允许外部有限度地访问内部非军事区(DMZ)的服务器。
  • work (工作)home (家庭):分别用于工作网络和家庭网络,信任度比 public 高一些。
  • internal (内部):用于内部网络,信任度较高。
  • trusted (信任):信任等级最高。接受所有网络连接。

你可以通过 firewall-cmd --get-zones 命令查看系统支持的所有区域 。

🚩 2. 服务(Service)

服务是一个预定义的规则包,它将常见的网络服务(如 HTTP、HTTPS、SSH)与其对应的端口和协议关联起来。例如,开启 http 服务,就相当于开放了 80/tcp 端口 。

使用服务的优势是避免了记忆繁杂的端口号,也降低了配置出错的概率。所有预定义的服务列表可以通过 firewall-cmd --get-services 查看 。服务的 XML 配置文件存储在 /usr/lib/firewalld/services//etc/firewalld/services/ 目录下 。

🚩 3. 规则类型

firewalld 支持配置多种粒度的规则,以适应不同场景:

  • 服务规则:通过服务名直接管理,最简单。
  • 端口规则:直接指定端口和协议,更灵活。
  • 富规则(Rich Rules):语法类似 iptables,可以实现基于源IP地址、目标IP地址、日志记录等非常精细化的控制 。

🛠️ 第二部分:firewalld 详细操作技术

这部分是日常管理的核心,所有操作主要通过 firewall-cmd 命令完成。请确保你拥有 root 权限或可以使用 sudo

一、服务生命周期管理(systemctl)

首先,我们需要控制 firewalld 服务本身的运行状态。

# 查看防火墙状态
sudo systemctl status firewalld
# 或者使用 firewall-cmd 快速查看
sudo firewall-cmd --state               # 返回 running 或 not running 

# 启动防火墙
sudo systemctl start firewalld

# 停止防火墙 (生产环境慎用,会使服务器失去保护) 
sudo systemctl stop firewalld

# 重启防火墙 (会短暂断开连接)
sudo systemctl restart firewalld

# 设置开机自启
sudo systemctl enable firewalld

# 禁止开机自启
sudo systemctl disable firewalld

修改了服务的自启状态后,重启系统才能看到最终效果 。

二、日常配置管理(firewall-cmd)

这是配置规则最常用的命令。你需要记住两个核心概念:运行时(Runtime)永久(Permanent)。不加 --permanent 参数修改的是当前生效的运行时规则,重启或重载后会失效;加了 --permanent 参数,规则会被保存下来,但需要执行 --reload 才能在当前会话中生效 。

1. 区域(Zone)管理
# 查看默认区域
sudo firewall-cmd --get-default-zone       # 通常是 public 

# 查看所有活动区域及绑定的网络接口
sudo firewall-cmd --get-active-zones        # 例如: public  interfaces: eth0 

# 查看指定区域(如 public)的所有规则
sudo firewall-cmd --zone=public --list-all

# 修改默认区域(立即生效)
sudo firewall-cmd --set-default-zone=home

# 将某个网络接口(如 eth0)永久添加到指定区域
sudo firewall-cmd --permanent --zone=internal --change-interface=eth0
sudo firewall-cmd --reload
2. 服务(Service)管理

这是推荐的首选方式 。

# 查看默认区域中已开启的服务
sudo firewall-cmd --list-services

# 永久开启 http 服务
sudo firewall-cmd --permanent --zone=public --add-service=http

# 永久关闭 https 服务
sudo firewall-cmd --permanent --zone=public --remove-service=https

# 查询 ssh 服务是否开启
sudo firewall-cmd --query-service=ssh        # 返回 yes 或 no 

# 重新加载配置使永久规则生效
sudo firewall-cmd --reload
3. 端口(Port)管理

当你需要的服务不在预定义列表中时,可以直接操作端口 。

# 查看当前区域已开放的端口
sudo firewall-cmd --list-ports

# 永久开放 TCP 协议的 8080 端口
sudo firewall-cmd --permanent --add-port=8080/tcp

# 永久开放 UDP 协议的 53 端口
sudo firewall-cmd --permanent --add-port=53/udp

# 开放一个端口范围 (如 1000-2000)
sudo firewall-cmd --permanent --add-port=1000-2000/tcp

# 永久关闭 TCP 协议的 8080 端口
sudo firewall-cmd --permanent --remove-port=8080/tcp

# 重新加载配置
sudo firewall-cmd --reload
4. 富规则(Rich Rules)管理

用于实现更精细的访问控制,例如只允许特定 IP 访问 。

# 允许特定 IP (192.168.1.100) 访问本机的 SSH 端口 (22)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept'

# 拒绝特定 IP 段 (192.168.2.0/24) 访问本机的 80 端口
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="80" reject'

# 重新加载配置
sudo firewall-cmd --reload

# 查看所有富规则
sudo firewall-cmd --list-rich-rules

三、高级功能配置

1. IP 伪装(Masquerading,即 NAT)

如果你的 CentOS 7 服务器作为路由器或网关,需要为内网机器提供上网功能,可以开启 IP 伪装 。

# 永久开启 IP 伪装
sudo firewall-cmd --permanent --add-masquerade

# 永久关闭 IP 伪装
sudo firewall-cmd --permanent --remove-masquerade

# 重新加载
sudo firewall-cmd --reload
2. 端口转发(Port Forwarding)

端口转发可以将到达本机某个端口的流量,转发到另一台机器的指定端口。使用端口转发必须先开启 IP 伪装

# 前提:已开启 masquerade

# 将本机的 80 端口流量转发到另一台内网主机 192.168.1.100 的 8080 端口
sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100:toport=8080

# 重新加载
sudo firewall-cmd --reload

四、日常维护与排错

# 重新加载防火墙规则(推荐,不中断连接)
sudo firewall-cmd --reload

# 强制完全重载(可能会断开连接)
sudo firewall-cmd --complete-reload 

# 将所有运行时规则保存为永久规则
sudo firewall-cmd --runtime-to-permanent 

# 进入紧急模式:拒绝所有入站流量(慎用)
sudo firewall-cmd --panic-on
# 退出紧急模式
sudo firewall-cmd --panic-off
# 查看是否处于紧急模式
sudo firewall-cmd --query-panic 

💡 最佳实践与安全提示

  1. 最小权限原则:只开放业务绝对必需的端口和服务,用不到的一律关闭 。
  2. 优先使用服务:能用 --add-service 就别用 --add-port,既清晰又不易出错 。
  3. 保护好远程连接:修改 SSH (22) 相关规则时务必小心!最好先开启一个额外的会话窗口测试,确认规则没问题再退出。或者先用富规则将 SSH 访问限制在信任的 IP 范围内 。
  4. 别忘了 --reload:修改了永久规则后,一定要执行 sudo firewall-cmd --reload,否则新规则不会生效 。
  5. 先备份,再修改:在进行大规模更改前,备份一下 /etc/firewalld/ 目录是个好习惯 。
    sudo cp -r /etc/firewalld /etc/firewalld.backup.$(date +%Y%m%d)
    

五、一个示例:创建一个FTP服务的专用区域

# 创建FTP专用区域
firewall-cmd --permanent --new-zone=ftp-public
#【删除一个zone】:firewall-cmd --permanent --delete-zone=ftp-public

# 设置区域默认策略为拒绝所有
firewall-cmd --permanent --zone=ftp-public --set-target=DROP
echo "创建ftp-public区域,默认策略为DROP"

# 添加FTP服务(21端口)
firewall-cmd --permanent --zone=ftp-public --add-service=ftp
echo "添加FTP服务(21端口)"

# 添加被动模式端口范围(50000-51000)
firewall-cmd --permanent --zone=ftp-public --add-port=50000-51000/tcp
echo "添加被动模式端口:50000-51000/tcp"

# 添加SSH管理端口(非标准端口2222,防止扫描)
firewall-cmd --permanent --zone=ftp-public --add-port=22/tcp
echo "添加SSH管理端口:2222/tcp"

# 添加源IP限制(示例,根据实际情况修改)
 firewall-cmd --permanent --zone=ftp-public --add-source=192.168.1.0/24
 firewall-cmd --permanent --zone=ftp-public --add-source=10.0.0.0/8

# 配置连接速率限制(防止DDoS)
firewall-cmd --permanent --zone=ftp-public --add-rich-rule='
  rule family="ipv4" source address="0.0.0.0/0"
  port port="21" protocol="tcp"
  limit value="10/m" accept'
echo "配置FTP连接速率限制:10次/分钟"

# 应用配置
firewall-cmd --reload

# 设置默认区域
firewall-cmd --set-default-zone=ftp-public

# 查看当前激活的区域:
firewall-cmd --get-active-zones

# 查看ftp-public区域配置的规则:
firewall-cmd --zone=ftp-public --list-all

希望这份详细的介绍和操作指南能帮助你完全掌握 CentOS 7 的防火墙。如果你在配置过程中遇到具体的报错,随时可以再问我。

posted @ 2026-04-01 17:57  kunlunsansheng  阅读(92)  评论(0)    收藏  举报