1.2.6内核的netfilter与2.4的有很大不同:

ChangeLog-2.6.15 中有下面这样的描述:
commit 9fb9cbb1082d6b31fb45aa1a14432449a0df6cf1
Author: Yasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Date:   Wed Nov 9 16:38:16 2005 -0800     [NETFILTER]: Add nf_conntrack subsystem.
   
    The existing connection tracking subsystem in netfilter can only
    handle ipv4.  There were basically two choices present to add
    connection tracking support for ipv6.  We could either duplicate all
    of the ipv4 connection tracking code into an ipv6 counterpart, or (the
    choice taken by these patches) we could design a generic layer that
    could handle both ipv4 and ipv6 and thus requiring only one sub-protocol
    (TCP, UDP, etc.) connection tracking helper module to be written.
   
    In fact nf_conntrack is capable of working with any layer 3
    protocol.
 
即2.6中的netfilter将支持任何3层协议,而原来的ip_conntrack将是它的一个子集。

2.2.6中netfilter目录结构分析

net\netfilter目录:新增netfilter

net\ipv4\netfilter目录:ipv4的netfilter

net\ipv6\netfilter目录:ipv6的netfilter

2.2.6内核netfilter提供的功能

² 支持netfilter的sockopt: 只有getsockopt操作;通过nf_register_sockopt进行注册;

²

以下 以ipv4进行分析

3.Conntrack Hook函数的注册位置:nf_conntrack_l3proto_ipv4.c文件

Nat Hook函数的注册位置:nf_nat_standalone.c文件

4.进入PREROUTING,

入口函数ipv4_conntrack_in(ipv4_conntrack_defrag只是重组报文,非此处重点,故忽略之)直接调用nf_conntrack_in(PF_INET, hooknum, pskb):

² 调用l3proto = __nf_ct_l3proto_find((u_int16_t)pf);,得到3层协议指针:nf_conntrack_l3proto_ipv4;

² 调用l3proto->prepare(ipv4_prepare),得到skb的4层协议和数据字段偏移量;

² 调用l4proto = __nf_ct_l4proto_find((u_int16_t)pf, protonum);,得到4层协议指针:

nf_conntrack_l4proto_tcp4 或 nf_conntrack_l4proto_udp4,……

以下 以 nf_conntrack_l4proto_tcp4为分析对象

² 调用l4proto->error,对报文进行校验;校验通过,则:

² 调用resolve_normal_ct(nf_conntrack_core.c)对报文进行进一步处理:

Ø 调用nf_ct_get_tuple,得到skb对应的tuple;

Ø 调用nf_conntrack_find_get,查找tuple对应的conntrack hash是否存在;若不存在,则调用init_conntrack(nf_conntrack_core.c)进行tuple对应的conntrack的初始化:

ü   调用nf_ct_invert_tuple,得到反向tuple:repl_tuple;

ü   调用__nf_conntrack_expect_find,查找所属exp;

ü   调用__nf_conntrack_alloc,分配conntrack结构内存,并初始化;

ü   调用find_expectation,再次查找exp(why?)

n   若找到,则进行控制报文和数据报文的关联;

n   若没有,则调用__nf_ct_helper_find查找helper;

Ø 调用nf_ct_tuplehash_to_ctrack,由hash得到对应的conntrack;

Ø 根据hash的属性,更改conntrack的状态值。

² 调用l4proto->packet,对报文的4层协议进行处理;

入口函数nf_nat_in,调用nf_nat_fn:

² 调用nf_ct_get,得到skb对应的nf_conn:ct

² 调用nfct_nat,得到ct的nf_conn_nat:nat;

² 根据ctinfo值,做不同处理:

Ø ctinfo为IP_CT_NEW,则根据nat规则(有可能是空规则),建立nf_nat_range;并根据nf_nat_range更改conntrack信息;

Ø ctinfo为IP_CT_RELATED或IP_CT_RELATED+IP_CT_IS_REPLY,且报文不是ICMP,则进入IP_CT_NEW的处理内容进行处理;

² 调用nf_nat_packet,根据转换的conntrack,更改报文的地址信息;

5.进入LOCAL_IN,则

入口函数:nf_nat_fn:

入口函数:ipv4_conntrack_help:

² 得到conntrack的help,调用helper的handle处理之;

入口函数:nf_nat_adjust:

² 调整TCP报文的序列号,以及conntrack上的TCP记录信息(只对TCP报文有效)

入口函数:ipv4_confirm:

² 调用ipv4_confirm,直接调用nf_conntrack_confirm,再调用__nf_conntrack_confirm:

Ø 将conntrack加入链表

6.进入LOCAL_OUT,则

入口函数:ipv4_conntrack_defrag,进行报文碎片重组;

入口函数:ipv4_conntrack_local,调用nf_conntrack_in处理之;后续同第4节描述

入口函数:nf_nat_local_fn,

² 调用nf_nat_fn,

