免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4321 | 回复: 8

[内核模块] 【netfilter】关于构造和发送数据包 [复制链接]

论坛徽章:
0
发表于 2015-06-20 20:48 |显示全部楼层
最近看了两篇关于netfilter构造和发送数据包的文章,总结起来大概是有两种方法,一是构造完包以后继续走NF流程,需要手动路由;二是利用dev_queue_xmit函数发送,需要构造MAC地址,有一些问题想要问问大家,谢谢大家~~~
方法一:
1、看的文章(“Linux内核发送构造数据包的方式”)中手动路由后将数据包发出,没有对mac层进行处理,这样没有问题吗(比如我将源ip和目的ip交换,那么mac的源地址和目的地址应该也要交换吧)?还是由于是在ip层进行处理所以屏蔽了mac层的影响?还是后面会自动加上mac?谢谢~~~
2、假设在LOCAL_OUT点进行了构造包的处理,源ip和目的ip交换,那么发送出去后是会回到PRE_ROUTING点然后正常进行处理的是吗?
方法二:
1、我将源ip和目的ip交换,那么mac的源地址和目的地址是不是只需要简单的交换就可以用dev_queue_xmit发出数据包了?
2、在LOCAL_OUT中的数据包是没有MAC层数据的,这样是不是就没办法的到mac的相关信息了,方法二是不是就行不通啊?
3、这种方法构造的数据包为什么不用对路由进行相关的处理?
另:
1、在hook点将自己钩子设置为第一优先级NF_IP_PRI_FIRST是不是有时候会影响到本来的路由信息(因为5个hook点本身挂有路由连接相关的函数)?
最近忙着考试,没有特别特别认真的看相关资料,有些大错误还麻烦大家指出,跪谢大家~~跪谢大家~~~

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
发表于 2015-06-22 12:17 |显示全部楼层
本帖最后由 firocu 于 2015-06-22 12:18 编辑

方法一
1. 我没看那篇文章, 既然在网络层构造的报文, 发包到链路层自然会根据ip地址, 自动生成MAC头部.
2. 在local out发送的报文目的地址本机的, 路由之后会ip_local_deliver, 送上来不会经过pre routing


方法二:
1. 同上
2, 3  没理解, 你可以看看这个函数neigh_connected_output

另,
hook 点的优先级和路由无关.

PS:
真羡慕楼主, 大学就搞这些东西.
回复 1# triplesheep


   

论坛徽章:
0
发表于 2015-06-25 15:12 |显示全部楼层
不好意思现在才回复,跪谢ORZ回答~~~,我打算先在ubuntu下试验一下~\(≧▽≦)/~回复 2# firocu


   

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2015-06-25 20:45 |显示全部楼层
本帖最后由 nswcfd 于 2015-06-25 20:47 编辑

>方法一:
>1、看的文章(“Linux内核发送构造数据包的方式”)中手动路由后将数据包发出,没有对mac层进行处理,这样没有问题吗(比如我将源ip和目的ip交换,那么mac的源地址和目的地址应该也要交换吧)?还是由于是在ip层进行处理所以屏蔽了mac层的影响?还是后面会自动加上mac?谢谢~~~
继续走netfilter,最终会执行dst->output,在那里会跟ARP子系统进行交互,也就是firocu提到的neigh_connected_output这一族函数。
所以不需要显式的关心MAC问题。

>2、假设在LOCAL_OUT点进行了构造包的处理,源ip和目的ip交换,那么发送出去后是会回到PRE_ROUTING点然后正常进行处理的是吗?
LOCAL_OUT出去的报文源地址是本机,如果交换了IP,目的地址是变成了本机,源变成了外部地址。
假设没有修改路由,还是使用原来目的IP的dst_entry,则修改的报文可以跟修改前一样,向nexthop正常发送;
如果修改了路由,使用本机地址对应的dst_entry,会路由到lo设备上,而lo的xmit行为是会再次进入PREROUTING的。
至于这样的报文,4层协议栈能否正常处理就不好说了,因为源是外部地址。

to firocu: ip_local_deliver是dst的input函数,只会在route_input的上下文里被赋值。这里是route_output场景,最终生效的是dst的output函数。【如果有错误,请纠正。】

>方法二:
>1、我将源ip和目的ip交换,那么mac的源地址和目的地址是不是只需要简单的交换就可以用dev_queue_xmit发出数据包了?
如果在路由转发路径(ip_forward)上,数据包上有MAC,交换可以。
但问题是交换之后,下游设备(或接收端)认不认这个修改后的目的MAC(原来的源MAC,而不是接收端的MAC)。
此外,交换ip和mac,不修改出接口吗?交换ip是为了满足什么功能?

>2、在LOCAL_OUT中的数据包是没有MAC层数据的,这样是不是就没办法的到mac的相关信息了,方法二是不是就行不通啊?
是的,调用dev_queue_xmit,必须准备好所有的内容,包含二层MAC。

>3、这种方法构造的数据包为什么不用对路由进行相关的处理?
因为dev_queue_xmit是协议栈最后的发送接口,它假设调用者已经把所有packet的内容都填好了,并且内部也没有用到dst_entry。
它是所有发送路径的总汇聚口,无论是三层路由,还是二层交换(bridge/vlan),最后都通过这个接口调用driver的xmit函数。不是所有的路径都需要有dst_entry,比如bridge交换。

