内核中存放连接跟踪表中五元组tuple的结构体如下:

/* This contains the information to distinguish a connection. */
struct nf_conntrack_tuple {struct nf_conntrack_man src;//源地址信息,manipulable part/* These are the parts of the tuple which are fixed. */struct {union nf_inet_addr u3;union {/* Add other protocols here. */__be16 all;struct {__be16 port;} tcp;struct {__be16 port;} udp;struct {u_int8_t type, code;} icmp;struct {__be16 port;} dccp;struct {__be16 port;} sctp;struct {__be16 key;} gre;} u;/* The protocol. */u_int8_t protonum;/* The direction (for tuplehash) */u_int8_t dir;} dst; // 目的地址信息

把skb的五元组信息,转化成tuple,存到nf_conntrack_tuple结构体变量tuple中,l3即IP层,l4即tcp层。

bool
nf_ct_get_tuple(const struct sk_buff *skb,unsigned int nhoff,unsigned int dataoff,u_int16_t l3num,u_int8_t protonum,struct net *net,struct nf_conntrack_tuple *tuple,const struct nf_conntrack_l3proto *l3proto,const struct nf_conntrack_l4proto *l4proto)
{memset(tuple, 0, sizeof(*tuple)); //初始化tupletuple->src.l3num = l3num; //ip层协议if (l3proto->pkt_to_tuple(skb, nhoff, tuple) == 0) //调用L3回调函数return false;tuple->dst.protonum = protonum; //L4协议赋值tuple->dst.dir = IP_CT_DIR_ORIGINAL;//方向return l4proto->pkt_to_tuple(skb, dataoff, net, tuple);//调用l4回调函数
}
EXPORT_SYMBOL_GPL(nf_ct_get_tuple);

l3 的ipv4回调函数初始化:

struct nf_conntrack_l3proto nf_conntrack_l3proto_ipv4 __read_mostly = {.l3proto  = PF_INET,.pkt_to_tuple    = ipv4_pkt_to_tuple,.invert_tuple  = ipv4_invert_tuple,.get_l4proto   = ipv4_get_l4proto,
#if IS_ENABLED(CONFIG_NF_CT_NETLINK).tuple_to_nlattr = ipv4_tuple_to_nlattr,.nlattr_to_tuple = ipv4_nlattr_to_tuple,.nla_policy    = ipv4_nla_policy,.nla_size    = NLA_ALIGN(NLA_HDRLEN + sizeof(u32)) + /* CTA_IP_V4_SRC */NLA_ALIGN(NLA_HDRLEN + sizeof(u32)),  /* CTA_IP_V4_DST */
#endif.net_ns_get    = ipv4_hooks_register,.net_ns_put  = ipv4_hooks_unregister,.me        = THIS_MODULE,
};

如果是ipv4,调用ipv4_pkt_to_tuple

static bool ipv4_pkt_to_tuple(const struct sk_buff *skb, unsigned int nhoff,struct nf_conntrack_tuple *tuple)
{const __be32 *ap;__be32 _addrs[2];ap = skb_header_pointer(skb, nhoff + offsetof(struct iphdr, saddr),sizeof(u_int32_t) * 2, _addrs);if (ap == NULL)return false;tuple->src.u3.ip = ap[0]; //源iptuple->dst.u3.ip = ap[1]; //目的ipreturn true;
}

如果是ipv6,调用ipv6_pkt_to_tuple

static bool ipv6_pkt_to_tuple(const struct sk_buff *skb, unsigned int nhoff,struct nf_conntrack_tuple *tuple)
{const u_int32_t *ap;u_int32_t _addrs[8];ap = skb_header_pointer(skb, nhoff + offsetof(struct ipv6hdr, saddr),sizeof(_addrs), _addrs);if (ap == NULL)return false;memcpy(tuple->src.u3.ip6, ap, sizeof(tuple->src.u3.ip6));memcpy(tuple->dst.u3.ip6, ap + 4, sizeof(tuple->dst.u3.ip6));return true;
}

如果l4协议是tcp

static bool tcp_pkt_to_tuple(const struct sk_buff *skb, unsigned int dataoff,struct net *net, struct nf_conntrack_tuple *tuple)
{const struct tcphdr *hp;struct tcphdr _hdr;/* Actually only need first 4 bytes to get ports. */hp = skb_header_pointer(skb, dataoff, 4, &_hdr);//获取tcp头部if (hp == NULL)return false;tuple->src.u.tcp.port = hp->source;//src porttuple->dst.u.tcp.port = hp->dest; //dst portreturn true;
}

如果l4协议是udp

static bool udp_pkt_to_tuple(const struct sk_buff *skb,unsigned int dataoff,struct net *net,struct nf_conntrack_tuple *tuple)
{const struct udphdr *hp;struct udphdr _hdr;/* Actually only need first 4 bytes to get ports. */hp = skb_header_pointer(skb, dataoff, 4, &_hdr);if (hp == NULL)return false;tuple->src.u.udp.port = hp->source;tuple->dst.u.udp.port = hp->dest;return true;
}

如上过程是从skb里面获取五元组(tuple)的过程。

nf_conntrack_in(kernel4.14)相关推荐

