欢迎光临
我们一直在努力

firewalld 防火墙

一、firewalld 防火墙核心原理

1.1 firewalld 的核心作用

firewalld 本身不具备数据包过滤能力,其核心是为 Linux 内核的netfilter包过滤机制提供匹配规则(策略),通过定义规则告诉netfilter对指定源 IP、目的 IP、协议特征的数据包执行允许、拒绝、转发等操作。同时,firewalld 提供了动态的防火墙管理能力,支持 IPv4、IPv6 和以太网桥,还能让服务 / 应用程序直接添加防火墙规则接口。

1.2 firewalld 与 iptables 的关系

二者均是通过内核netfilter实现数据包过滤,核心区别在于规则管理方式和配置存储:

  • 配置存储:iptables 的配置储存在/etc/sysconfig/iptables单一文件中;firewalld 则将配置分散在/usr/lib/firewalld/(系统默认规则)和/etc/firewalld/(自定义规则)的 XML 文件中。
  • 规则更新:iptables 修改规则时,需清除所有旧规则并重新加载全部新规则,会中断现有网络连接;firewalld 仅更新规则的差异部分,动态修改规则不丢失现行连接,无需重启服务。
  • 管理工具:iptables 通过iptables命令行管理;firewalld 提供firewall-config图形化工具和firewall-cmd命令行工具,操作更友好。
  • 1.3 firewalld 的核心特性:区域(Zones)

    firewalld 的核心设计是区域化管理,将网络流量按源 IP、入网接口划分为不同区域,每个区域配置独立的安全策略(允许 / 拒绝的服务、端口、协议等),系统按匹配优先级为数据包匹配对应区域的规则,优先级从高到低为:

  • 源 IP 关联的特定区域;
  • 入网网络接口关联的特定区域;
  • 系统默认区域(默认为 public,可手动修改)。
  • firewalld 预定义了 9 个区域,每个区域有默认的安全策略,核心区域的策略特点如下:

    • trusted:信任区域,允许所有数据包进入,适用于内网可信环境;
    • internal/home/work:内网类区域,拒绝主动流入的流量,仅允许与流出流量相关的请求,以及 ssh、mdns 等常用内网服务;
    • public:公共区域,默认区域,拒绝主动流入流量,仅允许 ssh、dhcpv6-client 等基础服务,适用于公网环境;
    • external:外部区域,适用于服务器公网接口,开启地址伪装,仅允许 ssh 服务;
    • dmz:非军事区,适用于对外提供服务的服务器(如 web、数据库),仅允许 ssh 服务;
    • block/drop:阻塞 / 丢弃区域,拒绝所有主动流入流量,drop 区域会直接丢弃数据包,不返回任何响应,安全性最高。

    1.4 firewalld 的两种配置模式

    firewalld 所有配置均支持运行时模式和永久模式,二者的区别直接影响规则的生效范围和持久性:

  • 运行时模式(Runtime):规则仅在当前系统运行中生效,系统 /firewalld 服务重启后失效,适用于临时测试规则;
  • 永久模式(Permanent):规则储存在配置文件中,仅在 firewalld 重载(reload)或系统重启后生效,适用于生产环境的正式规则配置。
  • 两种模式可相互转换,通过firewall-cmd –runtime-to-permanent可将当前运行时规则写入配置文件,转为永久规则。

    二、firewalld 基础配置:图形化 + 命令行

    firewalld 提供firewall-config图形化工具和firewall-cmd命令行工具,图形化工具操作直观,适合新手;命令行工具适合服务器无桌面环境的生产场景,也是运维必备技能,以下分别讲解核心配置操作。

    2.1 基础准备:安装与启动 firewalld

    无论使用哪种配置方式,首先需完成 firewalld 的安装和启动,以 OpenEuler/CentOS/RHEL 系统为例,执行以下命令:

    # 安装firewalld
    dnf install -y firewalld
    # 启动firewalld并设置开机自启
    systemctl start firewalld
    systemctl enable firewalld
    # 验证firewalld状态(显示active(running)即为正常)
    systemctl status firewalld
    # 关闭iptables(避免冲突,若已安装)
    systemctl stop iptables && systemctl disable iptables

    2.2 图形化配置:firewall-config

    图形化工具firewall-config操作直观,适合有桌面环境的服务器,需先安装工具和桌面环境(若未安装):

    bash

    # 安装桌面环境(OpenEuler/CentOS)
    dnf install -y gnome-shell gdm gnome-session gnome-terminal
    # 设置默认图形化启动
    systemctl set-default graphical.target
    # 安装firewall-config图形化工具
    dnf install -y firewall-config
    # 重启系统进入桌面(可选,也可通过远程桌面连接)
    reboot

    2.2.1 打开 firewall-config

    进入系统桌面后,点击左上角「活动」→「显示应用」,找到「防火墙配置」并打开,主界面分为主菜单、配置选项、功能选项卡(区域、服务、IPsets 等),底部状态栏显示连接状态、默认区域、锁定状态等核心信息。

    2.2.2 核心配置操作
  • 切换配置模式:界面顶部选择「运行时」或「永久」,按需配置临时 / 永久规则;
  • 修改默认区域:点击菜单栏「选项」→「更改默认区域」,选择目标区域(如 dmz、external),点击确定即可;
  • 区域规则配置:选择目标区域(如 public),可配置以下核心项:
    • 服务:勾选允许的服务(如 http、https、ssh),勾选后自动开放对应端口;
    • 端口:添加自定义端口 / 端口范围(如 8080/tcp、8000-9000/udp),适用于非预定义服务;
    • 协议:添加允许的网络协议(如 tcp、udp、icmp);
    • 伪装:开启后实现地址伪装(NAT),适用于网关服务器,仅支持 IPv4;
    • 端口转发:将本地端口映射到其他端口 / 远程主机端口(如将 80 端口转发到 8080),需先开启伪装;
    • ICMP 过滤器:勾选需要拒绝的 ICMP 类型(如 echo-request,拒绝 ping 请求);
  • 规则生效:配置永久规则后,点击菜单栏「文件」→「重新加载防火墙」,使规则立即生效。
  • 2.3 命令行配置:firewall-cmd(重点)

    firewall-cmd是 firewalld 的核心管理工具,支持所有配置操作,以下讲解高频核心命令,按「基础查询、区域管理、服务管理、端口管理、规则重载」分类,方便记忆和使用。

    2.3.1 基础查询命令:查看预定义信息

    bash

    # 查看所有预定义区域
    firewall-cmd –get-zones
    # 查看所有预定义服务(包含http、https、ssh等70+常用服务)
    firewall-cmd –get-services
    # 查看所有可阻塞的ICMP类型(如echo-request:ping请求)
    firewall-cmd –get-icmptypes
    # 查看当前默认区域
    firewall-cmd –get-default-zone
    # 查看当前激活的区域(已绑定接口/源IP的区域)
    firewall-cmd –get-active-zones
    # 查看指定接口绑定的区域(如ens33)
    firewall-cmd –get-zone-of-interface=ens33
    # 查看默认区域的所有规则(含服务、端口、接口等)
    firewall-cmd –list-all
    # 查看指定区域的所有规则(如dmz)
    firewall-cmd –zone=dmz –list-all
    # 查看所有区域的规则
    firewall-cmd –list-all-zones

    2.3.2 区域管理命令:绑定接口 / 修改默认区域

    bash

    # 设置默认区域(永久生效,需重载)
    firewall-cmd –set-default-zone=dmz –permanent
    # 为指定区域绑定网络接口(如将ens33绑定到internal区域)
    firewall-cmd –zone=internal –add-interface=ens33 –permanent
    # 修改接口绑定的区域(如将ens33从internal改为external)
    firewall-cmd –zone=external –change-interface=ens33 –permanent
    # 从指定区域移除接口(如将ens33从external移除)
    firewall-cmd –zone=external –remove-interface=ens33 –permanent

    2.3.3 服务管理命令:允许 / 拒绝服务

    bash

    # 查看默认区域允许的服务
    firewall-cmd –list-services
    # 为默认区域添加允许的服务(如http,运行时生效)
    firewall-cmd –add-service=http
    # 为指定区域添加允许的服务(如dmz区域添加https,永久生效)
    firewall-cmd –zone=dmz –add-service=https –permanent
    # 为指定区域移除服务(如dmz区域移除ssh,永久生效)
    firewall-cmd –zone=dmz –remove-service=ssh –permanent

    2.3.4 端口管理命令:开放 / 关闭自定义端口

    适用于非预定义服务(如自定义应用的 8080 端口),需指定端口号 + 协议(tcp/udp):

    bash

    # 查看默认区域开放的端口
    firewall-cmd –list-ports
    # 为默认区域开放自定义端口(如8080/tcp,运行时生效)
    firewall-cmd –add-port=8080/tcp
    # 为指定区域开放端口范围(如dmz区域开放8000-9000/udp,永久生效)
    firewall-cmd –zone=dmz –add-port=8000-9000/udp –permanent
    # 为指定区域关闭端口(如dmz区域关闭8080/tcp,永久生效)
    firewall-cmd –zone=dmz –remove-port=8080/tcp –permanent

    2.3.5 规则重载与模式转换

    bash

    # 重载防火墙规则,使永久配置生效(不中断现有连接)
    firewall-cmd –reload
    # 将当前运行时规则转为永久规则(无需手动重载)
    firewall-cmd –runtime-to-permanent
    # 开启应急模式(丢弃所有数据包,紧急防护)
    firewall-cmd –panic-on
    # 关闭应急模式
    firewall-cmd –panic-off

    三、firewalld 实战案例:网关 + Web 服务器安全配置

    本次实战模拟企业常见的网络架构:一台网关服务器(双网卡,连接公网和内网)+一台 Web 服务器(部署在内网 DMZ 区,对外提供 HTTPS 服务),通过 firewalld 配置实现以下安全需求,补充完整的基础准备步骤。

    3.1 实验需求

  • 网关服务器:ens33(公网口,100.1.1.10/24)绑定 external 区域,ens37(内网口,192.168.1.1/24)绑定 trusted 区域,ens38(DMZ 口,192.168.2.1/24)绑定 dmz 区域;开启路由转发,实现公网与内网的通信;
  • Web 服务器:ens33(192.168.2.10/24)绑定 dmz 区域,仅开放 HTTPS 服务和自定义 SSH 端口(12345),拒绝 HTTP 流量和 ping 请求;
  • 网关和 Web 服务器均修改 SSH 默认端口为 12345,关闭默认 22 端口,提高 SSH 登录安全性;
  • 公网测试机(100.1.1.20/24)可通过 SSH 12345 端口登录网关,可访问 Web 服务器的 HTTPS 服务;内网测试机(192.168.1.10/24)可访问 Web 服务器的所有服务。
  • 3.2 实验环境准备

    3.2.1 服务器基础信息
    服务器类型网卡IP 地址 / 网段核心作用
    网关服务器 ens33 100.1.1.10/24 公网接口,连接公网测试机
    ens37 192.168.1.1/24 内网接口,连接内网测试机
    ens38 192.168.2.1/24 DMZ 接口,连接 Web 服务器
    Web 服务器 ens33 192.168.2.10/24 DMZ 区接口,提供 HTTPS 服务
    公网测试机 100.1.1.20/24 测试公网访问权限
    内网测试机 192.168.1.10/24 测试内网访问权限
    3.2.2 基础环境配置(两台服务器均执行)
  • 关闭 SELinux(避免规则冲突,生产环境可按需配置 SELinux 规则):
  • bash

    # 临时关闭SELinux
    setenforce 0
    # 永久关闭SELinux,修改配置文件
    vi /etc/selinux/config
    # 将SELINUX=enforcing改为SELINUX=disabled,保存退出
    # 重启系统生效(可选,若不重启则临时关闭生效)
    reboot

  • 关闭防火墙冲突服务(如 iptables),确保 firewalld 正常运行:
  • bash

    systemctl stop iptables && systemctl disable iptables
    systemctl restart firewalld && systemctl enable firewalld

  • 修改 SSH 默认端口为 12345,关闭 22 端口:
  • bash

    # 编辑SSH配置文件
    vi /etc/ssh/sshd_config
    # 注释掉原Port 22,添加新端口:Port 12345
    # 保存退出后,重启SSH服务
    systemctl restart sshd
    # 注意:先不要关闭当前SSH连接,新开窗口测试12345端口能否登录,避免断连

    3.3 网关服务器(gateway-server)firewalld 配置

    步骤 1:配置主机名,方便识别

    bash

    hostnamectl set-hostname gateway-server
    bash # 使主机名立即生效

    步骤 2:开启内核路由转发(实现公网 / 内网 / DMZ 区通信)

    bash

    # 编辑内核配置文件
    vi /etc/sysctl.conf
    # 添加/修改:net.ipv4.ip_forward=1
    # 使配置立即生效
    sysctl -p

    步骤 3:firewalld 核心规则配置(永久生效,所有命令加 –permanent)

    bash

    # 1. 设置默认区域为external(公网口默认区域,安全性高)
    firewall-cmd –set-default-zone=external –permanent
    # 2. 为external区域绑定公网口ens33
    firewall-cmd –zone=external –add-interface=ens33 –permanent
    # 3. 为trusted区域绑定内网口ens37(信任内网,允许所有流量)
    firewall-cmd –zone=trusted –add-interface=ens37 –permanent
    # 4. 为dmz区域绑定DMZ口ens38(对外服务区域,精细化管控)
    firewall-cmd –zone=dmz –add-interface=ens38 –permanent
    # 5. external区域开放SSH自定义端口12345/tcp(公网可SSH登录网关)
    firewall-cmd –zone=external –add-port=12345/tcp –permanent
    # 6. external区域移除默认的ssh服务(关闭22端口,提高安全性)
    firewall-cmd –zone=external –remove-service=ssh –permanent
    # 7. external区域拒绝ping请求(防止公网ping探测)
    firewall-cmd –zone=external –add-icmp-block=echo-request –permanent
    # 8. 开启external区域的地址伪装(NAT,实现内网主机访问公网)
    firewall-cmd –zone=external –add-masquerade –permanent

    步骤 4:重载防火墙,使所有永久规则生效

    bash

    firewall-cmd –reload
    # 验证配置:查看激活的区域和规则,确认接口绑定和端口开放正确
    firewall-cmd –get-active-zones
    firewall-cmd –zone=external –list-all

    3.4 Web 服务器(web)firewalld 配置 + HTTPS 服务部署

    Web 服务器部署在 DMZ 区,是对外提供服务的核心,需严格管控端口和服务,仅开放必要的 HTTPS 和 SSH 12345 端口,拒绝 HTTP 和 ping 请求。

    步骤 1:配置主机名,安装 HTTPS 服务(httpd+mod_ssl)

    bash

    # 配置主机名
    hostnamectl set-hostname web
    bash
    # 安装httpd和mod_ssl(实现HTTPS服务,自动生成SSL证书)
    dnf install -y httpd mod_ssl
    # 启动httpd并设置开机自启
    systemctl start httpd && systemctl enable httpd
    # 创建测试首页,验证HTTPS服务
    echo "Test Web Server HTTPS" > /var/www/html/index.html

    步骤 2:firewalld 核心规则配置(永久生效,加 –permanent)

    bash

    # 1. 设置默认区域为dmz(DMZ区专用,仅开放必要服务)
    firewall-cmd –set-default-zone=dmz –permanent
    # 2. 为dmz区域绑定本地网卡ens33
    firewall-cmd –zone=dmz –add-interface=ens33 –permanent
    # 3. dmz区域开放HTTPS服务(对外提供核心服务)
    firewall-cmd –zone=dmz –add-service=https –permanent
    # 4. dmz区域开放SSH自定义端口12345/tcp(远程管理)
    firewall-cmd –zone=dmz –add-port=12345/tcp –permanent
    # 5. dmz区域移除http服务(拒绝未加密的HTTP流量,强制HTTPS)
    firewall-cmd –zone=dmz –remove-service=http –permanent
    # 6. dmz区域移除默认的ssh服务(关闭22端口)
    firewall-cmd –zone=dmz –remove-service=ssh –permanent
    # 7. dmz区域拒绝ping请求(防止探测)
    firewall-cmd –zone=dmz –add-icmp-block=echo-request –permanent

    步骤 3:重载防火墙,验证配置

    bash

    firewall-cmd –reload
    # 验证规则:确认dmz区域仅开放https和12345/tcp,拒绝echo-request
    firewall-cmd –list-all

    3.5 实验效果验证

    分别在公网测试机和内网测试机执行验证操作,确认规则符合预期:

    3.5.1 公网测试机(100.1.1.20/24)验证

    bash

    # 1. 测试ping网关和Web服务器(应均失败,拒绝ping)
    ping 100.1.1.10
    ping 192.168.2.10
    # 2. 测试SSH登录网关(12345端口,应成功)
    ssh -p 12345 root@100.1.1.10
    # 3. 测试访问Web服务器HTTPS服务(应成功,显示测试首页)
    curl https://192.168.2.10
    # 4. 测试访问Web服务器HTTP服务(应失败,拒绝HTTP)
    curl http://192.168.2.10

    3.5.2 内网测试机(192.168.1.10/24)验证

    bash

    # 1. 测试SSH登录Web服务器(12345端口,应成功)
    ssh -p 12345 root@192.168.2.10
    # 2. 测试访问Web服务器HTTPS服务(应成功)
    curl https://192.168.2.10
    # 3. 测试ping网关和Web服务器(网关external区拒绝ping,Web服务器dmz区拒绝ping,均失败)
    ping 192.168.1.1
    ping 192.168.2.10

    四、firewalld 运维常用技巧与注意事项

    4.1 常用运维技巧

  • 规则备份与恢复:firewalld 的配置文件储存在/etc/firewalld/,直接备份该目录即可;恢复时将备份文件覆盖原目录,执行firewall-cmd –reload即可。
  • 批量添加规则:将常用规则写入 shell 脚本,执行脚本即可快速配置,避免重复输入命令。
  • 查看防火墙日志:firewalld 日志默认储存在/var/log/firewalld/,可通过日志排查规则生效异常问题。
  • 临时开放规则:测试阶段可先配置运行时规则(不加 –permanent),测试通过后再转为永久规则(firewall-cmd –runtime-to-permanent)。
  • 4.2 生产环境注意事项

  • 最小权限原则:仅开放业务必需的服务和端口,拒绝所有不必要的流量,如公网服务器仅开放 80、443、自定义 SSH 端口。
  • 避免规则冲突:关闭 iptables、ufw 等其他防火墙服务,防止与 firewalld 冲突。
  • SSH 端口防护:修改 SSH 默认 22 端口,禁止公网 ping,配合防火墙规则限制 SSH 登录的源 IP(可通过 firewalld 的源 IP 绑定实现)。
  • 规则重载而非重启:修改永久规则后,使用firewall-cmd –reload重载,而非systemctl restart firewalld,避免中断现有网络连接。
  • DMZ 区严格管控:对外提供服务的服务器部署在 dmz 区域,仅开放对应服务端口,拒绝所有无关流量。
  • 赞(0)
    未经允许不得转载:171主机测评 » firewalld 防火墙
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址