C - IP4 数据包组装为 IP6 - libnet



我编写了一个C程序,它从链路层向上创建一个TCP/IPv4数据包。该程序的目标是接收具有开放套接字的单个数据包,可以是原始套接字,也可以是流套接字。数据包由以太网标头、TCP 标头和 ipv4 组成:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libnet.h>
#include <time.h>
uint8_t *randmac();    //creates my random source-mac, shady I know but I got 
//tired of typing in the same input over and over
void gateway();        //gets my standart gateway i.e. the router (as far as 
//I understand the ethernet layer is for the router 
//and tcp and ip for the rest of the net.)

int main() {
uint32_t src, dst, seq, ack;
char payload[1024], destip[16];
uint16_t sp = 2001, dp = 2000;
libnet_ptag_t tcp;
libnet_ptag_t ip4;
libnet_ptag_t eth;
char errbuf[LIBNET_ERRBUF_SIZE];
int i, bytes;
uint8_t *dstmc;     //destination mac address (router)
uint8_t *smc;       //source mac address
int  len;
libnet_t * l;
l = libnet_init(LIBNET_LINK, NULL, errbuf);
if(l == NULL)
//getting the destination ip-address, works all right...
//payload is fine too
smc = malloc(6);
gatemac = malloc(6);
libnet_seed_prand(l);
src = libnet_get_prand(LIBNET_PRu32);
seq = 0;
ack = libnet_get_prand(LIBNET_PRu32);
dst = libnet_name2addr4(l, destip, LIBNET_DONT_RESOLVE);
smc = randmac();
gateway();
//getting the rest of the required addresses etc, works as well...


tcp = libnet_build_tcp(sp, dp, seq, ack, TH_SYN, 0, 0, 0, LIBNET_TCP_H + 
sizeof(payload),(uint8_t *) payload, sizeof(payload), l, 0);
if(tcp == -1)
printf("(1)unable because: %sn", libnet_geterror(l));
perror("libnet_build_tcp()");
ip4 = libnet_build_ipv4(LIBNET_TCP_H + LIBNET_IPV4_H + sizeof(payload), 
IPPROTO_TCP, 1, 1024, 60, 0, 0, src, dst, NULL, 0, l, 0);   //or (uint8_t) 
if(ip4 == -1)
printf("(2)unable because: %sn", libnet_geterror(l));
perror("libnet_build_ipv4()");
eth = libnet_build_ethernet(gatemac, smc, ETHERTYPE_IP, NULL, 0, l, 0);
if(eth == -1)
printf("(3) unable because: %sn", libnet_geterror(l));
perror("libnet_build_ethernet()");

bytes = libnet_write(l);
//error handling
}

程序本身工作正常,没有错误,数据包被写入等等。但有趣的是:我无法使用任何类型的原始或 ipv4 插槽接收它们。所以我打开了tcpdump,看看数据包是否被发送,结果是:

13:43:24.003324 IP 74.253.145.81 > 192.168.88.130: hopopt
13:43:27.007860 IP 74.253.145.81 > 192.168.88.130: hopopt
//Random source address, I also sent multiple packets to eliminate the 
//chances of missing them.
//There is also no doubt that these are truly my programmed packets due to 
//their number and random addresses.

我做了一些研究,发现"hopopt"代表ipv6使用的逐跳扩展标头。当我清楚地使用 libnet_build_ipv4(( 函数时,为什么会发生这种情况。还有没有办法正确接收这些单个数据包或只是让它们成为正常的ipv4?

看起来,就像您没有使用正确的参数顺序libnet_build_ipv4

ip4 = libnet_build_ipv4(LIBNET_TCP_H + LIBNET_IPV4_H + sizeof(payload), 

IPPROTO_TCP, 1, 1024, 60, 0, 0, src, dst, NULL, 0, l, 0(;

正确的顺序是:

libnet_ptag_t libnet_build_ipv4 (u_int16_t len,
u_int8_t tos, u_int16_t id, u_int16_t frag,
u_int8_t ttl, u_int8_t prot, u_int16_t sum,
u_int32_t src, u_int32_t dst, u_int8_t * payload,
u_int32_t payload_s, libnet_t * l, libnet_ptag_t ptag);

因此,您的第六个参数(prot(是0,它与您在tcpdump中观察到的逐跳选项(hopopt(完全对应。

您可能想要类似以下内容:

ip4 = libnet_build_ipv4(LIBNET_TCP_H + LIBNET_IPV4_H + sizeof(payload), //len
0,           // tos
1234,        // some id
0,           // No fragment
0x40,        // Standard TTL (64)
IPPROTO_TCP, // Next protocol goes here
0,           // Checksum, auto-filled?
src,         // IP source address
dst,         // IP destination address
NULL,        // payload
0,           // payload length
l,           // libnet handle
0            // ptag
);

如果您修复参数的顺序,它应该按预期工作!另请参阅此处的 libnet 教程

相关内容

  • 没有找到相关文章

最新更新