Chinaunix
标题:
【求助】skb修改后发送
[打印本页]
作者:
stoic978
时间:
2020-09-11 22:26
标题:
【求助】skb修改后发送
本帖最后由 stoic978 于 2020-09-13 20:21 编辑
目的:两台虚拟机分别有两个网口,对应两个网段,想把一个网段本来由eth0发送的数据包修改,改为由另一网卡eth1接收发送,
两台虚拟机分别为
A
、
B
,每个虚拟机有两个网卡,对应两个网段,想要在虚拟机上实现任何的
tcp
报文都走网卡
eth1
发出,由
B
的
eth1
接收,两个主机正常通信。
个人的实现方法,在
net_post_routing
的
hook
点截获
skb
,更改源
mac
地址和目的
mac
地址,并更改
skb->dev
使原本由主机
A
的
eth0
发出的
tcp
包由
eth1
发出,并到达到达主机
B
的
eth1
,并上传协议栈,不影响通信。
目前使用
sendip
由
eth0
发送数据包,可以在
eth1
的发送端和接收端都抓到包,
而使用
Telnet
连接主机
B
的
eth0
的对应网段,在两端都抓不到包。
请问是我的思路哪里出现了问题吗?同样的方法我修改ICMP包,使用主机A来ping主机B的eth0的网段,在eth1上能抓到包,且eth0正常收到回应包,为什么TCP会无法建立连接
源码如下:
skb->mac_header=2;//这里手动改了这个值,skb—>指向ip头时,被置为0xffff(65535)
skb_push(skb,14);//skb->data指针上移
//ethd=eth_hdr(skb);
ethd=(struct ethhdr *)skb_mac_header(skb);
printk("the tcp skb-data is----%p-----",skb->data);
printk("the tcp eth is--------%p-----",ethd);//此处ethd与skb->data指针不一致。
//set mac
memcpy(ethd->h_dest,ens39_mac_d,6);//修改mac地址
memcpy(ethd->h_source,ens39_mac_s,6);
ethd->h_proto=__constant_htons (ETH_P_IP);
printk("the dest mac is-------%pM------",ethd->h_dest);
printk("the source mac is-----%pM-------",ethd->h_source);
dev=dev_get_by_name(&init_net,E1);
skb->dev=dev;//更改网卡发出
dev_queue_xmit(skb);
return NF_STOLEN;
复制代码
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2