免费注册 查看新帖 |

Chinaunix

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

[内核模块] 【求助】skb修改后发送 [复制链接]

论坛徽章:
0
发表于 2020-09-11 22:26 |显示全部楼层
本帖最后由 stoic978 于 2020-09-13 20:21 编辑

目的:两台虚拟机分别有两个网口,对应两个网段,想把一个网段本来由eth0发送的数据包修改,改为由另一网卡eth1接收发送,
两台虚拟机分别为AB,每个虚拟机有两个网卡,对应两个网段,想要在虚拟机上实现任何的tcp报文都走网卡eth1发出,由Beth1接收,两个主机正常通信。
       个人的实现方法,在net_post_routinghook点截获skb,更改源mac地址和目的mac地址,并更改skb->dev使原本由主机Aeth0发出的tcp包由eth1发出,并到达到达主机Beth1,并上传协议栈,不影响通信。
        目前使用sendipeth0发送数据包,可以在eth1的发送端和接收端都抓到包,而使用Telnet连接主机Beth0的对应网段,在两端都抓不到包。
       请问是我的思路哪里出现了问题吗?同样的方法我修改ICMP包,使用主机A来ping主机B的eth0的网段,在eth1上能抓到包,且eth0正常收到回应包,为什么TCP会无法建立连接
源码如下:
  1. skb->mac_header=2;//这里手动改了这个值,skb—>指向ip头时,被置为0xffff(65535)

  2. skb_push(skb,14);//skb->data指针上移

  3. //ethd=eth_hdr(skb);

  4. ethd=(struct ethhdr *)skb_mac_header(skb);

  5. printk("the tcp skb-data is----%p-----",skb->data);

  6. printk("the tcp eth is--------%p-----",ethd);//此处ethd与skb->data指针不一致。

  7. //set mac

  8. memcpy(ethd->h_dest,ens39_mac_d,6);//修改mac地址

  9. memcpy(ethd->h_source,ens39_mac_s,6);

  10. ethd->h_proto=__constant_htons (ETH_P_IP);

  11. printk("the dest mac is-------%pM------",ethd->h_dest);

  12. printk("the source mac is-----%pM-------",ethd->h_source);

  13. dev=dev_get_by_name(&init_net,E1);

  14. skb->dev=dev;//更改网卡发出

  15. dev_queue_xmit(skb);

  16. return NF_STOLEN;        
复制代码


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

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP