随笔分类 -  Linux内核协议栈

摘要: 阅读全文
posted @ 2019-10-30 14:58 AlexAlex 阅读(869) 评论(0) 推荐(1) 编辑
摘要:注册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 阅读(1741) 评论(0) 推荐(0) 编辑
摘要:初始化 iptable_mangle_table_init函数通过调用ipt_register_table完成mangle表注册和钩子函数注册的功能;该流程与iptable_filter的函数调用的函数一致,此处不再重复分析,详情请移步<iptable_filter分析>; 1 static int 阅读全文
posted @ 2019-10-28 21:43 AlexAlex 阅读(849) 评论(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 阅读(1593) 评论(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 阅读(1603) 评论(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 阅读(952) 评论(0) 推荐(0) 编辑
摘要:Netfilter通过连接跟踪来记录和跟踪连接的状态,为状态防火墙和NAT提供基础支持; 钩子点与钩子函数 下图为钩子点和钩子函数的关系图,其中ipv4_conntrack_defrag、ipv4_conntrack_in、ipv4_helper、ipv4_confirm为连接跟踪相关的钩子函数,其 阅读全文
posted @ 2019-10-28 21:30 AlexAlex 阅读(1093) 评论(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 阅读(1095) 评论(0) 推荐(0) 编辑
摘要:概述 通过钩子点和优先级的代码追溯,得到如下对应关系图,图中横坐标为钩子点,纵坐标为优先级,每个钩子点上的钩子函数按照优先级排布; 详细分析 5个钩子点如下所示,在这个五个钩子点上的钩子函数按照上面的优先级从小到大排列; 1 /* IP Hooks */ 2 /* After promisc dro 阅读全文
posted @ 2019-10-28 21:21 AlexAlex 阅读(1073) 评论(0) 推荐(1) 编辑
摘要:概述 本文主要分析table,rule,match,target的作用和其数据结构之间的关系,为后面的匹配流程做铺垫,通过本文中代码流程的分析,可以得到如下的关系图: 详细分析 table iptables分为五种: filter:This is the default table (if no - 阅读全文
posted @ 2019-10-28 21:20 AlexAlex 阅读(1208) 评论(0) 推荐(0) 编辑
摘要:本篇主要从三层协议栈调用函数NF_HOOK说起,不断深入,分析某个钩子点中所有钩子函数的调用流程,但是本文不包含规则介绍和核心的规则匹配流程,后续文章将继续分析; NF_HOOK函数先调用了nf_hook继续执行调用钩子函数处理,处理之后,如果接受,则调用输入的回调函数okfn,继续数据包的下一步处 阅读全文
posted @ 2019-10-28 21:16 AlexAlex 阅读(3269) 评论(0) 推荐(0) 编辑
摘要:通过注册流程代码的分析,能够明确钩子函数的注册流程,理解存储钩子函数的数据结构,如下图(点击图片可查看原图); 废话不多说,开始分析; nf_hook_ops是注册的钩子函数的核心结构,字段含义如下所示,一般待注册的钩子函数会组成一个nf_hook_ops数组,在注册过程中调用nf_register 阅读全文
posted @ 2019-10-28 21:14 AlexAlex 阅读(4266) 评论(0) 推荐(1) 编辑
摘要:概述 在协议栈的三层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 阅读(5117) 评论(2) 推荐(4) 编辑
摘要:概述 arp_process为ARP输入包的核心处理流程; 若输入为ARP请求且查路由成功,则进行如下判断:输入到本地,则进行应答;否则,允许转发,则转发,本文代码不包含转发流程; 若输入为ARP应答或者查路由失败,则更新邻居项; 源码分析 1 static int arp_process(stru 阅读全文
posted @ 2019-10-28 20:48 AlexAlex 阅读(1596) 评论(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 阅读(1106) 评论(0) 推荐(0) 编辑
摘要:概述 neigh_hh_output-缓存输出,直接拷贝二层头部,然后输出; neigh_connected_output-快速输出,用于连接状态的输出;需要重新构建二层头部,然后输出; neigh_resolve_output-慢速输出,用于非连接状态的输出;需要对邻居项状态进行检查,然后重新构造 阅读全文
posted @ 2019-10-28 20:45 AlexAlex 阅读(644) 评论(0) 推荐(0) 编辑
摘要:概述 arp_solicit用来发送ARP请求,首先会根据ARP_ANNOUNCE参数来选取源地址,然后判断是否达到内核发送次数上限,未达到则调用内核arp_send_dst函数发送,如果达到上限,则继续判断是否达到应用程序请求发送次数上限,未达到则通知应用程序发送ARP请求; 源码分析 1 /* 阅读全文
posted @ 2019-10-28 20:45 AlexAlex 阅读(1537) 评论(0) 推荐(0) 编辑
摘要:概述 在分配邻居子系统之后,会设置定时器来处理那些需要定时器处理的状态,定时器回调函数为neigh_timer_handler;函数会根据状态机变换规则对状态进行切换,切换状态后,如果需要更新输出函数则更新,并更新定时器下一次超时时间;其中NUD_INCOMPLETE | NUD_PROBE状态需要 阅读全文
posted @ 2019-10-28 20:44 AlexAlex 阅读(983) 评论(0) 推荐(0) 编辑
摘要:概述 neigh_update函数用来更新指定的邻居项,更新内容是硬件地址和状态,更新之后,会根据新状态设置其输出函数,CONNECTED状态则使用快速输出,否则使用慢速输出;如果是由原来的无效状态变为现在的有效状态,则需要将数据包缓存队列中的数据包发送出去; 该函数在邻居子系统中被频繁调用;arp 阅读全文
posted @ 2019-10-28 20:42 AlexAlex 阅读(1302) 评论(0) 推荐(0) 编辑
摘要:概述 邻居项查找是通过neigh_lookup相关函数来进行的; ___neigh_lookup_noref,该函数根据输出设备和主键值(IPv4为下一跳ip地址)在邻居项hash表中查找,找到则返回该项; neigh_lookup,该函数调用了___neigh_lookup_noref函数,并且在 阅读全文
posted @ 2019-10-28 20:41 AlexAlex 阅读(1625) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示