Linux Kernel Netfilter Helper 分析

linux netfilter 与helper相关的hook:

点击(此处)折叠或打开

{

.hook = ipv4_conntrack_in,

.owner = THIS_MODULE,

.pf = PF_INET,

.hooknum = NF_IP_PRE_ROUTING,

.priority = NF_IP_PRI_CONNTRACK,

}

{

.hook = ipv4_conntrack_help,

.owner = THIS_MODULE,

.pf = PF_INET,

.hooknum = NF_IP_POST_ROUTING|NF_IP_LOCAL_IN,

.priority = NF_IP_PRI_CONNTRACK_HELPER,

}

第一个数据包到来的流程:

ipv4_conntrack_in --> nf_conntrack_in --> resolve_normal_ct --> nf_ct_get_tuple --> nf_conntrack_find_tuple(1) --> init_conntrack --> nf_ct_find_expection(2) --> nf_ct_helper_find(3) --> nf_ct_helper_ext_add(4)

(1) 查找tuple五元组,因为是第一个连接,所有查找不到

(2) 查找期待连接,因为没有添加过期待连接,所有也查找不到

(3) 查找注册的helper,这里以tftp为例,找到了tftp注册的helper

(4) 将找到的helper添加到ct结果体中

在之后的ipv4_conntrack_help的hook函数中,会执行ct->helper->help函数,这个help函数tftp_help会添加一个exp到全局期待连接表中

当期待的链接的第一个数据包到达的时候,会在(2)中找到,从而将新的连接与之前的链接联系起来。

时间: 2024-10-10 07:31:36

Linux Kernel Netfilter Helper 分析的相关文章

linux kernel crash问题分析解决

一,问题场景和环境 系统环境: redhat6.4 kernel:2.6.32-358 问题: 使用iptables给mangle表添加了一条规则,使用nfqueue做为target.当一个http请求命中这个规则之后,机器直接重启了.偶发性的出了两次问题,但是却在重启的机器上重现不了这个问题. 二,排查 1,查看messages,kernel和dmesg相关日志,未发现有任何异常 2,查看重启前机器的负载,cpu,内存,磁盘io,网络io都正常 3,由于是使用了nfqueue做为target才

Linux Kernel CMPXCHG函数分析

最近看到Linux Kernel cmpxchg的代码,对实现很不理解.上网查了内嵌汇编以及Intel开发文档,才慢慢理解了,记录下来以享和我一样困惑的开发者.其实cmpxchg实现的原子操作原理早已被熟知: cmpxchg(void* ptr, int old, int new),如果ptr和old的值一样,则把new写到ptr内存,否则返回ptr的值,整个操作是原子的.在Intel平台下,会用lock cmpxchg来实现,这里的lock个人理解是锁住内存总线,这样如果有另一个线程想访问pt

linux kernel input 子系统分析

Linux 内核为了处理各种不同类型的的输入设备 , 比如说鼠标 , 键盘 , 操纵杆 , 触摸屏 , 设计并实现了一个对上层应用统一的试图的抽象层 , 即是Linux 输入子系统 . 输入子系统的层次结构体如下 从底层到上层 , input 子系统由 设备驱动层 , 核心层 , 以及事件处理层3个部分组成 当一个鼠标移动, 一个按键按下或弹起 , 它都需要从底层设备驱动-->核心层-->事件处理层 -->用户空间 , 层层上报 , 一直到运用程序. 应用这个input  子系统有如下优

Arm Linux Kernel 构建 情景分析

概述 构建一个内核,一般是先配置,后编译.这里以构建 Nexus5 内核为例,代号为 hammerhead. 配置 通常做法是以厂商预置的配置为基础,根据自己需要进行配置.命令: make ARCH=arm hammerhead_defconfig 执行完毕后,"arch/arm/configs/hammerhead_defconfig" 文件会被复制到 ".config" ,作为默认配置. 然后运行以下命令根据自己需要进行配置: make ARCH=arm men

linux kernel 字符设备详解

有关Linux kernel 字符设备分析: 参考:http://blog.jobbole.com/86531/ 一.linux kernel 将设备分为3大类,字符设备,块设备,网络设备. 字符设备是指只能一个字节一个字节读写的设备, 常见的外设基本上都是字符设备. 块设备:常见的存储设备,硬盘,SD卡都归为块设备,块设备是按一块一块读取的. 网络设备:linux 将对外通信的一个机制抽象成一个设备, 通过套接字对其进行相关的操作. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.l

嵌入式 Linux开发Kernel移植(三)——Kernel工程Makefile分析

嵌入式 Linux开发Kernel移植(三)--Kernel工程Makefile分析 本文选择三星发布的基于SMDKV210开发板的linux 2.6.35.7版本kernel. 一.Kernel Makefle体系简介 1.Kernel Makefile体系组成 Kernel Makefile体系包含Kconfig和Kbuild两个系统. Kconfig系统 Kconfig 对应的是内核配置阶段,make xxconfig就是在使用Kconfig系统.Kconfig由三部分组成: script

linux kernel的中断子系统之(七):GIC代码分析

一.前言 GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器,其architecture specification目前有四个版本,V1-V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64服务器系统结构).目前在ARM官方网站只能下载到Version 2的GIC architecture specification,因此,本文主要描述符合V2规范的GIC硬件及其驱动. 具体GIC硬件的实现形态有两

第一次作业:深入源码分析进程模型(Linux kernel 2.6.32)

1.前言 本文基于Linux 2.6.32分析其进程模型,包括进程的概念.组织.转换.调度等内容,帮助对操作系统课程及Linux相关知识的理解和学习. 附Linux Kernel 2.6.32源码下载地址: https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.gz 2.进程的概念 2.1什么是进程? 在正式开始结合源代码分析进程模型之前,我们首先需要搞清楚进程的究竟是什么. 维基百科上对于进程的定义如下:

Linux Kernel文件系统写I/O流程代码分析(一)

Linux Kernel文件系统写I/O流程代码分析(一) 在Linux VFS机制简析(二)这篇博客上介绍了struct address_space_operations里底层文件系统需要实现的操作,实际编码过程中发现不是那么清楚的知道这里面的函数具体是干啥,在什么时候调用.尤其是写IO相关的操作,包括write_begin, write_end, writepage, writepages, direct_IO以及set_page_dirty等函数指针. 要搞清楚这些函数指针,就需要纵观整个