Chinaunix

标题: 请问那个大神可以告诉小弟,看连接跟踪的代码,从哪里入手。 [打印本页]

作者: linux_sjj    时间: 2016-03-04 11:35
标题: 请问那个大神可以告诉小弟,看连接跟踪的代码,从哪里入手。
最近领导让看连接跟踪相关知识,并且用代码实现,在网上看了很多博客资料,也只是了解一点,但还是无从下手。希望有高手可以指点一下小弟,该如何入手。或者,从内核那块看起。
作者: Buddy_Zhang1    时间: 2016-03-04 11:42
是链接吗?
是链接吗?
作者: linux_sjj    时间: 2016-03-04 11:46
防火墙上的连接跟踪模块
作者: Buddy_Zhang1    时间: 2016-03-04 11:47
回复 3# linux_sjj


    哈哈,那我不知道,哈哈哈哈
作者: linux_sjj    时间: 2016-03-04 11:48
没关系,一定有高手知道的,世界这么大
作者: Godbach    时间: 2016-03-04 13:36
回复 1# linux_sjj

本版块有精华帖分析连接跟踪的,可以作为你学习的参考。


   
作者: linux_sjj    时间: 2016-03-05 14:25
回复 6# Godbach
请问,你说的参考是在那个连接上啊。谢谢啊

   
作者: Godbach    时间: 2016-03-05 16:26
回复 7# linux_sjj

置顶精华帖

   
作者: linux_sjj    时间: 2016-03-07 08:33
回复 8# Godbach


  谢谢啊 ,但是我看了之后感觉没什么头绪,自己还是写不出来,感觉好像少了写什么

作者: HazeC    时间: 2016-03-07 09:44
从iptables 做NAT开始看
作者: nswcfd    时间: 2016-03-07 10:14
从最基本的conntrack逻辑入手,暂时先不用关心exepct/helper/NAT等扩展功能。

基本逻辑很简单,来了报文查表,查到就结束,查不到就新建。(稍微特殊的地方在于有个confirm过程)

额外的复杂度可能来自于生命周期的管理(引用计数、超时、并发考虑等)
作者: linux_sjj    时间: 2016-03-07 10:37
回复 11# nswcfd


    这个模块自己用代码实现感觉没头绪,而且我不太清楚处理.pcap数据报的时候那个sk_buff是自己默认就带的参数吗?
作者: Godbach    时间: 2016-03-07 11:57
本帖最后由 Godbach 于 2016-03-07 11:59 编辑

回复 9# linux_sjj
先熟悉代码,熟悉功能啊,一点一点了。

你要是看一遍代码,都知道怎么写了。那你就是大牛了。


   
作者: linux_sjj    时间: 2016-03-07 18:01
回复 13# Godbach


    请问,这个机制,是系统自己调用的吧,那些所有的结构体,在应用层上面根本调不出来,领导给的任务:
1. 掌握连接跟踪的概念,并可以编程实现。
2. 使用连接跟踪的方式,组合数据包,将pcap中http流里下载的html,js,image之类的文件导出保存.

第一个:编程实现,这个不是内核自带的吗,而且,我们如果去编程实现,不是有好多宏调不出来。
第二个:不是自动实现的吗,问你什么还要去掉用函数组合,好蒙。可能给我讲点思路。
作者: Godbach    时间: 2016-03-07 19:10
回复 14# linux_sjj

连接跟踪是内核层面的功能。提供给用户空间的有查询功能,还有部分配置功能。

建议你先认真熟悉一下连接跟踪,以及在用户态能够对连接跟踪有哪些查询和操作,比如通过 iptables/sysctl 等。


   
作者: 我不哭想    时间: 2016-03-07 21:30
这个就不好说了。
作者: linux_sjj    时间: 2016-03-08 08:57
回复 15# Godbach


   有没有你说的,连接跟踪给用户提供的api接口函数的文档可以参考啊,谢谢啊
作者: linux_sjj    时间: 2016-03-08 10:02
回复 15# Godbach

你有做过连接跟踪相关的吗,我就是想不通数据包,来的时候,系统是怎么获取到sk__buff这个结构体,还有就是那个hash列表,里面,当当同一个方向的tuple是,是改变这个hash点的状态,还有内容吗,还是在搞什么。
   
作者: Godbach    时间: 2016-03-08 13:36
回复 18# linux_sjj
这个都超出连接跟踪的范畴了。

你看一下置顶精华帖,有讲述数据包在链路层和网络层收发的文章,应该会对你有所帮助。

你问的问题太大,应该需要你自己先做一些资料查询,阅读代码之类的准备工作。


   
作者: nswcfd    时间: 2016-03-08 20:09
不好意思,才看到消息。平时不怎么上qq的。

感觉楼主领导的意思是要在用户态模拟conntrack的逻辑?
那就不需要关心内核的skb到底是怎么回事,又是怎么被驱动+协议栈送给conntrack hook的,只需要知道skb是对数据包的一个抽象就行了。

conntrack的核心就是一个hash表,对五元组做hash求一个key,hash算法可以照抄内核的jhash,也可以自己选择其他的。
用户态做hash表的方法有很多,stl的map+vector应该就够用了。不行的话,照抄内核的hlist也行。

