Linux系统中Netfilter提供了个抽象、通用化框架该框架定义个子功能实现就是包过滤子系统框架包含以下 5部分:
1. 为每种网络协议(IPv4、IPv6等)定义套钩子(IPv4定义了5个钩子), 这些钩子在数据报流过协议栈几个关键点被在这几个点中协议栈将把数据报及钩子标号作为参数Netfilter框架
2. 内核任何模块可以对每种协议个或多个钩子进行注册实现挂接这样当某个数据包被传递给Netfilter框架时内核能检测是否有任何模块对该协议和钩子进行了注册若注册了则该模块注册时使用回调这样这些模块就有机会检查(可能还会修改)该数据包、丢弃该数据包及指示Netfilter将该数据包传入用户空间队列
3 .那些排队数据包是被传递给用户空间异步地进行处理个用户进程能检查数据包修改数据包甚至可以重新将该数据包通过离开内核同个钩子中注入到内核中
4. 任何在IP层要被抛弃IP数据包在真正抛弃的前都要进行检查例如允许模块检查IP-Spoofed包(被路由抛弃)
5.IP层 5个HOOK点位置如下所示:
(1)NF_IP_PRE_ROUTING:刚刚进入网络层数据包通过此点(刚刚进行完版本号校验 和等检测)源地址转换在此点进行;IP_Input.c中IP_Rcv;
(2)NF_IP_LOCAL_IN:经路由查找后送往本机通过此检查点INPUT包过滤在此点进行IP_local_deliver中;
(3)NF_IP_FORWARD:要转发包通过此检测点FORWORD包过滤在此点进行;
(4)NF_IP_POST_ROUTING:所有马上便要通过网络设备出去包通过此检测点内置目地址转换功能(包括地址伪装)在此点进行;
(5)NF_IP_LOCAL_OUT:本机进程发出包通过此检测点OUTPUT包过滤在此点进行
这些点是已经在内核中定义好内核模块能够注册在这些HOOK点进行处理可使用nf_register_hook指定在数据报经过这些钩子时被从而模块可以修改这些数据报并向Netfilter返回如下值:
包过滤 Filter表格不会对数据报进行修改而只对数据报进行过滤IPtables优于IPchains个方面就是它更为小巧和快速它是通过钩子NF_IP_LOCAL_IN、NF_IP_FORWARD及NF_IP_LOCAL_OUT接入Netfilter框架因此对于任何个数 报只有个地方对其进行过滤这相对IPchains来说是个巨大改进在IPchains中个被转发数据报会遍历 3条链 NAT NAT表格监听 3个Netfilter钩子:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT NF_IP_PRE_ROUTING实现对需要转发数据报源地址进行地址转换而NF_IP_POST_ROUTING则对需要转发数据包目地址进行地址转换对于本地数据报目地址转换则由NF_IP_LOCAL_OUT来实现NAT表格区别于filter表格只有新连接第个数据报将遍历表格而随后数据报将根据第个数据报结果进行同样转换处理NAT表格被用在源NAT、目NAT伪装(其是源NAT个特例)及透明代理(其是目NAT个特例) 数据报处理(Packet Mangling) Mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT钩子中进行注册使用 mangle表可以实现对数据报修改或给数据报附上些带外数据当前mangle表支持修改TOS位及设置skbnfmard字段 源码分析 如果我们想加入自己代码便要用nf_register_hook其原型为:
我们工作便是生成个struct nf_hook_ops结构例子并用nf_register_hook将其HOOK上其中list项我们总要化为{NULL,NULL};由于般在IP层工作pf总是PF_INET;hooknum就是我们选择HOOK点;个HOOK点可能挂多个处理谁先谁后便要看优先级即priority指定了Netfilter_IPv4.h中用个枚举类型指定了内置处理优先级:
Hook是提供处理也就是我们主要工作其原型为:
它 5个参数将由NFHOOK宏传进去nf_register_hook根据reg中注册协议簇类型和优先级在nf_hooks中找到相应位置并插入到此表中_hooks[NPROTO][NF_MAX_HOOKS]在Netfilter化时(Netfilter_init/Netfilter.c而它在sock_init时)已经为个空表 例如IPtable在化时(init/IPtable_filter.c)nf_register_hook注册他hook
mangle在init/IPtable_mangle.c中注册它自己hook
NAT在init/IP_nat_standalone.c中注册它自己hook
最新评论