- 論壇徽章:
- 0
|
本帖最后由 stoic978 于 2020-09-13 20:21 編輯
目的:兩臺(tái)虛擬機(jī)分別有兩個(gè)網(wǎng)口,對(duì)應(yīng)兩個(gè)網(wǎng)段,想把一個(gè)網(wǎng)段本來(lái)由eth0發(fā)送的數(shù)據(jù)包修改,改為由另一網(wǎng)卡eth1接收發(fā)送,
兩臺(tái)虛擬機(jī)分別為A、B,每個(gè)虛擬機(jī)有兩個(gè)網(wǎng)卡,對(duì)應(yīng)兩個(gè)網(wǎng)段,想要在虛擬機(jī)上實(shí)現(xiàn)任何的tcp報(bào)文都走網(wǎng)卡eth1發(fā)出,由B的eth1接收,兩個(gè)主機(jī)正常通信。
個(gè)人的實(shí)現(xiàn)方法,在net_post_routing的hook點(diǎn)截獲skb,更改源mac地址和目的mac地址,并更改skb->dev使原本由主機(jī)A的eth0發(fā)出的tcp包由eth1發(fā)出,并到達(dá)到達(dá)主機(jī)B的eth1,并上傳協(xié)議棧,不影響通信。
目前使用sendip由eth0發(fā)送數(shù)據(jù)包,可以在eth1的發(fā)送端和接收端都抓到包,而使用Telnet連接主機(jī)B的eth0的對(duì)應(yīng)網(wǎng)段,在兩端都抓不到包。
請(qǐng)問(wèn)是我的思路哪里出現(xiàn)了問(wèn)題嗎?同樣的方法我修改ICMP包,使用主機(jī)A來(lái)ping主機(jī)B的eth0的網(wǎng)段,在eth1上能抓到包,且eth0正常收到回應(yīng)包,為什么TCP會(huì)無(wú)法建立連接
源碼如下:- skb->mac_header=2;//這里手動(dòng)改了這個(gè)值,skb—>指向ip頭時(shí),被置為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;//更改網(wǎng)卡發(fā)出
- dev_queue_xmit(skb);
- return NF_STOLEN;
復(fù)制代碼
|
|