一、核心理论知识点梳理
1. firewalld 与传统 iptables 的核心差异
- 设计理念 :
- iptables 是基于 "静态规则集" 的防火墙工具,修改规则后需要重启服务才能生效,重启过程中会短暂中断所有网络连接。
- firewalld 是基于 "动态规则集" 的防火墙管理工具,通过
firewall-cmd --reload重载规则时无需重启服务,不会中断现有连接,更适合生产环境。
- 层级关系 :firewalld 并不是替代了 iptables,而是封装了 iptables(底层依然调用 iptables 内核模块),提供了更友好的命令行接口和区域化管理方式,降低了运维门槛。
- 适用版本:CentOS 6 及之前默认用 iptables service,CentOS 7+ 默认用 firewalld,这是系统层面的重要版本差异,也是实操中必须注意的前提。
2. firewalld 的核心概念:Zone(区域)
- 定义 :Zone 是 firewalld 最核心的概念,本质是预定义的规则集合,用于对不同安全等级的网络环境进行分组管理。
- 默认区域:public(公网区域),是系统默认的区域,适用于服务器暴露在公网的场景,所有未指定区域的规则都会默认应用到 public 区域。
- 常见区域说明 :
- trusted:信任区域,允许所有入站 / 出站流量(最宽松);
- internal:内部区域,适用于内网环境,仅允许信任的流量;
- external:外部区域,适用于路由器 / 网关,会做地址伪装(NAT);
- drop:丢弃区域,拒绝所有入站流量(最严格)。
3. 防火墙规则的核心维度
- 方向维度 :
- 入站(Inbound):外部设备主动访问服务器的流量(如 SSH 登录、访问网页),是实操中配置最多的方向;
- 出站(Outbound):服务器主动访问外部设备的流量(如服务器访问外部 8080 端口),默认全放行,需手动限制。
- 生效维度 :
- 临时规则:不加
--permanent参数的规则,仅在当前防火墙运行周期生效,重启 / 重载防火墙后失效(适合测试); - 永久规则:加
--permanent参数的规则,会写入配置文件,需执行firewall-cmd --reload重载后才能生效(生产环境必须用)。
- 临时规则:不加
- 协议维度 :TCP/UDP 是最常用的传输层协议,配置端口时必须指定(如 22/tcp、80/tcp):
- TCP:面向连接、可靠传输(SSH、HTTP、HTTPS 均用 TCP);
- UDP:无连接、快速传输(DNS、DHCP 常用 UDP)。
4. Rich Rule(富规则)
- 定义:firewalld 提供的 "高级规则语法",用于配置基础命令无法实现的复杂规则(如按 IP/MAC 地址限制、按端口 + IP 组合限制)。
- 适用场景 :
- 拒绝 / 允许特定 IP 访问所有端口;
- 仅允许特定 MAC 地址访问指定端口(白名单模式);
- 按时间段、按流量大小限制等高级需求。
- 语法结构 :
rule family="协议族" 源/目标条件 动作,核心要素:- family:协议族(ipv4/ipv6);
- source:源条件(address=IP 地址、mac=MAC 地址);
- 动作:accept(允许)、reject(拒绝并返回提示)、drop(静默丢弃)。
5. 防火墙规则的优先级
- 核心原则 :更具体的规则优先生效 ,这是理解规则执行逻辑的关键:
- 示例:先配置 "拒绝所有 IP 访问 22 端口",再配置 "允许指定 MAC 地址访问 22 端口",后者会优先生效(因为 MAC 地址规则比单纯的端口规则更具体);
- Rich Rule 优先级 > 普通端口 / 服务规则 > 区域默认规则。
6. 防火墙的核心作用与安全原则
- 核心作用:作为服务器的 "第一道安全屏障",通过精准控制 IP / 端口的访问权限,避免非法访问(如黑客扫描端口、暴力破解 SSH)。
- 安全配置原则 :
- 最小权限原则:只开放业务必需的端口(如 22、80),其余端口全部关闭;
- 白名单模式:优先拒绝所有流量,再手动允许信任的 IP/MAC/ 端口(如仅允许指定 MAC 访问 22 端口);
- 生产环境禁止关闭防火墙:防火墙是服务器的核心安全防护,即使测试也应仅临时关闭,测试后立即恢复。
二、实操相关的辅助知识点
1. 系统服务管理(systemctl)
- firewalld 是系统服务,通过
systemctl管理启停 / 开机自启:systemctl status firewalld:查看服务状态(active = 运行、inactive = 停止);systemctl enable firewalld:设置开机自启(避免服务器重启后防火墙失效);systemctl restart firewalld:重启服务(会中断连接,不如 reload 友好)。
2. 规则验证的底层逻辑
- 验证入站端口:
telnet 服务器IP 端口或nc -zv 服务器IP 端口,本质是测试目标端口是否处于 "监听状态" 且防火墙允许访问; - 验证出站规则:
curl http://外部IP:8080或telnet 外部IP 8080,本质是测试服务器能否主动建立到外部端口的连接; - 验证 IP 拒绝规则:用指定 IP 的机器 ping 服务器(ICMP 协议)或访问端口,若规则生效则会超时 / 拒绝(注意:ping 依赖 ICMP 协议,需确保防火墙未放行 ICMP)。
本文涉及的核心理论知识点可归纳为 3 类:
- 基础概念:firewalld 与 iptables 的差异、Zone(区域)的作用、规则的临时 / 永久生效机制;
- 规则逻辑:入站 / 出站方向、TCP/UDP 协议、Rich Rule 富规则的适用场景;
- 安全原则:最小权限、白名单模式、生产环境防火墙的核心配置规范。
三、技术背景
- 服务器安全基础:服务器暴露在公网中时,防火墙是第一道安全屏障,通过配置出入口规则可以精准控制哪些 IP / 端口能访问服务器、服务器能访问哪些外部资源,避免非法访问。
- CentOS 7 默认适配 :CentOS 7 默认使用
firewalld(替代了 CentOS 6 的iptablesservice),是系统原生的防火墙管理工具,无需额外安装,操作简单且功能满足日常基础需求。 - 实操性强:防火墙配置命令简单直观,执行后可立即验证效果,能快速获得学习反馈,适合编程 / 运维新手建立信心。
四、需求分析
本次案例聚焦最基础的防火墙出入口配置需求,覆盖日常使用频率最高的场景:
- 基础配置需求 :
- 查看防火墙当前状态、已开放的端口 / 服务。
- 开启 / 关闭 / 重启防火墙服务,并设置开机自启。
- 入站规则需求 (外部访问服务器):
- 允许外部访问服务器的 22 端口(SSH,远程登录必备)。
- 允许外部访问服务器的 80 端口(HTTP,网页服务)。
- 拒绝某个特定 IP(如 192.168.1.100)访问服务器的所有端口。
- 出站规则需求 (服务器访问外部):
- 禁止服务器访问外部的 8080 端口(模拟限制对外访问特定端口)。
- 恢复服务器对外部 8080 端口的访问(规则回滚)。
- 验证需求:每一步配置后,能通过命令验证规则是否生效。
五、实操案例:firewalld 基础配置(全程可直接复制执行)
前置说明
CentOS 7 中firewalld的核心概念:
- zone(区域) :默认使用
public区域(公网环境),所有规则默认配置在该区域即可满足基础需求。 - 入站(inbound):外部请求进入服务器;出站(outbound):服务器主动访问外部。
1. 基础操作:查看防火墙状态与基本信息
# 1. 查看firewalld服务状态(最常用)
systemctl status firewalld
# 输出说明:active (running) 表示已启动;inactive (dead) 表示未启动
# 2. 查看当前默认区域
firewall-cmd --get-default-zone
# 正常输出:public
# 3. 查看当前区域已开放的端口和服务
firewall-cmd --list-all
# 输出包含:ports(开放的端口)、services(开放的服务)、sources(允许的IP)等
2. 防火墙服务的启停与开机自启
# 1. 启动防火墙(若未启动)
systemctl start firewalld
# 2. 设置防火墙开机自启(重要:避免服务器重启后防火墙失效)
systemctl enable firewalld
# 3. 重启防火墙(修改规则后需重启或重载生效)
systemctl restart firewalld
# 或更轻量的重载(不中断服务)
firewall-cmd --reload
# 4. 关闭防火墙(仅测试用,生产环境禁止)
# systemctl stop firewalld
# 5. 禁止防火墙开机自启(仅测试用)
# systemctl disable firewalld
3. 入站规则配置(核心)
场景 1:允许外部访问 22 端口(SSH)
# 1. 临时开放22端口(重启防火墙后失效,用于测试)
firewall-cmd --add-port=22/tcp
# 输出:success 表示成功
# 2. 永久开放22端口(需重载防火墙生效)
firewall-cmd --add-port=22/tcp --permanent
# 重载生效
firewall-cmd --reload
# 验证:查看已开放端口,确认22/tcp存在
firewall-cmd --list-ports
场景 2:允许外部访问 80 端口(HTTP)
# 永久开放80端口(TCP协议,网页服务默认端口)
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
# 验证
firewall-cmd --list-ports
场景 3:拒绝特定 IP(192.168.1.100)访问服务器所有端口
# 永久拒绝192.168.1.100的所有入站请求
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject' --permanent
firewall-cmd --reload
# 验证:查看已配置的rich规则(复杂规则)
firewall-cmd --list-rich-rules
# 输出应包含:rule family="ipv4" source address="192.168.1.100" reject
场景 4:删除已配置的拒绝规则(回滚)
# 永久删除拒绝192.168.1.100的规则
firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.1.100" reject' --permanent
firewall-cmd --reload
# 验证:再次查看rich规则,该规则应消失
firewall-cmd --list-rich-rules
场景5:允许特定MAC地址设备访问22(SSH)端口
MAC 地址是网络设备的物理标识,绑定 MAC 地址 + SSH 端口的访问规则,能精准限制只有指定设备(如网络管理员的电脑)才能通过 SSH 登录服务器,比单纯限制 IP 更安全(可避免 IP 被仿冒)。
前置说明
- firewalld 通过
rich-rule(富规则)实现 MAC 地址级别的访问控制,这是 firewalld 中用于配置复杂规则的核心方式。 - 配置逻辑:先拒绝所有 IP 访问 22 端口,再允许指定 MAC 地址访问 22 端口(白名单模式,最安全)。
实操步骤
# 步骤1:先获取需要授权的MAC地址(如管理员电脑的MAC:00:11:22:33:44:55,需替换为实际值)
# 提示:可在管理员电脑上通过 ipconfig(Windows)或 ifconfig(Linux/Mac)查看
# 步骤2:永久配置「仅允许指定MAC地址访问22端口」的富规则
firewall-cmd --add-rich-rule='rule family="ipv4" source mac="00:11:22:33:44:55" port port="22" protocol="tcp" accept' --permanent
# 步骤3(可选,白名单模式):拒绝所有其他设备访问22端口(确保只有指定MAC能访问)
firewall-cmd --add-rich-rule='rule family="ipv4" port port="22" protocol="tcp" reject' --permanent
# 步骤4:重载防火墙使规则生效
firewall-cmd --reload
# 验证:查看已配置的富规则,确认包含上述两条规则
firewall-cmd --list-rich-rules
# 正常输出示例:
# rule family="ipv4" source mac="00:11:22:33:44:55" port port="22" protocol="tcp" accept
# rule family="ipv4" port port="22" protocol="tcp" reject
规则回滚(如需取消 MAC 限制)
# 删除允许指定MAC访问22端口的规则
firewall-cmd --remove-rich-rule='rule family="ipv4" source mac="00:11:22:33:44:55" port port="22" protocol="tcp" accept' --permanent
# 删除拒绝所有IP访问22端口的规则(恢复默认)
firewall-cmd --remove-rich-rule='rule family="ipv4" port port="22" protocol="tcp" reject' --permanent
# 重载生效
firewall-cmd --reload
# 验证:确认22端口的MAC限制规则已消失
firewall-cmd --list-rich-rules
验证规则是否生效
- 用授权 MAC 的设备测试 :执行
ssh 服务器IP,能正常登录,说明规则生效; - 用非授权 MAC 的设备测试 :执行
ssh 服务器IP,会提示「连接被拒绝」,说明规则生效; - 服务器端验证 :执行
firewall-cmd --list-rich-rules,确认 MAC 规则存在。
4. 出站规则配置(服务器访问外部)
# 场景1:禁止服务器访问外部的8080端口(TCP)
firewall-cmd --add-rich-rule='rule family="ipv4" port port="8080" protocol="tcp" outbound reject' --permanent
firewall-cmd --reload
# 验证:查看rich规则,应包含该出站拒绝规则
firewall-cmd --list-rich-rules
# 场景2:恢复服务器访问外部8080端口(删除出站拒绝规则)
firewall-cmd --remove-rich-rule='rule family="ipv4" port port="8080" protocol="tcp" outbound reject' --permanent
firewall-cmd --reload
5. 重置防火墙(测试后恢复默认状态)
# 重置firewalld到默认配置(清空所有自定义规则,谨慎使用)
firewall-cmd --complete-reload
# 或更彻底的重置
firewall-cmd --reset-default-zone
六、验证小技巧(确保配置生效)
- 验证入站端口 :从另一台机器执行
telnet 服务器IP 端口,如telnet 192.168.1.200 22,能连通说明端口已开放。 - 验证 IP 拒绝规则:用 192.168.1.100 的机器 ping 服务器 IP 或访问 22/80 端口,应无法连通。
- 验证出站规则 :在服务器执行
curl http://外部IP:8080,若规则生效则会超时 / 拒绝。