1. 网络层数据流向与 Netfilter 体系
图 1-1 为网络层内核收发核心流程图,在函数流程图中我们可以看到 Netfliter 在其中的位置(图中深色底纹圆角矩形)。图中对应的 hook 点有 5 个,每个hook 点中保存一组按照优先级排序的函数列表:
-
NF_IP_PREROUTING:接收到的包进入协议栈后立即触发此hook中注册的对应函数列表,在进行任何路由判断 (将包发往哪里)之前; -
NF_IP_LOCAL_IN:接收到的包经过路由判断,如果目的是本机,将触发此hook中注册的对应函数列表; -
NF_IP_FORWARD:接收到的包经过路由判断,如果目的是其他机器,将触发此hook中注册的对应函数列表; -
NF_IP_LOCAL_OUT:本机产生的准备发送的包,在进入协议栈后立即触发此hook中注册的对应函数列表; -
NF_IP_POST_ROUTING:本机产生的准备发送的包或者转发的包,在经过路由判断之后, 将触发此hook中注册的对应函数列表;

network_l3_flow
图 1-1 网络层内核收发核心流程图
从图 1-1 的数据流分为三类,分别用不同的颜色标注,因此我们可以得知:
-
本地处理的数据包,在
Netfliter体系中会依次流经NF_IP_PREROUTING和NF_IP_LOCAL_IN; -
转发的数据包,在
Netfliter体系中会依次流经NF_IP_FORWARD和NF_IP_POST_ROUTING; -
本地发送的数据包,
在 Netfliter体系中会依次流经NF_IP_LOCAL_OUT和NF_IP_POST_ROUTING;
2. Netfilter 与 IPtables
2.1 Netfilter 数据结构
Netfilter 架构中对于 hook 点中注册的函数管理,采用二维数组的方式进行组织,纵轴为协议,横轴为 hook 点,每个 Network Namespace 对应一个此种格式的二维数组,详见图 2-1。数组中保存的为 nf_hook_entries 结构,对应保存了该 hook 点中注册的 hook 函数,函数按照优先级的方式进行管理,调用时也是按照优先级进行过滤。

netfilter_data_struct
其中 hooks_ipv4[NF_INET_NUMHOOKS] 位于 net->nf 变量中。 hook 函数的原型定义如下:
typedef unsigned int nf_hookfn(void *priv,
struct sk_buff *skb,
const struct nf_hook_state *state);
以 table nat 定义的 hook 函数为例, struct nf_hook_ops nf_nat_ipv4_ops 如下:
static const struct nf_hook_ops nf_nat_ipv4_ops[] = {
{
.hook = iptable_nat_do_chain, // 函数名
.pf = NFPROTO_IPV4, // 协议名
.hooknum = NF_INET_PRE_ROUTING, // hook 点
.priority = NF_IP_PRI_NAT_DST, // 优先级
},
{
.hook = iptable_nat_do_chain,
.pf = NFPROTO_IPV4,
.hooknum = NF_INET_POST_ROUTING,
.priority = NF_IP_PRI_NAT_SRC,
},
{
.hook = iptable_nat_do_chain,
.pf = NFPROTO_IPV4,
.hooknum = NF_INET_LOCAL_OUT,
.priority = NF_IP_PRI_NAT_DST,
},
{
.hook = iptable_nat_do_chain,
.pf = NFPROTO_IPV4,
.hooknum = NF_INET_LOCAL_IN,
.priority = NF_IP_PRI_NAT_SRC,
},
};
nf_nat_ipv4_ops 结构在函数 iptable_nat_table_init 中初始化,最终通过 nf_register_net_hook 函数注册到对应 hook 点的函数列表中。
2.2 iptabes
iptables 是运行在用户空间的应用软件,通过控制 Linux 内核 中 Netfilter 模块,来管理网络数据包的处理和转发。iptables 使用 table 来组织规则,根据用来做什么类型的判断标准,将规则分为不同 table,当前支持的 table 有 raw/mangle/nat/filter/security 等。在 table 内部采用链 (chain)进行组织,其中系统内置的 chain 与 Netfilter 中的 hook 点一一对应,例如 chain PREROUTING 对应于 NF_IP_PRE_ROUTING hook,用户自定义 chain 没有对应的 Netfilter hook 对

本文介绍了Linux内核中Netfilter框架在网络层的数据流向,详细解析了五个hook点的功能,并阐述了数据包如何在Netfilter体系中流转。接着,探讨了Netfilter的数据结构,特别是二维数组的组织方式以及hook函数的管理。iptables作为用户空间的应用,通过控制Netfilter管理网络流量。文章还分析了iptables与Netfilterhook点的关系,以及内核代码中ip_rcv函数的实现。最后,提到了使用eBPF技术跟踪Netfilterhook点的过滤结果,并给出了示例代码。通过这些,读者可以深入了解Linux网络包处理的底层机制。
最低0.47元/天 解锁文章
1404

被折叠的 条评论
为什么被折叠?