论坛徽章:
0
发表于 2015-07-05 19:54 |显示全部楼层
不好意思,最近忙考试现在才回复。
>2、假设在LOCAL_OUT点进行了构造包的处理,源ip和目的ip交换,那么发送出去后是会回到PRE_ROUTING点然后正常进行处理的是吗?
LOCAL_OUT出去的报文源地址是本机,如果交换了IP,目的地址是变成了本机,源变成了外部地址。
假设没有修改路由,还是使用原来目的IP的dst_entry,则修改的报文可以跟修改前一样,向nexthop正常发送;
如果修改了路由,使用本机地址对应的dst_entry,会路由到lo设备上,而lo的xmit行为是会再次进入PREROUTING的。
至于这样的报文,4层协议栈能否正常处理就不好说了,因为源是外部地址。

那不经过路由处理直接交换地址后的报文能够正常的进行处理吗?目的地址变成本机后如果不再次进入PREROUTING那它怎么将修改到的包交给本机呢?那个nexthop最终不会回到PREROUTING吗?

>1、我将源ip和目的ip交换,那么mac的源地址和目的地址是不是只需要简单的交换就可以用dev_queue_xmit发出数据包了?
如果在路由转发路径(ip_forward)上,数据包上有MAC,交换可以。
但问题是交换之后,下游设备(或接收端)认不认这个修改后的目的MAC(原来的源MAC,而不是接收端的MAC)。
此外,交换ip和mac,不修改出接口吗?交换ip是为了满足什么功能?

这个我当时是看了一篇文章它就是直接 截取数据包进行复制->修改ip地址->填充mac地址->发送,没涉及到出接口所以我不是很懂QAQ


>2、在LOCAL_OUT中的数据包是没有MAC层数据的,这样是不是就没办法的到mac的相关信息了,方法二是不是就行不通啊?
是的,调用dev_queue_xmit,必须准备好所有的内容,包含二层MAC。

那在请教一下存在什么函数可以在LOCAL_OUT点提取出MAC地址吗?


再再再PS:目前看到的构造数据包的要么是直接修改了原包,要么就把原包给丢了直接发新的包,在netfilter里可以在原包基础上构造一个新包然后原包和新包都留下一起发送吗?就是
两个都要发送?
跪谢大大~~
回复 4# nswcfd


   

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2015-07-06 12:32 |显示全部楼层
> 那不经过路由处理直接交换地址后的报文能够正常的进行处理吗?目的地址变成本机后如果不再次进入PREROUTING那它怎么将修改到的包交给本机呢?那个nexthop最终不会回到PREROUTING吗?

“正常”的定义是什么?再把报文送回给本机(因为目的IP现在是本地地址)?仅交换IP并不能保证,还得看路由指向哪个接口。
loopback的过程是这样:0)output路由;1)路由到lo;2)执行lo的发送;3)再次rx;4)PREROUTING;5)input路由;6)路由到本机;7)送协议栈
如果不是,在步骤2)就发到其它机器上了。

> 这个我当时是看了一篇文章它就是直接 截取数据包进行复制->修改ip地址->填充mac地址->发送,没涉及到出接口所以我不是很懂QAQ

我没看你谈到的文章,方便的话给个链接。
看起来它没改接口,就是重用原来路由的接口。
那么它修改的ip/mac分别是什么?由于是实验代码,猜测是这种拓扑: A --> R --> B/C,代码在R上执行,把B的ip/mac修改为【同一个网段上】的C。

> 那在请教一下存在什么函数可以在LOCAL_OUT点提取出MAC地址吗?

要是可以的话,ARP协议就没有存在的必要了
在前面的例子里,写代码的人【事先知道】C的mac,所以就可以绕过ARP了。

> 再再再PS:目前看到的构造数据包的要么是直接修改了原包,要么就把原包给丢了直接发新的包,在netfilter里可以在原包基础上构造一个新包然后原包和新包都留下一起发送吗?就是两个都要发送?

还是举A -> R -> B/C的例子,R可以选择把两个报文都发出去,这样B/C都会应答,最终结果是A凌乱了

论坛徽章:
0
发表于 2015-07-11 23:32 |显示全部楼层
跪谢大大的回复,两个帖子都是大大回复的,跪跪跪跪谢ORZ
那篇文章的链接是:http://bbs.chinaunix.net/thread-1941060-1-1.html,也是版里的大大写的
回复 6# nswcfd


   

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2015-07-13 11:36 |显示全部楼层
这篇贴子的改包逻辑modify(nf local-out hook)没有修改dst,而是直接给skb->dev赋值(hard-code),SMAC和DMAC也是事先配置的,直接调用dev_queue_xmit发送,
跟正常流程相比,没有走dst_output->ARP的逻辑。
PS,NF_STOLEN的返回值有点问题,旧的skb没有free,引用泄漏了。(要么kfree_skb+NF_STOLEN,要么返回NF_STOP)

另一种方式cp_dev_xmit_tcp(DIY方式) ,根本就不是一个nf_hook,只是在模块加载的时候构造一个报文,直接利用dev_queue_xmit发送。
同样,它的dev/SMAC/DMAC都是写死的,它甚至都没有dst,这也从侧面证明了dev_queue_xmit根本不用dst。

论坛徽章:
0
发表于 2015-10-10 23:11 |显示全部楼层
好的,跪谢耐心的回复~~~回复 8# nswcfd


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP