Linux防火墙-Firewalld

发布于:2025-09-15 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、防火墙基础概念

1. 防火墙的定义与作用

防火墙是位于计算机或网络边界的安全系统,通过监控和控制进出网络的数据流,依据预定义的安全规则筛选数据包,实现对网络访问的精准管控。其核心作用包括:

  • 攻击防护​:拦截来自外部网络的恶意流量(如端口扫描、DDoS攻击、非法入侵尝试)。

  • 流量控制​:限制特定服务的访问权限(如仅允许内网访问数据库端口)。

  • 网络隔离​:划分不同安全级别的网络区域(如将对外服务与内部业务系统分离)。

2. 防火墙的分类

(1)按表现形式划分

类型

代表工具(Linux)

代表工具(Windows)

适用场景

软件防火墙

iptables(传统)、firewalld(推荐)、ufw(简化版)

Windows Defender 防火墙

软件防火墙集成于操作系统内部,通过内核级规则实现对网络流量的动态过滤。

硬件防火墙

-

-

由专用硬件设备(如华为USG、思科ASA、深信服NGAF)实现,通常部署在网络边界,提供高性能、高可靠性的安全防护,适用于企业级网络环境。

(2)按技术原理划分

类型

检查内容

特点

包过滤防火墙

数据包的源IP地址目的IP地址源端口号目的端口号传输层协议(如TCP的SYN控制位)​

仅分析数据包头部信息,处理速度快,但无法检测数据内容中的潜在威胁(如恶意代码)。

七层防火墙

在包过滤基础上,进一步解析应用层数据内容​(如HTTP请求的URL、FTP传输的文件类型)

安全性更高(可识别并阻断SQL注入、跨站脚本攻击等应用层威胁),但处理复杂度高,性能开销大。


二、Linux防火墙体系结构

1. 用户态与内核态的协同

Linux防火墙通过用户态管理工具内核态规则引擎协同工作:

  • 用户态工具​:提供人机交互接口,用于配置和管理防火墙规则(如添加/删除服务、端口、ICMP限制等)。

  • 内核态引擎​:基于Netfilter框架(Linux内核的网络包过滤子系统),通过四表五链对数据包进行实时处理。

(1)用户态常用工具对比

工具

技术复杂度

适用人群

核心特点

iptables

专业运维人员

直接操作底层"四表五链"规则,灵活性强但学习曲线陡峭(需理解数据包在路由前后的处理流程)。

firewalld

初学者/普通管理员

采用"区域(Zone)"抽象概念,通过绑定网络接口或源地址自动应用预设规则,无需手动配置底层细节。

ufw

极低

简单场景用户

提供极简命令(如ufw allow 22),适合个人电脑或对安全性要求不高的环境。

(2)内核态四表五链详解
  • 四表(规则优先级从高到低)​​:

    raw(连接跟踪豁免) → mangle(修改数据包头字段,如TTL、QoS标记) → nat(网络地址转换,如SNAT/DNAT) → filter(最常用,控制数据包的放行/拒绝)。

  • 五链(数据包处理的关键节点)​​:

    • PREROUTING:路由前处理(常用于DNAT,修改目标地址)。

    • INPUT:进入本机的数据包(如访问本机SSH服务)。

    • FORWARD:转发的数据包(如本机作为路由器时的跨网段流量)。

    • OUTPUT:本机发出的数据包(如访问外部网站)。

    • POSTROUTING:路由后处理(常用于SNAT,修改源地址)。

关键说明​:firewalld通过区域配置间接调用这些底层规则,用户无需直接操作四表五链。


三、Firewalld核心组件

1. 九大预定义区域(Zone)及功能详解

区域是firewalld的核心概念,每个区域是一组预设规则的集合,通过绑定网络接口或源地址生效。以下是九大区域的详细说明:

区域名称

默认规则(target)

典型应用场景

默认放行服务(示例)

关键特性

public

