简体   繁体   English

转换从TUN接口接收的原始数据包数据

[英]Converting raw packet data received from a TUN interface

I'm trying to intercept packets going through a TUN interface. 我正在尝试拦截通过TUN接口的数据包。 I want to convert the raw packet information to readable information so i can use it later. 我想将原始数据包信息转换为可读信息,以便以后使用。

I'm using the following code: 我正在使用以下代码:

int main(){
    char tun_name[IFNAMSIZ];
    char data[1500];
    int nread = 0;
    int tun_fd = 0;

    /* Connect to the device */
    strcpy(tun_name, "tun1");
    tun_fd = tun_alloc(tun_name);  /* tun interface, no Ethernet headers*/
    if(tun_fd < 0){
        perror("Allocating interface");
        exit(1);
    }

    /* Now read data coming from the kernel */
    int i=0;
    int count=0;
    char src[INET_ADDRSTRLEN];
    u_int8_t protocol;

    while(1) {
        count ++;

        nread = read(tun_fd, data, sizeof(data));
        if(nread < 0) {
            perror("Reading from interface");
            close(tun_fd);
            exit(1);
        }

        struct ip *iphdr = (struct ip *) data;

        /* Do whatever with the data */
        printf("Packet N° %d\n", count);
        printf("Read %d bytes from device %s\n", nread, tun_name);

        protocol = iphdr->ip_p;
        inet_ntop(AF_INET, &(iphdr->ip_src), src, INET_ADDRSTRLEN);

        printf("\nProtocol: %d", protocol);
        printf("\nIP source address: %s", src);
        printf("\n\n");
    }
    return 0;
}

It seems that i can't read the protocol and the ip src address of the packet. 看来我看不到协议和数据包的ip src地址。 I'm getting weired results. 我得到奇怪的结果。

Can you help please?? 你能帮忙吗?

Thank you! 谢谢!

The problem was in this line: 问题出在这一行:

tun_fd = tun_alloc(tun_name);  /* tun interface, no Ethernet headers*/

Here is the definition of the function tun_alloc(): 这是函数tun_alloc()的定义:

int tun_alloc(char *dev) {

    struct ifreq ifr;
    int fd, err;
    char *clonedev = "/dev/net/tun";

    /* open the clone device */
    if( (fd = open(clonedev, O_RDWR)) < 0 ) {
        return fd;
    }

    /* preparation of the struct ifr, of type "struct ifreq" */
    memset(&ifr, 0, sizeof(ifr));

    ifr.ifr_flags = IFF_TUN;   /* IFF_TUN or IFF_TAP, plus maybe IFF_NO_PI */

    if (*dev) {
        strncpy(ifr.ifr_name, dev, IFNAMSIZ);
     }

    /* try to create the device */
    if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ) {
        close(fd); 
    return err;
    }
    strcpy(dev, ifr.ifr_name);
    return fd;

} }

Here, in the creation of the TUN interface, we must use the "IFF_NO_PI" flag to delete packet added information and receive just the raw packet. 在这里,在创建TUN接口时,我们必须使用“ IFF_NO_PI”标志来删除添加了数据包的信息并仅接收原始数据包。

So, we must use this: 因此,我们必须使用以下代码:

ifr.ifr_flags = IFF_TUN | IFF_NO_PI; 

instead of just: 而不只是:

ifr.ifr_flags = IFF_TUN; 

Hope it helps, Thank you. 希望对您有所帮助,谢谢。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM