Chinaunix

标题: linux netfilter hook中自己构造skbuff,发送全新数据包 [打印本页]

作者: meijusan123    时间: 2009-11-05 16:45
标题: linux netfilter hook中自己构造skbuff,发送全新数据包
linux netfilter hook中自己构造skbuff,发送全新数据包!
大虾可以给点思路

如果自己申请skbuff内存,最后,到底怎么让其释放掉~
作者: godbach    时间: 2009-11-05 16:54
我以前总结过这样一篇文章,LZ可以参考一下:
http://blog.chinaunix.net/u/33048/showart_2043789.html

至于数据包的释放,数据包最终由网卡发出去的时候,系统会将其释放的。
作者: 故哈    时间: 2009-11-06 09:10
原帖由 meijusan123 于 2009-11-5 16:45 发表
linux netfilter hook中自己构造skbuff,发送全新数据包!
大虾可以给点思路

如果自己申请skbuff内存,最后,到底怎么让其释放掉~

有些封包接口会自己释放 不需要你释放
作者: kwest    时间: 2009-11-06 10:24
参考ipt_REJECT模块代码!
作者: meijusan123    时间: 2009-11-06 17:46
原帖由 godbach 于 2009-11-5 16:54 发表
我以前总结过这样一篇文章,LZ可以参考一下:
http://blog.chinaunix.net/u/33048/showart_2043789.html

至于数据包的释放,数据包最终由网卡发出去的时候,系统会将其释放的。



谢谢楼主,你的文章写了很好。但,我有些疑问想提一下!
就是在hook中我手动封装一个数据包,包括对mac,ip,tcp头和数据段,最后通过dev_queue_xmit()发送,是可以实现的,我试验过。
如果,我手动封装一个数据包只封装了ip,tcp和数据段,最后还是通过dev_queue_xmit()发送出去,中途怎么让系统自己动给我封装一个mac头?
作者: meijusan123    时间: 2009-11-06 17:47
标题: 回复 #4 kwest 的帖子
参考过,是可以实现。
但,他是        NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, nskb, NULL, nskb->dst->dev,
                dst_output);
一个过程,而不是直接dev_queue_xmit(),哪,mac头是怎么封装的
作者: meijusan123    时间: 2009-11-06 17:48
标题: 回复 #3 故哈 的帖子
是呀,我看了dev_queue_xmit()里面,是实现了kfree_skb()的过程!~
作者: lyl19    时间: 2009-11-06 20:17
标题: 回复 #7 meijusan123 的帖子
没有吧,我认为转发的skb最终的释放不是在dev_queue_xmit中,而是在硬件发送完成,触发的软中断中
作者: godbach    时间: 2009-11-06 22:41
原帖由 meijusan123 于 2009-11-6 17:46 发表



谢谢楼主,你的文章写了很好。但,我有些疑问想提一下!
就是在hook中我手动封装一个数据包,包括对mac,ip,tcp头和数据段,最后通过dev_queue_xmit()发送,是可以实现的,我试验过。
如果,我手动封装 ...


同样是我的总结的那文章说的一种方式,封装数据包之后让它进行路由。
作者: meijusan123    时间: 2009-11-07 08:28
标题: 回复 #8 lyl19 的帖子
难道 ,是在硬件驱动中实现释放的过程?
作者: meijusan123    时间: 2009-11-07 08:31
原帖由 godbach 于 2009-11-6 22:41 发表


同样是我的总结的那文章说的一种方式,封装数据包之后让它进行路由。


我试着使用ip_route_output_key(&rt, &fl) 这个接口函数去手动路由,再触发dev_queue_xmit(skb)去发送数据包,但,tcpdump没抓到此包,可能是没有路由成功,没有帮我添加好MAC头,所有,中途丢弃了!

版主,你的意思“封装数据包之后让它进行路由”是怎么实现的?能不能说详细些,让我了解下 谢谢啦
作者: lyl19    时间: 2009-11-07 15:42
标题: 回复 #10 meijusan123 的帖子
net_tx_action works in a similar way. It can be triggered with raise_softirq_irqoff(NET_TX_SOFTIRQ) by devices in two different contexts, to accomplish two main tasks:

By netif_wake_queue when transmission is enabled on a device. In this case, it makes sure that frames waiting to be sent are actually sent when all the needed conditions are met (for instance, when the device has enough memory).

By dev_kfree_skb_irq when a transmission has completed and the device driver signals with the former routine that the associated buffer can be released. In this case, it deallocates the sk_buff structures associated with successfully transmitted buffers.

