摘要: 前置说明 本文例子中涉及两个模块hello.ko和world.ko,其中hello导出符号供world使用; insmod 该命令将模块的代码和数据装入内核,然后使用内核的符号表继续模块中任何未解析的符号。insmod不会修改模块的磁盘文件,而仅仅修改内存中的副本。insmod可以接受一些命令行选项 阅读全文
posted @ 2019-10-28 21:56 AlexAlex 阅读(1345) 评论(0) 推荐(1) 编辑
摘要: 典型的模块Makefile如下所示; 1 ifneq ($(KERNELRELEASE),) 2 obj-m := hello.o 3 else 4 KERNELDIR ?=/lib/modules/$(shell uname -r)/build 5 PWD :=$(shell pwd) 6 def 阅读全文
posted @ 2019-10-28 21:48 AlexAlex 阅读(741) 评论(0) 推荐(0) 编辑
摘要: 注册helper nf_conntrack_ftp_init是连接跟踪ftp模块的初始化函数,可以看到其调用了nf_conntrack_helpers_register来注册helper; 1 static int __init nf_conntrack_ftp_init(void) 2 { 3 i 阅读全文
posted @ 2019-10-28 21:45 AlexAlex 阅读(1646) 评论(0) 推荐(0) 编辑
摘要: 初始化 iptable_mangle_table_init函数通过调用ipt_register_table完成mangle表注册和钩子函数注册的功能;该流程与iptable_filter的函数调用的函数一致,此处不再重复分析,详情请移步<iptable_filter分析>; 1 static int 阅读全文
posted @ 2019-10-28 21:43 AlexAlex 阅读(795) 评论(0) 推荐(0) 编辑
摘要: 初始化 iptable_nat_table_init函数通过调用ipt_register_table完成NAT表注册和钩子函数注册的功能;该流程与iptable_filter的函数调用的函数一致,此处不再重复分析,详情请移步<iptable_filter分析>; 1 static int __net 阅读全文
posted @ 2019-10-28 21:41 AlexAlex 阅读(1525) 评论(0) 推荐(0) 编辑
摘要: ipv4_conntrack_defrag ipv4_conntrack_defrag对输入包进行检查,如果是分片包,则调用nf_ct_ipv4_gather_frags函数进行重组; 1 static unsigned int ipv4_conntrack_defrag(void *priv, 2 阅读全文
posted @ 2019-10-28 21:36 AlexAlex 阅读(1496) 评论(0) 推荐(0) 编辑
摘要: 基础参数初始化 nf_conntrack_init_start函数完成连接跟踪基础参数的初始化,包括了hash,slab,扩展项,GC任务等; 1 int nf_conntrack_init_start(void) 2 { 3 int max_factor = 8; 4 int ret = -ENO 阅读全文
posted @ 2019-10-28 21:33 AlexAlex 阅读(881) 评论(0) 推荐(0) 编辑
摘要: Netfilter通过连接跟踪来记录和跟踪连接的状态,为状态防火墙和NAT提供基础支持; 钩子点与钩子函数 下图为钩子点和钩子函数的关系图,其中ipv4_conntrack_defrag、ipv4_conntrack_in、ipv4_helper、ipv4_confirm为连接跟踪相关的钩子函数,其 阅读全文
posted @ 2019-10-28 21:30 AlexAlex 阅读(1000) 评论(0) 推荐(0) 编辑
摘要: 概述 本文主要对filter表的初始化流程,以及钩子函数的规则match流程的源码进行分析; 源码分析 所在钩子点: 1 /* 在LOCAL_IN,FORWARD, LOCAL_OUT钩子点工作 */ 2 #define FILTER_VALID_HOOKS ((1 << NF_INET_LOCAL 阅读全文
posted @ 2019-10-28 21:26 AlexAlex 阅读(1037) 评论(0) 推荐(0) 编辑
摘要: 概述 通过钩子点和优先级的代码追溯,得到如下对应关系图,图中横坐标为钩子点,纵坐标为优先级,每个钩子点上的钩子函数按照优先级排布; 详细分析 5个钩子点如下所示,在这个五个钩子点上的钩子函数按照上面的优先级从小到大排列; 1 /* IP Hooks */ 2 /* After promisc dro 阅读全文
posted @ 2019-10-28 21:21 AlexAlex 阅读(1030) 评论(0) 推荐(1) 编辑
摘要: 概述 本文主要分析table,rule,match,target的作用和其数据结构之间的关系,为后面的匹配流程做铺垫,通过本文中代码流程的分析,可以得到如下的关系图: 详细分析 table iptables分为五种: filter:This is the default table (if no - 阅读全文
posted @ 2019-10-28 21:20 AlexAlex 阅读(1144) 评论(0) 推荐(0) 编辑
摘要: 本篇主要从三层协议栈调用函数NF_HOOK说起,不断深入,分析某个钩子点中所有钩子函数的调用流程,但是本文不包含规则介绍和核心的规则匹配流程,后续文章将继续分析; NF_HOOK函数先调用了nf_hook继续执行调用钩子函数处理,处理之后,如果接受,则调用输入的回调函数okfn,继续数据包的下一步处 阅读全文
posted @ 2019-10-28 21:16 AlexAlex 阅读(3035) 评论(0) 推荐(0) 编辑
摘要: 通过注册流程代码的分析,能够明确钩子函数的注册流程,理解存储钩子函数的数据结构,如下图(点击图片可查看原图); 废话不多说,开始分析; nf_hook_ops是注册的钩子函数的核心结构,字段含义如下所示,一般待注册的钩子函数会组成一个nf_hook_ops数组,在注册过程中调用nf_register 阅读全文
posted @ 2019-10-28 21:14 AlexAlex 阅读(4040) 评论(0) 推荐(0) 编辑
摘要: 概述 在协议栈的三层IPv4(IPv6还没看,不清楚)数据包的处理过程中,可能经过Netfilter的五个钩子点,分别为NF_INET_PRE_ROUTING、NF_INET_LOCAL_IN、NF_INET_FORWARD、NF_INET_LOCAL_OUT、NF_INET_POST_ROUTIN 阅读全文
posted @ 2019-10-28 21:11 AlexAlex 阅读(4614) 评论(2) 推荐(4) 编辑
摘要: netlink的特点 netlink提供了一种在用户态和内核态之间进行数据传递的方式; (1) 是一种异步的通信机制,传递的数据会放在socket的缓存队列中; (2) 内核可以主动发送数据给用户空间; (3) 能够在内核模块中使用; (4) 支持组播; (5) 使用套接字编程; 测试例程 用户态例 阅读全文
posted @ 2019-10-28 20:50 AlexAlex 阅读(541) 评论(0) 推荐(0) 编辑
摘要: 概述 arp_process为ARP输入包的核心处理流程; 若输入为ARP请求且查路由成功,则进行如下判断:输入到本地,则进行应答;否则,允许转发,则转发,本文代码不包含转发流程; 若输入为ARP应答或者查路由失败,则更新邻居项; 源码分析 1 static int arp_process(stru 阅读全文
posted @ 2019-10-28 20:48 AlexAlex 阅读(1523) 评论(0) 推荐(0) 编辑
摘要: 概述 arp_rcv是ARP包的入口函数,ARP模块在二层注册了类型为ETH_P_ARP的数据包回调函数arp_rcv,当收到ARP包时,二层进行分发,调用arp_rcv; arp_rcv对ARP输入包的合法性进行检查,然后经过netfilter的ARP_IN钩子点,之后调用arp_process处 阅读全文
posted @ 2019-10-28 20:47 AlexAlex 阅读(1070) 评论(0) 推荐(0) 编辑
摘要: 概述 neigh_hh_output-缓存输出,直接拷贝二层头部,然后输出; neigh_connected_output-快速输出,用于连接状态的输出;需要重新构建二层头部,然后输出; neigh_resolve_output-慢速输出,用于非连接状态的输出;需要对邻居项状态进行检查,然后重新构造 阅读全文
posted @ 2019-10-28 20:45 AlexAlex 阅读(613) 评论(0) 推荐(0) 编辑
摘要: 概述 arp_solicit用来发送ARP请求,首先会根据ARP_ANNOUNCE参数来选取源地址,然后判断是否达到内核发送次数上限,未达到则调用内核arp_send_dst函数发送,如果达到上限,则继续判断是否达到应用程序请求发送次数上限,未达到则通知应用程序发送ARP请求; 源码分析 1 /* 阅读全文
posted @ 2019-10-28 20:45 AlexAlex 阅读(1490) 评论(0) 推荐(0) 编辑
摘要: 概述 在分配邻居子系统之后,会设置定时器来处理那些需要定时器处理的状态,定时器回调函数为neigh_timer_handler;函数会根据状态机变换规则对状态进行切换,切换状态后,如果需要更新输出函数则更新,并更新定时器下一次超时时间;其中NUD_INCOMPLETE | NUD_PROBE状态需要 阅读全文
posted @ 2019-10-28 20:44 AlexAlex 阅读(925) 评论(0) 推荐(0) 编辑