² 调用ip_route_me_harder

7.进入POSTROUTING,则:

入口函数:nf_nat_out,

² 调用nf_nat_fn;

² 调用ip_xfrm_me_harder(定义CONFIG_XFRM的情况下)

入口函数:ipv4_conntrack_help:

² 得到conntrack的help,调用helper的handle处理之;

入口函数:nf_nat_adjust:

入口函数:ipv4_confirm,直接调用nf_conntrack_confirm,再调用__nf_conntrack_confirm:

² 将conntrack加入链表

linux2.6内核netfilter架构分析的更多相关文章

  1. Android 内核--Binder架构分析

    一.Binder架构 在Android中,Binder用于完成进程间通信(IPC),即把多个进程关联在一起.比如,普通应用程序可以调用音乐播放服务提供的播放.暂停.停止等功能.Binder工作在Lin ...

  2. linux内核netfilter模块分析之:HOOKs点的注册及调用

    转自;http://blog.csdn.net/suiyuan19840208/article/details/19684883 -1: 为什么要写这个东西?最近在找工作,之前netfilter 这一 ...

  3. MINIX3 内核整体架构回顾及内核定 性分析

    MINIX3  内核整体架构回顾及内核定 性分析 12.1 注意事项 由于本文档不对 I/O 文件系统做出分析,所以在此不对 MINIX3 整体做出一个分 析,本章主要是针对内核进程分析.并且这里的模 ...

  4. Linux2.6 内核的 Initrd 机制解析(转)

    from: https://www.ibm.com/developerworks/cn/linux/l-k26initrd/ 简介: Linux 的 initrd 技术是一个非常普遍使用的机制,lin ...

  5. Linux内核启动代码分析二之开发板相关驱动程序加载分析

    Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c  start_ke ...

  6. 20169212《Linux内核原理与分析》课程总结

    20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...

  7. tomcat架构分析 (Session管理)

    Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...

  8. Linux2.6 内核的 Initrd 机制解析

    文章来自:www.ibm.com/developerworks/cn/linux/l-k26initrd/ 1.什么是 Initrd initrd 的英文含义是 boot loader initial ...

  9. Linux内核源码分析方法

    一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...

随机推荐

  1. KMP字符串模式匹配详解(zz)

    刚看到位兄弟也贴了份KMP算法说明,但本人觉得说的不是很详细,当初我在看这个算法的时候也看的头晕昏昏的,我贴的这份也是网上找的.且听详细分解: KMP字符串模式匹配详解 来自CSDN     A_B_ ...

  2. rocketmq的线程服务基类

    RocketMQ有很多的线程服务,这些服务都继承自抽象类ServiceThread. 这个抽象类可以单独抽出来用到我们其他的项目中来,仅仅需要修改下日志模块: /** * Licensed to th ...

  3. activemq持久化配置,设置为主从模式(带复制的主从模式,应用mysql数据库)

    配置文件如下<!--    Licensed to the Apache Software Foundation (ASF) under one or more    contributor l ...

  4. 【DB2】判断连续时间,如果间断则新增一条记录

    需求描述 例如:产品A01 2017-01-02到2017-01-03产品状态都是差,那么就是一条记录 但是在2017-01-04这天的状态不是差,到了5日这天又是差了 就是另外一条记录了 需求处理 ...

  5. java数据库操作:JDBC的操作

    1,JDBC注意操作类及接口: 数据库操作过程: 1)打开数据库服务 2)连接数据库:一般都要输入用户名,密码, 3)操作数据库:创建表:查询表,更新,记录. 4)关闭数据库. 1,DriverMan ...

  6. 《Javascript权威指南》学习笔记之十九--HTML5 DOM新标准---处理文档元信息和管理交互能力

    一.了解DOM 1.DOM是Document Object Model的缩写,即文档对象类型,是文档在内存中的表示形式,是一个应用程序接口,定义了文档的逻辑结构以及一套訪问和处理文档的方法. 2.HT ...

  7. 详解Android中那些酷炫返回方式的实现

    Android手机都会有返回键,不管是实体键,还是虚拟键.Android用户主要也都是通过这个返回键操控页面返回方式的,不比IOS逼格甚高的只保留一个操作键.这种方式是最普遍的返回方式,还有一种也是比 ...

  8. excel合并单元格

    最简单的: =A1&B1&C1 在C14单元格中输入公式:=CONCATENATE(A14,"@",B14,".com"),确认后,即可将A14 ...

  9. 【转】OMCS网络语音视频聊天框架(跨平台)

    原文地址:http://www.cnblogs.com/zhuweisky/archive/2012/08/02/2617877.html OMCS网络语音视频框架是集成了语音通话.视频通话.远程桌面 ...

  10. CodeSmith单表生成实体模板与生成多表实体模板

    生成单实体模板: <%@ Template Language="C#" TargetLanguage="C#" %> <%@ Assembly ...