  1. 【暮色天】世界杯完美谢幕 金银重回震荡?(7.14)

    [暮色天]世界杯完美谢幕 金银重回震荡?(7.14) 行情回顾: 上周国际现货黄金 周初开盘于1320一线,周初回踩1311一线确认支撑震荡上行,周中因国际地缘政治冲突冲引发买盘最高上涨至1345一线 ...

  2. MP4文件格式详解(ISO-14496-12/14)

    一.基本概念 1. 文件,由许多Box和FullBox组成. 2. Box,每个Box由Header和Data组成. 3. FullBox,是Box的扩展,Box结构的基础上在Header中增加8bi ...

  3. Minecraft我的世界 forge mdk1.13(1.14)开发环境搭建教程及经验

    Minecraft我的世界 forge mdk1.13(1.14)开发环境搭建教程及经验 1.前言 2. 1.13与1.12的区别 在forgegradle方面 在mdk开发方面 3.安装JDK和ID ...

  4. 全球摄像头镜头主要厂商(TOP 14)

    全球摄像头镜头主要厂商(TOP 14) CMOS图像传感器市场在2018年达到155亿美元,超过半导体市场总体营收的3%.索尼(Sony)与三星(Samsung).豪威科技(OmniVision).安 ...

  5. AI - 深度学习之美十四章-概念摘要(8~14)

    原文链接:https://yq.aliyun.com/topic/111 本文是对原文内容中部分概念的摘取记录,可能有轻微改动,但不影响原文表达. 08 - BP算法双向传,链式求导最缠绵 反向传播( ...

  6. 莫烦Tensorflow教程(1~14)(转)

    一.Tensorflow结构 import tensorflow as tf import numpy as np#create data x_data=np.random.rand(100).ast ...

  7. C# 工具类分享(7~14)

    目录 7. JSON操作类 8.ExcelHelper 类9 9.ImageHelper 10.Color Helper类 11.ImageClass 类 12.ImageDown 图片下载类 13. ...

  8. 常用工具类(8/14)

    UI工具类 1.判断是否是小米UI private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code& ...

  9. 算法竞赛入门经典(第二版)-刘汝佳-第六章 数据结构基础 习题(12/14)

    文章目录 说明 习题 习6-1 UVA 673 平衡的括号 习6-2 UVA 712 S - 树 习6-3 UVA 536 二叉树重建 习6-4 UVA 439 骑士的移动 习6-5 UVA 1600 ...

最新文章

  1. 微服务中的网关到底是个什么鬼?
  2. CS231n 学习笔记(4)——神经网络 part4 :BP算法与链式法则
  3. JVM - ZGC初探
  4. ABAP document read logic
  5. html:(17):img标签和表单标签
  6. 苹果隐藏app_iOS 14的隐藏功能盘点:不知道等于白更新!
  7. RabbitMQ——路由模式
  8. ssm基于儿童教育网站答辩PPT模板
  9. 今天我离开了工作四年的大宇
  10. 华为设备链路聚合配置命令
  11. 使用IBM SPSS Statistics常用图表附例演示讲解
  12. 基于Labview带通滤波器设计实例演示
  13. 超简单集成Android Zxing实现扫一扫二维码
  14. CAXA 分解命令x 解决不能选中图形问题。
  15. arduino最大电压_制作Arduino功率计测量电压电流及功耗
  16. Python:正则re.sub实现简易的模板引擎
  17. html 菜单栏横向排列,响应式可弹出横向导航栏
  18. js实现动画(移动方块)
  19. keil4怎么建立c语言工程,第5节:用keil软件新建,关闭,打开一个完整工程的操作流程...
  20. 托托又来了——PCA实现人脸识别

热门文章

  1. 小黄人代码(Python)
  2. 东软实训心得:万事开头难
  3. 某脑残公司领导:80 后就该滚出 IT 行业!二哥第一个不服!!!!!
  4. SSM框架中Dao层,Mapper层,controller层,service层,model层,entity层都有什么作用
  5. 桌面图标有了蓝色问号解决方案
  6. 〖Python自动化办公篇⑭〗- Excel 文件自动化 - 写入图表
  7. XC6206P332MR的特点与典型应用电路
  8. 区块链solidity学习(地址、交易篇:一)
  9. 计算机专业买什么笔记本牌子,计算机专业买什么笔记本
  10. 我将进化成一条狗(3)——区块链