netfilter与iptables的基本原理
一、netfilter 与 iptables 简介
1. netfilter 是什么
Netfilter 自 1998 年开发,2000 年合并到 Linux Kernel v2.4 版本,是 Linux 内核提供的一个流量处理框架,用于实现对 IP 数据包的控制和过滤等功能。即:netfilter 是 Linux 内核自带的防火墙架构。
2. iptables 是什么
iptables 是位于用户空间的一个命令行工具,它作用于网络层,用于与内核的 netfilter 交互,相当于一个客户端代理,将用户设定的安全规则配置到 netfilter 中,进而实现对网络的控制、流量的转发。
二、netfilter 与网络协议栈的无缝契合
1. hook 点定义
Netfilter 是 Linux 2.4.x 引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的 hook 函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能。
网络通信的协议栈基本模式如下:
大致分为三个路线:
(1)接收数据:数据包入口 ——> A ——> 路由判决 ——> B ——> 上层协议;
(2)转发数据:数据包入口 ——> A ——> 路由判决 ——> C ——> E ——> 数据包出口;
(3)发送数据:上层协议 ——> 路由判决 ——> D ——> E ——> 数据包出口。
其中 A、B、C、D、E 五个关键点就是 netfilter 发挥作用的地方,netfilter 将它们重命名如下:
其它内核防火墙子模块可以向这些 hook 点注册处理函数,这样当数据包经过这些 hook 点时,其上注册的处理函数将被依次调用。这些钩子函数按功能可分为四大类:连接跟踪、数据包的过滤、网络地址转换(NAT)和数据包的修改。
Netfilter 提供了整个防火墙的框架,各个协议基于 Netfilter 框架来自己实现自己的防火墙功能。每个协议都有自己独立的表来存储自己的配置信息,他们之间完全独立的进行配置和运行。例如,链路层防火墙子模块 ebtables、ARP 防火墙子模块 arptables、网络层防火墙子模块 iptables 等。
2. 规则表
Linux 内核中维护了四张表,按优先级排序如下:。
(1)raw
(2)mangle
该表主要用于对数据包的修改,诸如修改数据包的 TOS、TTL 等字段。同时该表还会对数据包打上一些特殊的标签以便结合 TC 等工具,实现诸如 Qos 等功能。该表监视所有的 hook 点。
(3)nat
主要用于 DNAT 和 SNAT 和地址伪装等操作。用于修改数据包的源、目的地址。目前版本的内核中 nat 表监视四个 hook 点:NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN/OUT、NF_IP_POST_ROUTING。但在真正的实际应用中,我们一般仅需要在 nat 表的 PREROUTING 和 POSTROUTING 点上注册钩子函数。该表有个特性:只有新连接的第一个数据包会经过这个表,随后该连接的所有数据包将按照第一个数据包的处理动作做同样的操作,这种特性是由连接跟踪机制来实现的。
(4)filter
该表是整个过滤系统中真正起“过滤”作用的地方。所有对数据包的过滤工作都在这个表里进行,也就是说用户如果需要对某种类型的数据包进行过滤拦截,那么最好在这个表中进行操作。filter 表会在NF_IP_LOCAL_IN、NF_IP_FORWARD和NF_IP_LOCAL_OUT 三个 hook 点注册钩子函数,也就是说所有配置到 filer 表中的规则只可能在这三个过滤点上进行设置。
这些在用户空间所认为的“表”的概念,在内核中有的是以模块的形式存在,如 filter;有的是以子系统方式存在的,如 nat,但它们都具有“表”的性质。因此,内核在处理它们时有很大一部操作都是相同的,例如表的初始化数据、表的注册、钩子函数的注册等等。
各个规则表与网络通信协议栈的结合如下:
三、iptables 与 netfilter 的协作
1. iptables 与 netfilter 的通信
模块之间的关系及其通讯方式:
用户空间的 iptables 与内核的防火墙模块 ip_tables 通信,ip_tables 把自己所编写的一些钩子函数注册到 Netfilter 所监控的五个关键点,从而介入到对数据包的处理流程中。
2. iptables 命令解析
规则保存文件:/etc/sysconfig/iptables。
四、实验
下面对 iptables 命令进行实践,并通过 ping 与 tcpdump 验证结果。
tcpdump 对正常情况下 ping 的抓包结果如下:(从 30.102.72.32 ping 30.202.194.149)
1. 丢弃指定来源地址的数据包
在 30.102.72.32 设置丢弃来自 30.202.194.149 的数据包:
在 30.102.72.32 ping 30.202.194.149:
在 30.102.72.32 tcpdump 抓包如下:
tcpdump 抓包结果能完整看到请求包与回应包,但 ping 结果却是不通的,说明来自 30.202.194.149 的回应 icmp 数据包在传入应用层之前就被丢弃了。
2. 丢弃去往目的地址的流量
在 30.102.72.32 设置丢弃发送给 30.202.194.149 的数据包:
在 30.102.72.32 ping 30.202.194.149:
在 30.102.72.32 tcpdump 抓包如下:
ping 发出的数据包被丢弃了。
3.SNAT
在 30.102.72.32 设置规则,发出数据包之前,将来源 IP 改为 30.102.100.100:
在 30.102.72.32 ping 30.202.194.149:
在 30.102.72.32 tcpdump 抓包如下:
只看到请求数据包,未看到回复数据包。
在 30.202.194.149 tcpdump 抓包如下:
能完整看到请求包与回应包,但由于回应数据包的目的地址错了(被改了),所以 30.102.72.32 无法收到回应数据包,ping 的结果也就不通。
参考: