如何理解Netfilter中的连接跟踪机制? 本篇我打算以一个问句开头,因为在知识探索的道路上只有多问然后充分调动起思考的机器才能让自己走得更远.连接跟踪定义很简单:用来记录和跟踪连接的状态. 问:为什么又需要连接跟踪功能呢? 答:因为它是状态防火墙和NAT的实现基础. OK,算是明白了.Neftiler为了实现基于数据连接状态侦测的状态防火墙功能和NAT地址转换功能才开发出了连接跟踪这套机制.那就意思是说:如果编译内核时开启了连接跟踪选项,那么Linux系统就会为它收到的每个数据包维持一个连接…
conntrack hook函数分析 enum nf_ip_hook_priorities { NF_IP_PRI_FIRST = INT_MIN, NF_IP_PRI_CONNTRACK_DEFRAG = -400//优先级最大, 涉及到ip 分片重组 NF_IP_PRI_RAW = -300, NF_IP_PRI_SELINUX_FIRST = -225, NF_IP_PRI_CONNTRACK = -200, NF_IP_PRI_MANGLE = -150, NF_IP_PRI_NAT_D…
PRE_ROUTING和LOCAL_OUT点可以看作是整个netfilter的入口,而POST_ROUTING和LOCAL_IN可以看作是其出口; 报文到本地:PRE_ROUTING----LOCAL_IN---本地进程 需要本机转发的数据包:PRE_ROUTING---FORWARD---POST_ROUTING---外出 从本机发出的数据包:LOCAL_OUT----POST_ROUTING---外出 数据包文到达内核协议栈时,使用sk_buff{}(即skb),其类型为struct nf_…
连接跟踪初始化 基础参数的初始化:nf_conntrack_standalone_init 会调用nf_conntrack_init_start 完成连接跟踪基础参数的初始化, hash slab 扩展项 等: nf_conntrack_l3proto_ipv4_init 函数初始化了协议和tuple操作函数的相关初始化: static int ipv4_net_init(struct net *net) { int ret = 0; /* 注册了和 IPv4 相关的几个 4 层 TCP.UDP…
Netfilter之连接跟踪实现机制初步分析 原文: http://blog.chinaunix.net/uid-22227409-id-2656910.html 什么是连接跟踪 连接跟踪(CONNTRACK),顾名思义,就是跟踪并且记录连接状态.Linux为每一个经过网络堆栈的数据包,生成一个新的连接记录项(Connection entry).此后,所有属于此连接的数据包都被唯一地分配给这个连接,并标识连接的状态.连接跟踪是防火墙模块的状态检测的基础,同时也是地址转换中实现SNAT和DNAT的…
linux内核netfilter连接跟踪的hash算法 linux内核中的netfilter是一款强大的基于状态的防火墙,具有连接跟踪(conntrack)的实现.conntrack是netfilter的核心,许多增强的功能,例如,地址转换(NAT),基于内容的业务识别(l7, layer-7 module)都是基于连接跟踪.然而,netfilter的性能还有很多值得改进的地方. netfilter的连接跟踪的hash算法是在Bob Jenkins的lookup2.c基础上的改进实现,Bob J…
作者: eaglet 转载请注明出处 .net 中通过 SqlConnection 连接 sql server,我们会发现第一次连接时总是很耗时,但后面连接就很快,这个其实和SqlConnection 的连接池机制有关,正确的理解这个连接池机制,有助于我们编写高效的数据库应用程序. 很多人认为 SqlConnection 的连接是不耗时的,理由是循环执行 SqlConnection.Open 得到的平均时间几乎为0,但每次首次open 时,耗时又往往达到几个毫秒到几秒不等,这又是为什么呢? 首先…
注册helper nf_conntrack_ftp_init是连接跟踪ftp模块的初始化函数,可以看到其调用了nf_conntrack_helpers_register来注册helper: static int __init nf_conntrack_ftp_init(void) { ; NF_CT_HELPER_BUILD_BUG_ON(sizeof(struct nf_ct_ftp_master)); ftp_buffer = kmalloc(, GFP_KERNEL); if (!ftp_…
ipv4_conntrack_defrag ipv4_conntrack_defrag对输入包进行检查,如果是分片包,则调用nf_ct_ipv4_gather_frags函数进行重组: static unsigned int ipv4_conntrack_defrag(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) { struct sock *sk = skb->sk; if (sk && sk…
基础参数初始化 nf_conntrack_init_start函数完成连接跟踪基础参数的初始化,包括了hash,slab,扩展项,GC任务等: int nf_conntrack_init_start(void) { ; int ret = -ENOMEM; int i; /* struct nf_ct_ext uses u8 to store offsets/size */ BUILD_BUG_ON(total_extension_size() > 255u); seqcount_init(&…