简介
Netfilter是Linux内核中的一个强大的网络数据包处理框架,主要用于实现防火墙、网络地址转换(NAT)等功能。它通过在网络协议栈的关键路径上设置多个钩子(Hooks)点,允许用户自定义数据包的处理策略。它位于网络栈的中心,为不同的防火墙和流量处理工具提供基础设施。
Iptables是Netfilter的传统用户空间工具。它直接与Netfilter交互,用于定义如何处理通过内核的数据包。
Nftables是基于Netfilter的下一代工具,旨在替代Iptables。它直接利用Netfilter的数据包处理机制,但在用户空间中提供了一个更现代的接口,统一了不同协议(IPv4、IPv6、ARP和桥接流量)的处理。
Firewalld是一种高级的防火墙管理工具,本身并不直接处理数据包,而是通过Iptables或 Nftables与Netfilter交互。
以下是几种工具的对比,今天重点研究Netfilter以及常用的工具Iptables。
特性 | Netfilter | Iptables | Nftables | Firewalld |
---|---|---|---|---|
核心功能 | 负责处理网络流量的过滤、连接跟踪和地址转换等功能 | 防火墙、包过滤、NAT | 防火墙、包过滤、NAT | 动态防火墙管理 |
工作层 | 内核空间 | 用户空间 | 用户空间 | 用户空间 |
配置方式 | 给其他工具提供接口 | 规则语法相对复杂 | 规则语法简洁,支持批处理 | 基于区域管理,动态配置 |
性能 | 内核底层框架,性能强劲 | 成熟、稳定,但大规模规则性能欠佳 | 高效、内存占用低 | 性能依赖底层 iptables/nftables |
适用场景 | 给各种网络场景提供底层框架 | 中小型防火墙配置 | 替代iptables,复杂网络场景 | 桌面和服务器动态防火墙管理 |
Netfilter
核心功能
Netfilter的核心功能包括以下几个部分:
1.钩子函数(hooks):Netfilter提供了一组钩子,允许系统在数据包生命周期的不同阶段插入处理逻辑。这些钩子点是Netfilter的核心,帮助实现包过滤、转发、NAT等功能。
2.数据包过滤和转发规则:管理员可以通过工具(如iptables或nftables)在用户空间定义数据包处理规则,这些规则被传递到内核空间并在钩子点处应用。
3.连接跟踪(ConnectionTracking):Netfilter包含一个连接跟踪模块,能够跟踪所有通过Linux内核的连接状态。连接跟踪允许Netfilter识别数据包是否属于现有的连接(如NEW、ESTABLISHED、RELATED等)。
4.NAT(网络地址转换):Netfilter实现了源地址和目标地址转换功能,用于解决NAT和端口映射问题,常用于防火墙、路由器等网络设备。
5.扩展模块:Netfilter支持通过内核模块扩展功能,如不同类型的过滤匹配器、地址转换规则和日志功能。
数据包处理流程
当一个数据包通过Linux网络栈时,Netfilter在多个不同的钩子点对其进行处理。不同的钩子点负责不同阶段的数据包过滤和转发。Netfilter主要有以下五个钩子点:
1.PREROUTING:在数据包进入系统时立即处理,应用于所有入站数据包。在此阶段可以进行包过滤和网络地址转换(如DNAT)。
2.INPUT:当数据包目标地址是本地主机时,经过PREROUTING后会进入INPUT链。在此阶段,数据包可以被处理并交给本地进程。
3.FORWARD:如果数据包不是发给本机而是要转发给其他主机(路由功能),则进入FORWARD链。在这里可以对转发的数据包进行过滤。
4.OUTPUT:当主机本地生成数据包时,它会首先进入OUTPUT链,可以在此阶段进行数据包过滤和处理(如源地址转换)。
5.POSTROUTING:当数据包离开系统(即将发送到网络)时,会通过POSTROUTING链。在此阶段可以进行网络地址转换(如SNAT)。
连接跟踪(Connection Tracking)
连接跟踪模块是Netfilter的关键部分,帮助系统了解所有通过的网络连接的状态。每个连接的信息都存储在连接跟踪表中,表项包含以下几类状态:
NEW:表示一个新连接,通常是第一个数据包。
ESTABLISHED:表示连接已经建立,后续数据包会标记为已建立连接的数据包。
RELATED:与现有连接有关的连接(例如FTP的数据连接)。
INVALID:无法识别状态的数据包。
通过连接跟踪,Netfilter能够实现有状态防火墙,允许系统基于连接状态动态调整数据包处理规则。
NAT(网络地址转换)
Netfilter支持多种类型的NAT,主要包括以下两种:
SNAT(源网络地址转换):常用于出站连接,将本地网络的私有IP地址转换为公共IP地址。
DNAT(目标网络地址转换):常用于入站连接,将外部访问的公共IP地址映射到内部网络的私有IP地址。
NAT通常在PREROUTING和POSTROUTING链上进行处理,具体视具体的规则定义。
扩展模块
Netfilter支持通过内核模块扩展功能,例如:
MATCH模块:用于匹配特定的数据包属性(例如IP地址、端口号、协议类型等)。
TARGET模块:定义数据包匹配后如何处理(如ACCEPT、DROP、LOG、SNAT、DNAT等)。
LOG模块:允许将匹配的数据包信息写入系统日志,帮助进行网络排错和监控。
核心概念
钩子点(Hooks)
PREROUTING:数据包进入路由表之前。
INPUT:数据包通过路由表后,目的地为本机。
FORWARD:数据包通过路由表后,目的地不为本机。
OUTPUT:由本机产生的数据包。
POSTROUTING:数据包发送到网卡接口之前。
规则(Rules)
每条规则定义了数据包的匹配条件和相应的处理动作。匹配条件可以包括源 IP、目标 IP、端口等,而处理动作可以是接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)等。
链(Chains)
链是一个有序的规则列表。Netfilter中的每个钩子点都对应一个或多个链,数据包在通过钩子点时会依次匹配链中的规则。
表(Tables)
表是链的集合,用于分类管理不同类型的规则。常见的表包括:
filter表
- 用途:主要用于数据包过滤。
- 链:包含 INPUT、FORWARD和OUTPUT链。
- 说明:这是最常用的表,用于决定数据包是否被接受、丢弃或拒绝。
nat表
- 用途:用于网络地址转换(NAT)。
- 链:包含PREROUTING、POSTROUTING和OUTPUT链。
- 说明:用于修改数据包的源地址或目标地址,常用于端口转发和IP伪装。
mangle表
- 用途:用于修改数据包的内容。
- 链:包含PREROUTING、POSTROUTING、INPUT、OUTPUT和FORWARD链。
- 说明:可以用于修改数据包的 TOS 字段、标记数据包等。
raw表
- 用途:用于决定数据包是否被状态跟踪机制处理。
- 链:包含PREROUTING和OUTPUT链。
- 说明:主要用于关闭NAT表上的连接追踪机制。
security表
- 用途:用于强制访问控制(MAC)网络规则。
- 链:包含 INPUT、OUTPUT 和 FORWARD链。
- 说明:与安全模块(如 SELinux)集成,用于实施安全策略,目前不常用。
与用户空间工具的交互
Netfilter的规则和行为通过用户空间工具(如iptables和nftables)进行配置。这些工具在用户空间定义规则和表,并将这些配置传递到内核中的Netfilter框架。Netfilter在内核空间执行这些规则,对数据包进行过滤、转发、NAT和其他操作。
iptables:传统的用户空间工具,通过定义规则链来配置Netfilter的行为。
nftables:iptables的现代替代工具,具有更高效的规则管理和性能。
Iptables
iptables是Linux 中一个非常强大的工具,用于配置网络防火墙。它基于Netfilter框架工作,允许管理员设置规则来过滤和控制进出系统的数据包流量。iptables主要用于管理和控制Linux内核中的数据包过滤和网络地址转换(NAT)。下面是对iptables的使用示例
使用示例
查看当前规则
iptables -L
清空所有规则
iptables -F
保存恢复规则
iptables-save > /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4
允许HTTP(端口 80)和HTTPS(端口 443)的入站流量
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
将所有到达本机端口8080的流量转发到内部网络中的另一台机器(IP地址192.168.1.102
)的端口80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.102:80
iptables -t nat -A POSTROUTING -j MASQUERADE
语法规则
基本命令格式如下:
iptables [-t 表名] 命令选项 [链名选项] [条件匹配] [-j 目标动作]
其中表名可选项:
filter
:默认表,用于数据包过滤nat
:用于网络地址转换mangle
:用于修改数据包raw
:用于决定数据包是否被状态跟踪机制处理
命令选项:
-A
:追加一条规则到指定链的末尾-I
:插入一条规则到指定链的指定位置-D
:删除指定链中的一条规则-L
:列出指定链中的所有规则-F
:清空指定链中的所有规则-P
:设置指定链的默认策略-Z
:将指定链的所有计数器归零
链名选项:
INPUT
:处理进入本机的数据包FORWARD
:处理转发的数据包OUTPUT
:处理从本机发出的数据包PREROUTING
:处理刚到达的数据包POSTROUTING
:处理即将离开的数据包
目标动作:
ACCEPT
:允许数据包通过DROP
:丢弃数据包REJECT
:拒绝数据包并发送响应SNAT
:源地址转换DNAT
:目的地址转换
常见条件匹配:
-s
或--source
:源地址匹配,例如-s 192.168.1.1
-d
或--destination
:目的地址匹配,例如-d 192.168.1.1
-p
或--protocol
:协议匹配,例如-p tcp
或-p udp
--sport
或--source-port
:源端口匹配,例如--sport 80
--dport
或--destination-port
:目的端口匹配,例如--dport 80
-i
或--in-interface
:输入接口匹配,例如-i eth0
-o
或--out-interface
:输出接口匹配,例如-o eth0
-m
或--match
:指定扩展匹配模块,例如-m state --state NEW