一、防火墙基础概念
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 |
极低 |
简单场景用户 |
提供极简命令(如 |
(2)内核态四表五链详解
四表(规则优先级从高到低):
raw
(连接跟踪豁免) →mangle
(修改数据包头字段,如TTL、QoS标记) →nat
(网络地址转换,如SNAT/DNAT) →filter
(最常用,控制数据包的放行/拒绝)。五链(数据包处理的关键节点):
PREROUTING
:路由前处理(常用于DNAT,修改目标地址)。INPUT
:进入本机的数据包(如访问本机SSH服务)。FORWARD
:转发的数据包(如本机作为路由器时的跨网段流量)。OUTPUT
:本机发出的数据包(如访问外部网站)。POSTROUTING
:路由后处理(常用于SNAT,修改源地址)。
关键说明:firewalld通过区域配置间接调用这些底层规则,用户无需直接操作四表五链。
三、Firewalld核心组件
1. 九大预定义区域(Zone)及功能详解
区域是firewalld的核心概念,每个区域是一组预设规则的集合,通过绑定网络接口或源地址生效。以下是九大区域的详细说明:
区域名称 |
默认规则(target) |
典型应用场景 |
默认放行服务(示例) |
关键特性 |
---|---|---|---|---|
public |
|
公共网络(如家庭路由器、云服务器公网IP) |
|
默认安全级别较高,仅放行必要服务(如SSH),适合暴露在互联网的设备。 |
home |
|
家庭网络(信任内部设备) |
|
允许常见的家庭网络服务(如文件共享、打印机发现)。 |
work |
|
工作网络(较信任的办公环境) |
|
适用于企业内网办公设备,放行基础管理端口。 |
trusted |
|
完全信任区域(如内部管理网络) |
无限制(所有流量默认允许) |
所有数据包均被放行(不推荐直接用于生产环境)。 |
internal |
|
内部网络(如企业内网核心段) |
|
类似home区域,但通常用于更严格的内网环境。 |
external |
|
外部网络(如面向互联网的网关) |
|
默认放行SSH服务,常用于NAT网关或防火墙设备的外网接口。 |
dmz |
|
非军事区(隔离内部服务器) |
|
用于放置对外提供服务的服务器(如Web服务器),严格限制访问来源。 |
drop |
|
丢弃所有流量(无响应) |
所有数据包被静默丢弃(不返回任何信息) |
安全级别最高(攻击者无法感知是否存在目标主机)。 |
block |
|
拒绝所有流量(返回拒绝信息) |
所有数据包被明确拒绝(如返回"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/tcp
、443/tcp
),用于放行非标准服务或自定义端口。ICMP类型(ICMP Blocks):控制网络诊断协议的流量(如
echo-request
对应ping请求)。
四、firewall-cmd 命令详解
firewall-cmd是firewalld的管理工具,支持动态修改规则(无需重启服务)和永久规则保存。
1. 命令关键字分类
类别 |
关键字前缀 |
功能描述 |
---|---|---|
查看规则 |
|
显示当前区域或全局的配置信息 |
配置规则 |
|
添加新的放行策略(服务/端口等) |
|
删除已配置的规则 |
|
|
修改现有配置(如网卡区域绑定) |
|
|
设置全局参数(如默认区域) |
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。
操作步骤:
将网卡绑定到目标区域(如work区域,默认规则较严格):
firewall-cmd --add-interface=ens33 --zone=work
禁止ICMP Echo请求(ping):
firewall-cmd --add-icmp-block=echo-request --zone=work
验证效果:
在外部主机(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。
操作步骤:
环境配置(确保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
防火墙配置:
# 将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)
外部验证:
在客户端(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和端口正确(通过
netstat
或ss
命令验证)。ICMP限制:禁止ping时,外部主机会收到"Destination Host Prohibited"错误。