netfilter
netfilter 是 linux 内置的一种防火墙机制,我们一般也称之为数据包过滤机制。iptables 则是一个命令行工具,用来配置 netfilter 防火墙。
本文我们将以该拓扑结构介绍 netfilter/iptables 防火墙中的基本概念和主要功能。
netfilter 与 iptables 的关系
netfilter 在协议栈中添加了一些钩子,它允许内核模块通过这些钩子注册回调函数,这样经过钩子的所有数据包都会被注册在相应钩子上的函数所处理,包括修改数据包内容、给数据包打标记或者丢掉数据包等。netfilter 框架负责维护钩子上注册的处理函数或者模块,以及它们的优先级。netfilter 框架负责在需要的时候动态加载其它的内核模块,比如 ip_conntrack、nf_conntrack、NAT subsystem 等。
iptables 是运行在用户态的一个程序,通过 netlink 和内核的 netfilter 框架打交道,并负责往钩子上配置回调函数。
Linux 上最常用的防火墙工具是 iptables。Iptables 与协议栈内有包过滤功能的 hook 交互来完成工作。这些内核 hook 构成了 netfilter 框架。
每个进入网络系统的包(接收或发送)在经过协议栈时都会触发这些 hook,程序可以通过注册 hook 函数的方式在一些关键路径上处理网络流量。Iptables 相关的内核模块在这些 hook 点注册了处理函数,因此可以通过配置 iptables 规则来使得网络流量符合防火墙规则。
Netfilter Hooks
5 个 hook 点
Netfilter 提供了 5 个 hook 点。包经过协议栈时会触发内核模块注册在这里的处理函数 。触发哪个 hook 取决于包的方向(是发送还是接收)、包的目的地址、以及包在上一个 hook 点是被丢弃还是拒绝等等。
如上图所示,Netfilter 在内核协议栈的包处理路径上提供了 5 个 hook 点,分别是:
|
|
另外还有一套 NF_INET_ 开头的定义,include/uapi/linux/netfilter.h。这两套是等价的,从注释看,NF_IP_ 开头的定义可能是为了保持兼容性。
|
|
Hook 返回值类型
Hook 函数对包进行判断或处理之后,需要返回一个判断结果,指导接下来要对这个包做什么,可能的结果有:
|
|
Hook 优先级
每个 hook 点可以注册多个处理函数。在注册时必须指定这些 handlers 的优先级,这样触发 hook 时能够根据优先级依次调用处理函数。这使得多个模块(或者同一内核模块的多个实例)可以在同一 hook 点注册,并且有确定的处理顺序。内核模块会依次被调用,每次返回一个结果给 netfilter 框架,提示该对这个包做什么操作。
参考资料
- A Deep Dive into Iptables and Netfilter Architecture
- https://netfilter.org
- TCP/IP Architecture, Design and Implementation in Linux:Chapter 16
-
No backlinks found.