PS,简单模拟的话甚至都不需要hash表,并发数不高的话,简单的线性表(数组或链表)就可以了。

为什么需要conntrack?因为pcap文件中可能有多个会话,需要把属于不同连接的报文区分开来。

什么样的报文属于一个会话?五元组相同的,注意A->B和B->A两个方向的五元组命中同一个会话。
楼主可以选择向conntrack一样,把A->B和B->都插入到hash表(或者线性表)中,这样无论查找A->B还是B->A只需要查询一次。
也可以只插入A->B,查找的时候,先后按照A->B和B->A查询两次,只要有一个命中就算查到。

报文又是什么?pcap库提供了报文的一种表示,就是一定长度的buffer。

所以基本流程就是,在pcap的回调函数里,分析报文,提取ip/tcp头部,拼出五元组,去查找会话表,查不到新建一个,于是报文就跟会话关联了。

那么对于分析html这个任务来说,会话究竟有什么用?说到底就是一句话,存放会话的状态机。
比如tcp的前三个包是个状态机,http header和http body又是状态机,html的标签还是状态机。
这样,根据状态机记录的状态,就知道之前的报文分析到哪一步了。
作者: linux_sjj    时间: 2016-03-10 17:26
回复 20# nswcfd
你好!非常谢谢你。领导是让在用户态模拟一个连接跟踪,然后组合数据包,在将其中html,jpg,js等下载下来。但是我始终想不通,我就算是用个链表把读来的五元组,都存在链表里面(感觉没什么意义啊,就是只有源ip,目的ip,协议,源端口,目的端口),我继续读取包的时候,继续往里面添加五元组,可是我包读完了,链表里面也只是存在一个五元组的链表,这个没有什么意义啊。每个包里面的内容也不会存在链表里面。

   
作者: Godbach    时间: 2016-03-10 22:57
回复 21# linux_sjj

按照你领导的要求,你是肯定要存储内容的。之所以让你用连接跟踪,其实就是要有 session 的了逻辑。比如你收到一个报文,里面有数据,你怎么知道这是谁的数据,OK,找到他对应的 session,然后就知道这段数据该怎么保存了。


   
作者: linux_sjj    时间: 2016-03-11 08:37
回复 22# Godbach


   你说的这个会话是指什么,我不就是存了个五元组嘛,来了一个报文,我把五元组存在链表里面,我也没有存取这个报文的内容,之后,就算再来这个会话,也只是查找了一下链表存不存在这个五元组,不存在加上,存在的话直接跳过,没什么实际作用啊。没有你说的还能去查找会话内容这一说啊

作者: Godbach    时间: 2016-03-11 10:46
回复 23# linux_sjj

session 可以理解为 conntrack 的概念。

你要知道你用 五元组是干嘛的。你最终不是为了读取里面的数据吗。


   
作者: Godbach    时间: 2016-03-11 10:47
回复 23# linux_sjj

你只要五元组,不需要内容吗。

单独保存五元组,其他信息不保存,够你实际的需要吗?



   
作者: linux_sjj    时间: 2016-03-11 11:31
回复 25# Godbach


    我的所有wireshark捕捉到的包,不都是类似于这个图片上的内容,这样一个传输的建立之后,所有内容都放一起吗。

QQ图片20160311112841.png (25.19 KB, 下载次数: 141)

QQ图片20160311112841.png

作者: Godbach    时间: 2016-03-11 14:56
回复 26# linux_sjj

LZ,你先扎实的了解一下一些 kernel 网络方面的基础吧,比如最核心的 skb 结构等等。


   
作者: nswcfd    时间: 2016-03-11 16:19
基于会话分析内容有两大流派:
A。 把连接的报文全部拼接/缓存起来,作为一个整体去分析。
B。 逐包分析,不断更新状态,所谓的流式引擎。
有点像当年的DOM和SAX
作者: nswcfd    时间: 2016-03-11 16:33
对于保存html/jpg这个任务来说,需要在http header包里分析出content-type/content-length,记录文件名,类型,长度(这都是保存在session上的状态,不仅是五元组)。
然后对于后续报文(假设没有tcp乱序\丢包发生),不断追加文件,直到剩余长度(也是状态)小于等于0为止。
作者: _nosay    时间: 2016-03-11 16:55
回复 26# linux_sjj


协议分层的,把每一层的头去掉了,就是你要的应用数据,这些数据拼起来就得到你要的文件了,关于怎么拼,这些文件是什么后缀,要看你是从头到尾到自己实现还是底层用第三方库吧,你要知道进入你程序的数据是哪一层协议的数据。
可以先用pcap库的接口,看看官网的示例,试着从一个pcap文件中“抓”出来文件,有个感性的认识,然后再去考虑怎么写你的程序。如果你能自己从网卡获取数据,并且支持主流协议解析,最终放到一个大的网关上抓文件,效率和正确性都没问题,你一定很收获到很多很多东西,加油吧。


   
作者: littleMing    时间: 2019-05-14 15:23
可以分享一下吗?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2