关于防火墙firewalld
在 CentOS 7 中,防火墙系统从传统的 iptables 升级为了 firewalld。它并非一个全新的东西,而是一个更高级的“管理员”,底层依然调用 iptables 或 nftables 与内核的 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
💡 最佳实践与安全提示
- 最小权限原则:只开放业务绝对必需的端口和服务,用不到的一律关闭 。
- 优先使用服务:能用
--add-service就别用--add-port,既清晰又不易出错 。 - 保护好远程连接:修改 SSH (22) 相关规则时务必小心!最好先开启一个额外的会话窗口测试,确认规则没问题再退出。或者先用富规则将 SSH 访问限制在信任的 IP 范围内 。
- 别忘了
--reload:修改了永久规则后,一定要执行sudo firewall-cmd --reload,否则新规则不会生效 。 - 先备份,再修改:在进行大规模更改前,备份一下
/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 的防火墙。如果你在配置过程中遇到具体的报错,随时可以再问我。

浙公网安备 33010602011771号