The reason for the second task is as follows. We know that when code from the device driver runs in interrupt context, it needs to be as quick as possible. Releasing a buffer can take time, so it is deferred by asking the net_tx_action softirq to take care of it. Instead of using dev_kfree_skb, device drivers use dev_kfree_skb_irq. While the former deallocates the sk_buff (which actually consists of the buffer going back into a per-CPU cache), the latter simply adds the pointer to the buffer being released to the completion_queue list of the softnet_data structure associated with the CPU and lets net_tx_action do the real job later.
作者: godbach    时间: 2009-11-07 16:18
版主,你的意思“封装数据包之后让它进行路由”是怎么实现的?能不能说详细些,让我了解下

我的意思就是封装之后,你要手动路由吧,这个可以参考ipt_REJECT.c中的send_reset函数操作的路由方式,然后让数据包接着走NF框架的处理流程啊。
作者: meijusan123    时间: 2009-11-09 14:18
原帖由 godbach 于 2009-11-7 16:18 发表

我的意思就是封装之后,你要手动路由吧,这个可以参考ipt_REJECT.c中的send_reset函数操作的路由方式,然后让数据包接着走NF框架的处理流程啊。


谢谢,版主,问题解决了。

可以,手动封装数据包,再手动路由,继续使用它路由过的hh结构,取出已经帮你填好的mac部分,再把skb放到dev_queue_xmit(skb)上,ok。抓包,可以抓到了!
作者: godbach    时间: 2009-11-09 14:30
可以,手动封装数据包,再手动路由,继续使用它路由过的hh结构,取出已经帮你填好的mac部分,


这个是在自己单独构造数据包的情况下吧,通过手动路由也是为了获取源和目的MAC,有了正确的MAC之后,就可以调用dev_queue_xmit了,你是这样实现的吧
作者: VIP_fuck    时间: 2009-11-10 10:21
各位大牛,我想学习下底层的网络编码。指点一下呗。我该从哪里入手?
作者: meijusan123    时间: 2009-11-10 10:24
标题: 回复 #16 VIP_fuck 的帖子
先看书!
ldd3,或一些内核开发相关,不然,一下子没理论知识,到处碰壁的。
作者: VIP_fuck    时间: 2009-11-10 10:29
标题: 回复 #17 meijusan123 的帖子
谢谢大牛指点。
谢谢
作者: godbach    时间: 2009-11-10 10:31
原帖由 VIP_fuck 于 2009-11-10 10:21 发表
各位大牛,我想学习下底层的网络编码。指点一下呗。我该从哪里入手?


你得先说一下你的基础
作者: VIP_fuck    时间: 2009-11-10 10:36
标题: 回复 #19 godbach 的帖子
会一点socket,学习 unp1.书看过几遍,不过不精。
作者: godbach    时间: 2009-11-10 10:47
标题: 回复 #20 VIP_fuck 的帖子
这样可以看一下LKD,然后网络方面的话先熟悉一下使用iptables命令,这个熟悉了之后,可以深入到内核理解Netfilter的相关设计
作者: VIP_fuck    时间: 2009-11-10 10:52
标题: 回复 #21 godbach 的帖子
LKD 不知道是啥。
iptables filter nat 的最基本的东西我会。有时候会给客户搞一些。
’深入到内核理解Netfilter的相关设计‘该怎么做呀
作者: meijusan123    时间: 2009-11-10 11:12
标题: 回复 #15 godbach 的帖子
对呀,但,你必须还手动把路由过后涉及到的hh_cache结构mac头自己手动加上,最后调用dev_queue_xmit发送出去。

为什么呢?
因为,按我们以前的hook流程或是NF_HOOK流程,系统都帮你处理了mac头的添加。所以,现在如果调用dev_queue_xmit,就必须自己手动添加下已经获得mac头就行啦!
作者: meijusan123    时间: 2009-11-10 11:14
标题: 回复 #18 VIP_fuck 的帖子
晕,我不是什么大牛啦,我也是刚搞kernel 协议栈不久,需要大量实践和学习的啦!
作者: siasjack    时间: 2014-08-16 09:37
回复 2# godbach


    这个网址已经不行了啊    麻烦大侠再弄出来一个Q多谢!
作者: beyondfly    时间: 2014-08-17 16:25
回复 2# godbach


    版主,这个文章的链接失效了,能不能重新发个链接?
作者: Godbach    时间: 2014-08-17 23:25
回复 26# beyondfly

应该是这篇文章
http://blog.chinaunix.net/uid-10167808-id-25974.html


   
作者: Godbach    时间: 2014-08-17 23:26
回复 25# siasjack

看 27 楼回复


   




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