Linux防火墙配置

一、核心理论知识点梳理

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:8080telnet 外部IP 8080,本质是测试服务器能否主动建立到外部端口的连接;
  • 验证 IP 拒绝规则:用指定 IP 的机器 ping 服务器(ICMP 协议)或访问端口,若规则生效则会超时 / 拒绝(注意:ping 依赖 ICMP 协议,需确保防火墙未放行 ICMP)。

本文涉及的核心理论知识点可归纳为 3 类:

  1. 基础概念:firewalld 与 iptables 的差异、Zone(区域)的作用、规则的临时 / 永久生效机制;
  2. 规则逻辑:入站 / 出站方向、TCP/UDP 协议、Rich Rule 富规则的适用场景;
  3. 安全原则:最小权限、白名单模式、生产环境防火墙的核心配置规范。

三、技术背景

  1. 服务器安全基础:服务器暴露在公网中时,防火墙是第一道安全屏障,通过配置出入口规则可以精准控制哪些 IP / 端口能访问服务器、服务器能访问哪些外部资源,避免非法访问。
  2. CentOS 7 默认适配 :CentOS 7 默认使用firewalld(替代了 CentOS 6 的iptables service),是系统原生的防火墙管理工具,无需额外安装,操作简单且功能满足日常基础需求。
  3. 实操性强:防火墙配置命令简单直观,执行后可立即验证效果,能快速获得学习反馈,适合编程 / 运维新手建立信心。

四、需求分析

本次案例聚焦最基础的防火墙出入口配置需求,覆盖日常使用频率最高的场景:

  1. 基础配置需求
    • 查看防火墙当前状态、已开放的端口 / 服务。
    • 开启 / 关闭 / 重启防火墙服务,并设置开机自启。
  2. 入站规则需求 (外部访问服务器):
    • 允许外部访问服务器的 22 端口(SSH,远程登录必备)。
    • 允许外部访问服务器的 80 端口(HTTP,网页服务)。
    • 拒绝某个特定 IP(如 192.168.1.100)访问服务器的所有端口。
  3. 出站规则需求 (服务器访问外部):
    • 禁止服务器访问外部的 8080 端口(模拟限制对外访问特定端口)。
    • 恢复服务器对外部 8080 端口的访问(规则回滚)。
  4. 验证需求:每一步配置后,能通过命令验证规则是否生效。

五、实操案例: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

验证规则是否生效

  1. 用授权 MAC 的设备测试 :执行 ssh 服务器IP,能正常登录,说明规则生效;
  2. 用非授权 MAC 的设备测试 :执行 ssh 服务器IP,会提示「连接被拒绝」,说明规则生效;
  3. 服务器端验证 :执行 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

六、验证小技巧(确保配置生效)

  1. 验证入站端口 :从另一台机器执行telnet 服务器IP 端口,如telnet 192.168.1.200 22,能连通说明端口已开放。
  2. 验证 IP 拒绝规则:用 192.168.1.100 的机器 ping 服务器 IP 或访问 22/80 端口,应无法连通。
  3. 验证出站规则 :在服务器执行curl http://外部IP:8080,若规则生效则会超时 / 拒绝。
相关推荐
安科士andxe4 小时前
深入解析|安科士1.25G CWDM SFP光模块核心技术,破解中长距离传输痛点
服务器·网络·5g
小白同学_C7 小时前
Lab4-Lab: traps && MIT6.1810操作系统工程【持续更新】 _
linux·c/c++·操作系统os
今天只学一颗糖7 小时前
1、《深入理解计算机系统》--计算机系统介绍
linux·笔记·学习·系统架构
2601_949146537 小时前
Shell语音通知接口使用指南:运维自动化中的语音告警集成方案
运维·自动化
儒雅的晴天8 小时前
大模型幻觉问题
运维·服务器
Gofarlic_OMS9 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
通信大师9 小时前
深度解析PCC策略计费控制:核心网产品与应用价值
运维·服务器·网络·5g
dixiuapp9 小时前
智能工单系统如何选,实现自动化与预测性维护
运维·自动化
不做无法实现的梦~9 小时前
ros2实现路径规划---nav2部分
linux·stm32·嵌入式硬件·机器人·自动驾驶
Elastic 中国社区官方博客9 小时前
如何防御你的 RAG 系统免受上下文投毒攻击
大数据·运维·人工智能·elasticsearch·搜索引擎·ai·全文检索