default(通常为REJECTDROP

公共网络(如家庭路由器、云服务器公网IP)

dhcpv6-client(IPv6 DHCP服务)、ssh(远程登录)

默认安全级别较高,仅放行必要服务(如SSH),适合暴露在互联网的设备。

home

default

家庭网络(信任内部设备)

dhcpv6-clientmdns(局域网设备发现)、samba-client(访问Windows共享)、ssh

允许常见的家庭网络服务(如文件共享、打印机发现)。

work

default

工作网络(较信任的办公环境)

dhcpv6-clientssh

适用于企业内网办公设备,放行基础管理端口。

trusted

ACCEPT

完全信任区域(如内部管理网络)

无限制(所有流量默认允许)

所有数据包均被放行​(不推荐直接用于生产环境)。

internal

default

内部网络(如企业内网核心段)

dhcpv6-clientmdnssamba-clientssh

类似home区域,但通常用于更严格的内网环境。

external

default

外部网络(如面向互联网的网关)

ssh(常用于远程管理网关设备)

默认放行SSH服务,常用于NAT网关或防火墙设备的外网接口。

dmz

default

非军事区(隔离内部服务器)

ssh(仅允许管理端口)

用于放置对外提供服务的服务器(如Web服务器),严格限制访问来源。

drop

DROP

丢弃所有流量(无响应)

所有数据包被静默丢弃(不返回任何信息)

安全级别最高​(攻击者无法感知是否存在目标主机)。

block

%%REJECT%%

拒绝所有流量(返回拒绝信息)

所有数据包被明确拒绝(如返回"Connection refused"错误)

比drop更友好​(攻击者会收到拒绝响应,但能确认主机存在)。

关键说明​:

  • target决定默认行为:

    • ACCEPT:放行所有流量(如trusted区域)。

    • DROP:直接丢弃数据包(无响应,如drop区域)。

    • REJECT(对应%%REJECT%%):拒绝数据包并返回错误信息(如block区域)。

  • 实际放行规则通过services(服务名)、ports(端口号)、icmp-blocks(ICMP类型)、rich rules(高级规则)等配置。


2. 服务、端口与ICMP类型的关联

  • 服务(Services)​​:firewalld预定义的常见服务模板(如http对应80/tcp、ssh对应22/tcp),包含服务所需的端口、协议和模块。

  • 端口(Ports)​​:直接指定端口号和协议(如80/tcp443/tcp),用于放行非标准服务或自定义端口。

  • ICMP类型(ICMP Blocks)​​:控制网络诊断协议的流量(如echo-request对应ping请求)。


四、firewall-cmd 命令详解

firewall-cmd是firewalld的管理工具,支持动态修改规则(无需重启服务)和永久规则保存。

1. 命令关键字分类

类别

关键字前缀

功能描述

查看规则

--list-*--get-*

显示当前区域或全局的配置信息

配置规则

--add-*

添加新的放行策略(服务/端口等)

--remove-*

删除已配置的规则

--change-*

修改现有配置(如网卡区域绑定)

--set-*

设置全局参数(如默认区域)

2. 常用命令实例

(1)查看规则(诊断与验证)
# 查看所有区域的完整配置(包括接口、服务、端口等)
firewall-cmd --list-all-zones

# 查看指定区域(如public)的详细信息
firewall-cmd --list-all --zone=public

# 查看指定区域的放行服务(如public区域允许哪些预定义服务)
firewall-cmd --list-services --zone=public

# 查看放行端口(如public区域的开放端口列表)
firewall-cmd --list-ports --zone=public

# 查看绑定的网络接口(如public区域关联的网卡,如ens33)
firewall-cmd --list-interfaces --zone=public

# 查看放行的协议(如icmp、自定义协议)
firewall-cmd --list-protocols --zone=public

# 查看ICMP阻塞类型(如是否禁止ping请求/echo-request)
firewall-cmd --list-icmp-blocks --zone=public

# 查看放行的源地址(如允许192.168.1.0/24访问该区域)
firewall-cmd --list-sources --zone=public

# 查看源端口(较少使用,通常与转发端口配合)
firewall-cmd --list-source-ports --zone=public

# 查看富规则(高级自定义规则,如基于IP+端口的精确控制)
firewall-cmd --list-rich-rules --zone=public

# 查看转发端口配置(端口映射规则)
firewall-cmd --list-forward-ports --zone=public

# 查看firewalld支持的所有预定义服务(如http、ssh、mysql等)
firewall-cmd --get-services

# 查看当前系统的默认区域(新网卡默认绑定的区域)
firewall-cmd --get-default-zone

# 查看支持的ICMP阻塞类型(如echo-request、destination-unreachable等)
firewall-cmd --get-icmptypes

# 查看所有活动区域(当前有网络接口绑定的区域)
firewall-cmd --get-active-zones

# 查看指定网卡(如ens33)所属的区域
firewall-cmd --get-zone-of-interface=ens33

# 查看所有预定义区域名称(共九大区域)
firewall-cmd --get-zones
(2)添加规则(放行流量)
# 添加预定义服务到区域(如public区域允许http服务)
firewall-cmd --add-service=http --zone=public

# 添加端口到区域(如public区域允许80/tcp端口)
firewall-cmd --add-port=80/tcp --zone=public

# 添加协议(如ah协议,用于IPSec加密)
firewall-cmd --add-protocol=ah --zone=public

# 添加ICMP阻塞(如禁止ping请求/echo-request)
firewall-cmd --add-icmp-block=echo-request --zone=public

# 绑定网卡到区域(如将ens33网卡划入work区域)
firewall-cmd --add-interface=ens33 --zone=work

# 添加放行源地址(如允许192.168.1.0/24访问work区域)
firewall-cmd --add-source=192.168.1.0/24 --zone=work

# 添加源端口(较少用,通常与转发端口配合)
firewall-cmd --add-source-port=999/tcp --zone=work

# 添加端口转发(如将work区域的8080/tcp转发到192.168.115.115的80/tcp)
firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.115.115 --zone=work

# 启用地址转换(NAT,如external区域默认开启,用于隐藏内网IP)
firewall-cmd --add-masquerade --zone=work
(3)修改配置(调整现有规则)
# 修改默认区域(如将新网卡的默认区域改为work)
firewall-cmd --set-default-zone=work

# 修改网卡所属区域(如将ens33从原区域改为internal)
firewall-cmd --change-interface=ens33 --zone=internal

# 修改网卡区域(另一种写法,效果类似)
firewall-cmd --change-zone=ens33 --zone=external

# 追加放行源地址(如work区域新增允许192.168.2.0/24)
firewall-cmd --change-source=192.168.2.0/24 --zone=work
(4)删除规则(撤销放行策略)
# 删除服务(如public区域移除http服务)
firewall-cmd --remove-service=http --zone=public

# 删除端口(如public区域移除80/tcp)
firewall-cmd --remove-port=80/tcp --zone=public

# 删除协议
firewall-cmd --remove-protocol=ah --zone=public

# 删除ICMP阻塞(如允许ping请求)
firewall-cmd --remove-icmp-block=echo-request --zone=public

# 解绑网卡
firewall-cmd --remove-interface=ens33 --zone=work

# 移除放行源地址
firewall-cmd --remove-source=192.168.1.0/24 --zone=work

# 移除源端口
firewall-cmd --remove-source-port=999/tcp --zone=work

# 删除端口转发
firewall-cmd --remove-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.115.115 --zone=work

# 关闭地址转换(NAT)
firewall-cmd --remove-masquerade --zone=work
(5)保存规则(确保持久化)
# 临时保存单条规则(默认仅生效于运行时,重启后丢失)
# 注意:直接使用--add-*添加的规则需通过以下方式永久化

# 永久保存所有当前运行时规则(推荐操作)
firewall-cmd --runtime-to-permanent

# 单条规则永久化(添加--permanent参数)
firewall-cmd --add-service=http --zone=public --permanent

# 规则存储路径:/etc/firewalld/zones/<区域名>.xml(如public.xml)

关键区别​:

  • 不加--permanent的规则仅保存在内存中(运行时生效,重启后失效)。

  • 添加--permanent或通过--runtime-to-permanent将规则写入配置文件(永久生效,但需重启firewalld服务或重载配置:firewall-cmd --reload)。


五、典型应用案例

案例1:禁止外部主机Ping本机

需求背景​:防止外部攻击者通过ping命令探测本机存活状态(适用于安全敏感环境)。

环境信息​:

  • 本机IP:192.168.115.129,网卡:ens33(NAT模式)。

  • 外部测试主机IP:192.168.115.128。

操作步骤​:

  1. 将网卡绑定到目标区域​(如work区域,默认规则较严格):

    firewall-cmd --add-interface=ens33 --zone=work
  2. 禁止ICMP Echo请求(ping)​​:

    firewall-cmd --add-icmp-block=echo-request --zone=work
  3. 验证效果​:

    在外部主机(192.168.115.128)执行ping测试:

    ping -c 4 192.168.115.129

    预期结果​:

    PING 192.168.115.129 (192.168.115.129) 56(84) bytes of data.
    From 192.168.115.129 icmp_seq=1 Destination Host Prohibited
    From 192.168.115.129 icmp_seq=2 Destination Host Prohibited
    From 192.168.115.129 icmp_seq=3 Destination Host Prohibited
    From 192.168.115.129 icmp_seq=4 Destination Host Prohibited
    --- 192.168.115.129 ping statistics ---
    4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3001ms

案例2:允许外部主机访问本机的HTTP服务

需求背景​:部署Web服务(如Apache/Nginx),允许外部用户通过浏览器访问。

环境信息​:

  • 本机IP:192.168.80.128,网卡:ens34(VMnet3虚拟网络)。

  • 外部测试主机IP:192.168.80.129。

操作步骤​:

  1. 环境配置(确保HTTP服务正常运行)​​:

    # 关闭SELinux临时限制(测试环境,生产环境需谨慎)
    setenforce 0
    
    # 安装HTTP服务(CentOS/RHEL)
    yum install -y httpd
    
    # 启动HTTP服务
    systemctl start httpd
    
    # 修改HTTP服务监听IP(仅监听本机指定IP的80端口)
    vim /etc/httpd/conf/httpd.conf
    # 找到"Listen 80",改为"Listen 192.168.80.128:80"
    systemctl restart httpd
    
    # 验证服务监听状态
    netstat -naptu | grep :80
    # 预期输出:tcp 0 0 192.168.80.128:80 0.0.0.0:* LISTEN 5884/httpd
  2. 防火墙配置​:

    # 将ens34网卡绑定到dmz区域(非军事区,适合对外服务)
    firewall-cmd --change-interface=ens34 --zone=dmz
    
    # 检查dmz区域是否已放行http服务(默认可能未放行)
    firewall-cmd --list-all --zone=dmz
    # 若未列出"http"服务,需手动添加
    
    # 放行http服务(对应80/tcp端口)
    firewall-cmd --add-service=http --zone=dmz
    
    # 验证配置
    firewall-cmd --list-all --zone=dmz
    # 应看到"services: http ssh"(或其他默认服务+http)
  3. 外部验证​:

    在客户端(192.168.80.129)执行:

    curl 192.168.80.128
    # 或通过浏览器访问 http://192.168.80.128

    预期结果​:返回HTTP默认页面(如Apache欢迎页)。


案例3:允许外部主机访问本机的指定端口

需求背景​:运行自定义服务(如监听801/tcp的应用程序),允许外部访问该端口。

操作步骤​:

# 假设已存在dmz区域绑定(如ens34网卡属于dmz区域)

# 放行801/tcp端口(直接指定端口,无需依赖预定义服务)
firewall-cmd --add-port=801/tcp --zone=dmz

# 验证客户端访问
# 在外部主机执行:curl 192.168.80.128:801
# 或通过telnet测试:telnet 192.168.80.128 801

关键点​:

  • 放行端口的本质是允许该端口的数据包通过防火墙,与服务实际监听的端口必须一致。

  • 若服务修改了监听端口号(如从80改为8080),需同步调整防火墙放行的端口(如--add-port=8080/tcp)。


六、总结

1. Firewalld的核心优势

  • 易用性​:通过"区域"抽象简化规则管理,无需深入理解底层四表五链。

  • 灵活性​:支持服务、端口、ICMP、富规则等多种配置方式,适应复杂场景。

  • 动态性​:大部分规则可实时生效(无需重启服务),同时支持永久保存。

2. 配置建议

  • 遵循最小权限原则​:仅放行必要的服务和端口(如Web服务器仅放行80/tcp和443/tcp)。

  • 合理划分区域​:根据网络环境的安全级别选择区域(如公网接口用public/dmz,内网用home/internal)。

  • 定期审计规则​:通过--list-all检查当前放行策略,避免冗余或过度开放的规则。

  • 备份配置​:重要规则修改前备份/etc/firewalld/zones/下的XML文件。

3. 常见问题排查

  • 规则不生效​:检查是否添加了--permanent并执行了firewall-cmd --reload

  • 服务无法访问​:确认服务监听IP和端口正确(通过netstatss命令验证)。

  • ICMP限制​:禁止ping时,外部主机会收到"Destination Host Prohibited"错误。