Netlter 架构基本数据流程
一、netfiltert 简介
Linux 内核中的 netfilter 架构有以太网层 netfilter,主要管理工具为 ebtables,有网络层的
netfilter,主要管理工具为 iptables,本文主要从总体上讲述网络层 ipv4 netfilter 架构中的基
本数据流程,即一个数据所从进入网络层 netfiler 架构时,其数据流向是怎样的,经过哪些
规则表,连接跟踪等,到离开 netfilter 架构整个流程。Netfilter 为内核中实现防火墙功能、
数据包过滤、修改、连接跟踪、应用层网关 alg 等的载体。而 linux 应用层则提供了 iptables
这样功能强大的实现 netfilter 功能的配置管理工具。
二、 Iptables 规则在内核中的基本流程
数据包进入 linux 内核的网络层时,其总入口为 kernel/linux/net/ipv4/ip_input.c 的函数
ip_rcv(),在对数据包进行正确性检查和校验之后,路由判断之前,会进入到一个 netfilter
的钩子 NF_INET_PRE_ROUTING,数据包在这个钩子里进行一些处理,处理完之后,如
果是接收包,则调用该钩子的 ok 函数,即下一步的处理函数。对于 iptables 来说,这里是
PREROUTING 规则链,能在这里设置 iptables 规则的只有 mangle 表和 nat 表,mangle 表主
要是对数据包打标记等操作。而 nat 表主要对数据包进行重定向,丢弃或接收数据包。
注意 mangle 表比 nat 表优先级高,所以在内核中会先处理 mangle 表的规则,然后再处理
nat 表的规则。
当路由判定后决定数据包是发往本地即 Linux 系统本身的,则其入口为 kernel/linux/
net/ipv4/ip_input.c 的函数 ip_local_deliver(),在这个函数最后会调用 INPUT 链的钩子函数
NF_INET_LOCAL_IN,在这个钩子中可以设置 mangle 表和 filter 表的规则,mangle 表比
filter 表优先级要高,filter 表的主要作用是过滤数据包。
而当路由判定后数据包是发往其他主机的,则进入到 kernel/linux/net/ipv4/ip_forward.c
的函数 ip_forward(),在函数最后同样要执行 NF_INET_FORWARD 这个钩子函数,在
FORWARD 链里,同样只能设置 mangle 表和 filter 表的规则,mangle 表的优先级比 filter 表
高。
数 据 包 由 本 地 发 出 的 时 候 , 执 行 到 kernel/linux/net/ipv4/ip_output.c 的 函 数
__ip_local_out(),在这里会执行钩子函数 NF_INET_LOCAL_OUT,在 OUTPUT 链里可以
有 mangle 表、nat 表、filter 表的规则,优先级分别为 mangle 表到 nat 表再到 filter 表。
数据包在离开本机之前会调用到 kernel/linux/net/ipv4/ip_output.c 的函数 ip_output(),这
里执行的是 NF_INET_POST_ROUTING 钩子函数,在这个钩子里只能有 mangle 和 nat 表,
而 mangle 表比 nat 表优先级高。
如下图为 netfilter 中 iptables 规则执行的基本流程
评论0