Linux Netfilter代码分析
文章平均质量分 79
基于linux 2.6.25,分析了Netfilter子系统的核心代码实现。包括Netfilter框架部分,以及基于Netfilter框架的防火墙子系统(以AF_INET为例)、连接跟踪子系统(以AF_INET为例),以及基于连接跟踪子系统实现的SNAT和DNAT。
fanxiaoyu321
天道酬勤
展开
-
Netfilter之框架初始化与对外接口
从Makefile中也可以看的出来,Netfilter框架的核心功能由如下几个文件实现:netfilter-objs := core.o nf_log.o nf_queue.o nf_sockopt.oobj-$(CONFIG_NETFILTER) = netfilter.o其中core.c文件又是重中之重。1. 数据结构1.1 nf_hooks这是一个二维数组,数组元素就是链表元...原创 2019-03-24 13:36:48 · 1175 阅读 · 0 评论 -
Netfilter之table、rule、match、target数据结构
表、规则、匹配和target在内核中都有其对应的数据结构,在理解内核的逻辑代码之前,非常有必要先熟悉这些数据结构,以及它们之间的关系。如标题,这篇笔记记录的内容针对的是PF_INET协议族,对于PF_INET6,相同概念对应的数据结构并不相同。数据结构struct net如下,每个协议族有一个自己的链表,用来组织该协议族的表。struct net {...#ifdef CONFIG_...原创 2019-03-24 23:53:43 · 1364 阅读 · 0 评论 -
Netfilter之table、rule、match、target的组织管理
在上一篇笔记Netfilter之table、rule、match、target数据结构中,看到了内核对这些对象的定义,这篇笔记记录了内核对这些数据结构的组织,以及一些相关的核心函数分析。设计的代码文件主要有:代码路径说明/net/netfilter/x_tables.cnetfilter框架对table、match、target的核心实现1. table的管理如下,...原创 2019-05-26 00:16:38 · 990 阅读 · 0 评论 -
Netfilter之协议族初始化--AF_INET
这篇笔记开始我们来看看PF_INET协议族是如何使用Netfilter框架的。搜索源码中PF_INET协议族调用nf_register_hooks()的地方,会看到三个熟悉的东西:iptables_filter.c、iptables-mangle.c、iptables-raw.c,它们就是iptables中filter表、mangle表和raw表的内核实现,这三个文件分别由开关CONFIG_IP...原创 2019-05-26 11:55:10 · 587 阅读 · 0 评论 -
Netfilter之AF_INET协议族rule、match、target
在笔记Netfilter之table、match、target中,有看到框架对table、match、target的定义,分别是struct xt_table、struct xt_match和struct xt_target。如果要扩展match和target,只需要实现对应的结构,然后将其注册给Netfilter框架即可被用户态程序使用(当然也需要扩展用户态的iptables工具)。这些并不是...原创 2019-03-31 00:36:41 · 491 阅读 · 0 评论 -
防火墙之filter表(一)---AF_INET协议族
在Netfilter中,各个table、match和target都是以模块形式存在的。这篇笔记以AF_INET协议族的filter表为例,看看各个协议族是如何与Netfilter框架配合,实现table的。1. 初始化AF_INET协议族的filter表的实现模块是/net/ipv4/netfilter/iptable_filter.c,其初始化函数如下:static int __net_i...原创 2019-03-30 00:07:55 · 1548 阅读 · 0 评论 -
防火墙之filter表(二)---AF_INET协议族
继上一篇笔记Netfilter之filter表(一),这篇笔记来看看AF_INET协议族的filter表的钩子的注册,以及防火墙检查时规则的遍历。1. HOOK的注册static int __init iptable_filter_init(void){... /* Register hooks */ ret = nf_register_hooks(ipt_ops, ARRAY_SIZ...原创 2019-03-31 00:29:26 · 937 阅读 · 0 评论 -
Netfilter之协议族与用户空间接口--AF_INET
在笔记Netfilter之协议族初始化–AF_INET中,有看到在AF_INET的初始化过程中,有向Netfilter框架注册setsockopt()/getsockopt()接口,这是AF_INET协议族和用户空间相关程序(如iptables)沟通的接口,这篇笔记就来看看这组接口的实现。涉及的代码文件主要是:代码路径说明net/ipv4/netfilter/ip_table...原创 2019-05-26 12:04:30 · 509 阅读 · 0 评论 -
连接跟踪子系统之初始化
这篇笔记记录了连接跟踪子系统框架部分的初始化过程,涉及的核心代码文件有:代码路径说明net/netfilter/nf_conntrack_standalone.c连接跟踪子系统的启动文件net/netfilter/nf_conntrack_core.c连接跟踪子系统框架的核心实现初始化入口:nf_conntrack_standalone_init()stat...原创 2019-04-21 21:03:23 · 536 阅读 · 0 评论 -
连接跟踪子系统之核心数据结构
相关代码文件:代码路径说明includde/net/netfilter/nf_conntrack_tuple.htuple结构的定义net/netfilter/nf_conntrack_core.c连接跟踪子系统框架代码的实现文件struct nf_conntrack_tuple每个连接都需要有个标识,就像TCP的五元组一样,连接跟踪子系统中,每条连接是由两...原创 2019-04-06 23:24:40 · 849 阅读 · 0 评论 -
连接跟踪子系统之L3L4协议管理
这篇笔记记录了连接跟踪子系统框架对L3和L4协议的管理,核心代码涉及如下文件:代码路径说明net/netfilter/nf_conntrack_l3proto.c对L3和L4协议的管理include/net/netfilter/nf_conntrack_l3proto.hL3协议相关数据结构定义include/net/netfilter/nf_conntrac...原创 2019-04-05 19:47:32 · 1066 阅读 · 0 评论 -
连接跟踪子系统之AF_INET初始化
初始化static int __init nf_conntrack_l3proto_ipv4_init(void){ int ret = 0; need_conntrack(); //向Netfilter框架注册xxx_sock_opt()接口 ret = nf_register_sockopt(&so_getorigdst); if (ret < 0) { pr...原创 2019-04-05 23:05:10 · 658 阅读 · 0 评论 -
连接跟踪子系统之AF_INET协议族钩子函数
这篇笔记来看看AF_INET协议族的连接跟踪模块在入口处的处理逻辑,即PRE_ROUTING和LOCAL_IN两个HOOK点的处理,如前面的笔记所示,连接跟踪在这两个HOOK点共有四个钩子函数,PRE_ROUTING的两个钩子分别是ipv4_conntrack_defrag()和ipv4_conntrack_in(),LOCAL_OUT的两个钩子分别是ipv4_conntrack_defrag()...原创 2019-04-06 23:13:46 · 516 阅读 · 2 评论 -
连接跟踪子系统之核心实现
这篇笔记分析了连接跟踪子系统框架部分的核心代码实现,涉及文件主要有:代码路径说明net/netfilter/nf_conntrack_core.c连接跟踪子系统框架代码的实现文件连接跟踪入口: nf_conntrack_in()数据包skb就是通过该函数进入连接跟踪子系统的,对于发送报文,从LOCAL_OUT点进入,对于接收报文,从PRE_ROUTING点进入。u...原创 2019-04-06 23:08:24 · 1068 阅读 · 0 评论 -
连接跟踪子系统之L4协议---udp
在前面的笔记中有看到,连接跟踪子系统框架只是提供了一种连接的抽象,并且为跟踪一个连接在数据包的传输路径上提供了一种通用的拦截方法,但是要想真正的完成连接的跟踪,还需要具体L3和L4协议的参与,之前的笔记已经详细分析了AF_INET协议族的L3协议ipv4具体是如何实现连接跟踪的,这篇笔记以udp协议为例来看看L4协议是如何和连接跟踪子系统框架配合的。之所以选udp,是因为它足够简单,便于理解,后...原创 2019-04-07 21:04:14 · 1276 阅读 · 0 评论 -
连接跟踪子系统之helper
在Netfilter之AF_INET协议族连接跟踪子系统钩子函数中有看到,在Netfilter子系统的出口,第一个钩子是ipv4_conntrack_help()(以AF_INET协议族为例),之后才是对新连接的确认钩子。并且help钩子的逻辑就是调用连接跟踪信息块中的help()回调函数。这篇笔记就来看看Netfilter子系统对helper模块的管理,相关代码文件为:代码路径说明...原创 2019-04-13 11:13:13 · 1761 阅读 · 1 评论 -
连接跟踪子系统之extend
NAT和状态防火墙是基于连接跟踪的,但是在数据结构在连接跟踪信息块struct nf_conn的定义中,有一个ct_ext字段,如下:struct nf_conn{ ... struct nf_ct_ext *ext; struct rcu_head rcu;};struct nf_ct_ext连接跟踪信息块中用该结构来表示扩展信息。/* Extensions: optio...原创 2019-04-21 16:19:23 · 1090 阅读 · 0 评论 -
连接跟踪子系统之helper---ftp
这篇笔记以ftp协议为例,看看应用层协议要想支持连接跟踪子系统应该如何做。这篇笔记还涉及到了helper模块和期望连接。相关代码文件如下:代码路径说明net/netfilter/nf_conntrack_ftp.c连接跟踪子系统中ftp协议的实现ftp协议的连接跟踪是由开关CONFIG_NF_CONNTRACK_FTP控制的。...原创 2019-04-14 22:52:50 · 895 阅读 · 0 评论 -
连接跟踪子系统之期望连接
这篇笔记记录了连接跟踪子系统中期望连接相关的内容,这部分内容比较抽象,自己目前也只是基于ftp协议的使用来理解的,对于其它应用场景尚未接触过,尚不理解。期望连接相关代码文件有:代码路径说明/net/netfilter/nf_conntrack_expect.c期望连接子模块实现文件1. 期望连接跟踪信息块期望连接跟踪信息块用struct nf_conntrack_e...原创 2019-05-01 13:19:12 · 1580 阅读 · 0 评论