当前位置: 技术问答>linux和unix
请教关于netfilter中UDP包的问题!!!
来源: 互联网 发布时间:2016-08-29
本文导语: 最近在做一项目,主要是在kernel中按照我们的设定的特征捕获一些UDP包,并且将其存储下来,当到一定数量之后, 对这些包的数据部分进行运算,再构建一个新的包,将运算的结果作为包的数据发送出去。 这个项...
最近在做一项目,主要是在kernel中按照我们的设定的特征捕获一些UDP包,并且将其存储下来,当到一定数量之后,
对这些包的数据部分进行运算,再构建一个新的包,将运算的结果作为包的数据发送出去。
这个项目基于一个运行了linux kernel的路由器,所以接收了包还要按照路由表将其转发出去。
我的做法:
在NF_IP_PRE_ROUTING 处定义了钩子抓包,如果遇到符合设定规则的UDP包,我会将其UDP数据部分存储到
我指定的地方,对于原来的包,我return NF_DROP;另外对于我还会存储这些UDP包中一个包的 IP包头、UDP包头,
在构建新的包时,需要用到这两包头信息;
我能做到是:
我构建新包使用了nc_alloc_skb,此报文的ip包头、UDP包头、UDP数据我都能利用以前存储数据的复制进去。
现在问题主要有:
1、我想把新建立的包在NF_IP_PRE_ROUTING点建立好之后,使其能按照一般的包正常的流程走下去(就像对包进行return NF_ACCEPT
后包继续走的流程一样),包括经过路由转发等,要实现这样有什么样的方法?
2、如果是要使用dev_queue_xmit将新建立的包发送出去,是不是包就会直接被发送出去了而不会经过路由选择?此外还必须要填充新建立
的包的mac头,而mac头的目的IP需要查找路由表才能知道。
请各位朋友指导一下,小弟不胜感激。
对这些包的数据部分进行运算,再构建一个新的包,将运算的结果作为包的数据发送出去。
这个项目基于一个运行了linux kernel的路由器,所以接收了包还要按照路由表将其转发出去。
我的做法:
在NF_IP_PRE_ROUTING 处定义了钩子抓包,如果遇到符合设定规则的UDP包,我会将其UDP数据部分存储到
我指定的地方,对于原来的包,我return NF_DROP;另外对于我还会存储这些UDP包中一个包的 IP包头、UDP包头,
在构建新的包时,需要用到这两包头信息;
我能做到是:
我构建新包使用了nc_alloc_skb,此报文的ip包头、UDP包头、UDP数据我都能利用以前存储数据的复制进去。
现在问题主要有:
1、我想把新建立的包在NF_IP_PRE_ROUTING点建立好之后,使其能按照一般的包正常的流程走下去(就像对包进行return NF_ACCEPT
后包继续走的流程一样),包括经过路由转发等,要实现这样有什么样的方法?
2、如果是要使用dev_queue_xmit将新建立的包发送出去,是不是包就会直接被发送出去了而不会经过路由选择?此外还必须要填充新建立
的包的mac头,而mac头的目的IP需要查找路由表才能知道。
请各位朋友指导一下,小弟不胜感激。
|
1. 既然还是走原流程,为什么不在NF_IP_PRE_ROUTING处截取,然后直接修改报文数据sk_buffer呢。
2. dev_queue_xmit将报文发给网络核心接口层,在这里完成mac层打包,然后就发给最终的网络驱动。
至于楼上说的sys_socket那是4层的事情,跟netfilter不搭边。
部分笔记可以看看这里
http://blog.sina.com.cn/s/blog_62bbc49c0100fs0n.html
2. dev_queue_xmit将报文发给网络核心接口层,在这里完成mac层打包,然后就发给最终的网络驱动。
至于楼上说的sys_socket那是4层的事情,跟netfilter不搭边。
部分笔记可以看看这里
http://blog.sina.com.cn/s/blog_62bbc49c0100fs0n.html