企业安全防护之——防火墙
一、防火墙的发展历程
第一代防火墙:包过滤防火墙(1980年代末-1990年代初);第一代防火墙主要基于包过滤技术,通过检查数据包的头部信息(如源IP地址、目标IP地址、端口号、协议类型等)来决定是否允许数据包通过。
特点:工作在网络层(OSI模型第3层),规则简单,性能较高,但功能有限,无法识别数据包的内容或状态,容易被绕过。例如,它无法阻止伪造IP地址的攻击。
第二代防火墙:状态检测防火墙(1990年代中期);第二代防火墙引入了状态检测技术(Stateful Inspection)。它不仅检查数据包的头部信息,还会跟踪连接的状态(如TCP会话的建立、数据传输和关闭),通过维护状态表来判断数据包是否属于合法会话。
特点:工作在传输层(OSI模型第4层),安全性显著提高,能够防御一些简单的攻击,如SYN洪泛攻击。
第三代防火墙:应用防火墙(2000年代初):随着Web应用和复杂协议的普及,防火墙开始
向应用层(OSI模型第7层)扩展。第三代防火墙被称为应用层防火墙,能够深入检查数据包的
内容,而不仅仅是头部信息。它可以识别特定的应用程序或协议(如HTTP、FTP),并根据应
用层规则进行过滤。
特点:精细化控制,但缺点是性能开销较大
第四代防火墙:下一代防火墙(NGFW,2010年代);它集成了传统防火墙的功能,并加入了
更高级的特性,如入侵检测与防御系统(IDS/IPS)、深度包检测(DPI)、应用识别与控制、
用户身份管理等。
特点:能够根据应用程序、用户行为和威胁情报进行动态调整,适应云计算和移动互联网的复杂环境。例如,它可以识别并阻止加密流量中的恶意行为(如SSL/TLS隧道中的威胁)。
现代防火墙:云原生与AI驱动(2020年代至今):随着云计算、虚拟化和零信任架构的兴
起,防火墙进一步演变为云原生防火墙和AI驱动防火墙。云原生防火墙部署在云环境中,支持
分布式架构,能够保护容器、微服务和多云环境。AI驱动防火墙则利用机器学习和大数据分
析,主动识别未知威胁(如零日攻击),并实现自动化响应。此外,防火墙的功能逐渐融入
SASE(安全访问服务边缘)和XDR(扩展检测与响应)等综合安全框架中,强调全局防护。
二、Linux中防火墙
1. iptables
简介:基于内核的Netfilter框架开发。它通过定义规则来控制网络数据包的过滤、转发和修改
功能与特点:
- 基于表(tables)和链(chains)管理规则
- 规则匹配:支持基于IP地址、端口、协议(如TCP、UDP、ICMP)、状态(如NEW、ESTABLISHED)等条件过滤数据包
- 状态检测:通过 conntrack 模块支持状态检测,适合实现动态防火墙策略
- 灵活性:支持用户自定义链,规则配置非常灵活
优点:
- 轻量高效,适用于资源有限的系统
- 被广泛支持,几乎所有Linux发行版都预装
缺点:
- 配置复杂,尤其是大规模规则时,管理和调试困难
- 不支持现代功能,如动态更新或高级应用层过滤
例:阻止来自特定IP的流量
主机:4.130
[root@localhost ~]# iptables -A INPUT -s 192.168.4.1 -j DROP
2. nftables
简介:同样基于Netfilter框架,但提供了更现代化和统一的规则管理方式
功能与特点:
- 统一框架:将 iptables 的多个表(filter、nat 等)名称弱化处理,转成了表类型
- 语法改进:采用更直观的脚本化语法,支持批量操作和原子性更新
- 高效性:内部使用虚拟机(nftables VM)处理规则,性能更优,尤其在复杂规则集下
- 扩展性:支持动态规则更新、集合(sets)功能,可高效管理大量IP或端口
优点:
- 配置更简洁,易于维护和扩展
- 支持现代网络需求,如IPv6优化和容器化环境
- 向下兼容 iptables(通过 iptables-nft 层)
缺点:
- 部分老旧系统不支持
例:创建表并添加规则
nft add table inet my_table
nft add chain inet my_table my_chain {rr hook input priority 0 \; }
nft add rule inet my_table my_chain ip saddr 192.168.1.100 drop
3.firewalld
简介:基于iptables或nftables的高级防火墙管理工具,它提供动态配置和用户友好的管理界面
功能与特点:
- 区域管理:通过“区域”(zones,如 public、trusted、drop)简化规则配置,不同网络接口可绑定不同区域
- 动态更新:支持运行时修改规则,无需重启服务
- 服务抽象:内置服务定义(如ssh、http),无需手动指定端口
- 后端支持:可选择 iptables 或 nftables 作为底层实现(RHEL 8 起默认使用nftables)
优点:
- 配置直观,适合初学者和系统管理员
- 支持图形化界面(firewall-config)和命令行工具(firewall-cmd)
- 适用于桌面和服务器环境
缺点:
- 相比直接使用 iptables/nftables,性能开销略高
- 对于复杂场景,灵活性不如底层工具
例:启动firewalld并设置默认区域
systemctl start firewalld
firewall-cmd --set-default-zone=public
# 允许HTTP服务
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload
4.三者对比
三、iptables防火墙
- 基于内核 Netfilter 框架的经典防火墙工具
- 其核心结构由四张表(tables)和五个链(chains)组成
- 每个表定义了不同的功能,而每个链决定了数据包在特定阶段的处理方式
1. 四表(Tables)
注:iptables 通过表来组织规则,每张表专注于特定的数据包处理功能
filter 表
- 功能作用:负责数据包的过滤,是 iptables 的默认表,用于决定数据包是否被允许通过或不允许通过
- 适用场景:访问控制、阻止特定流量
- 支持的链:INPUT、FORWARD、OUTPUT
nat 表
- 功能作用:用于网络地址转换(NAT),修改数据包的源地址或目标地址,常用于IP伪装、端口转发等
- 适用场景:内网访问外网、服务器端口映射
- 支持的链:PREROUTING、POSTROUTING、INPUT、OUTPUT(部分支持)
mangle 表
- 功能作用:用于修改数据包的特殊属性,如TTL(生存时间)、TOS(服务类型)或标记数据包供后续处理
- 适用场景:流量整形、QoS(服务质量)控制
- 支持的链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
raw 表
- 功能作用:用于在数据包处理的最早阶段进行特殊处理,主要用于设置数据包的“不跟踪”状态(跳过连接跟踪)
- 适用场景:提高性能(如跳过NAT跟踪)、处理特殊流量
- 支持的链:PREROUTING、OUTPUT
2. 五链(Chains)
注:链指的是处理数据包的位置和时机
PREROUTING 链
- 功能作用:数据包进入系统后、路由决策前处理,用于修改目标地址或标记数据包
- 适用表:nat、mangle、raw
INPUT 链
- 功能作用:处理发往本机的数据包,用于本地服务的访问控制
- 适用表:filter、mangle
FORWARD 链
- 功能作用:处理需要转发的流量(即本机作为路由器时),用于控制经过本机的数据包
- 适用表:filter、mangle
OUTPUT 链
- 功能作用:处理本机发出的数据包,用于限制本地发起的流量
- 适用表:filter、nat、mangle、raw
POSTROUTING 链
- 功能作用:数据包离开系统前、路由决策后处理,用于修改源地址或完成NAT
- 适用表:nat、mangle
3.语法格式
格式:命令 位置 条件 策略
案例:iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
选项:
- -A :追加规则
- -I :插入规则
- -L :查看规则
- -n :数字化显示
- -v :显示更加详细信息
- -F :清空规则(-t 表名,仅清空内存中的缓存)
- -D :删除规则
条件(规则):
- -s :判断来源IP地址
- -d :判断目标IP地址
- -p :判断传输协议
- --sport:判断来源端口
- --dport:判断目标端口
- -i :判断入站接口
- -o:判断出站接口
- --icmp-type:判断icmp的具体类型(0:ping应答,8:ping请求)
策略(动作):
- ACCEPT :放行
- REJECT :拒绝
- DROP :丢弃
- SNAT --to-source IP :源地址修改
- MASQUERADE :动态地址转换
- DNAT --to-destination IP :目标地址修改
- REDIRECT --to-ports :将请求其他主机的数据包转发给本机的指定端口
- LOG :将符合条件的数据包记录在日志中
注:防火墙的执行逻辑是自上而下顺序匹配,匹配成功即停止
例:使本机能够ping通其他主机,但其他主机ping不通本机
- 添加防火墙规则
[root@localhost ~]# iptables -t filter -A INPUT -p icmp --icmp-type 8 -j DROP
[root@localhost ~]# iptables -t filter -A INPUT -p icmp --icmp-type 0 -j ACCEPT