通过TUN/TAP自行构造网络包

503 阅读1分钟

1.TUN/TAP是什么

你的电脑是通过网卡来发送以及接收网络包来完成网络通信的,TUN/TAP是linux提供的虚拟网卡控制接口。其中,TUN对应的是存在ip地址的网络层设备,TAP对应的是存在mac地址的链路层设备。

2.为什么要使用TUN/TAP?

一般来说我们发送的网络包都是由应用程序直接调用操作系统给的接口完成网络栈协议的包装,发送网络包的具体内容我们无法控制,而使用TUN/TAP的话我们可以像读写文件一样对虚拟网卡进行操作,让虚拟网卡发送以及接收网络包。

3.一个简单的TUN/TAP驱动程序

#include <stdio.h>
#include <string.h>
#include <net/if.h>
#include <linux/if_tun.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    //ifreq-虚拟网卡结构体,
    struct ifreq ifr;
    int fd, status, io_status;

    memset(&ifr, 0, sizeof(ifr));
    //IFF_TAP,创建TAP设备
    ifr.ifr_flags = IFF_TAP;
    strcpy(ifr.ifr_name, "tap0");

    fd = open("/dev/net/tun", O_RDWR); 
    //通过ioctl对fd文件操作符进行TUNSETIFF设置,设置内容为ifr结构体
    if((io_status = ioctl(fd, TUNSETIFF, (void *)&ifr)) < 0){
        close(fd);
        puts("io control error");
        return io_status;
    };

    while(1){
        char p[] = "some data...";
        //此时我们即可通过虚拟网卡发送信息
        status = write(fd, p, sizeof(p));
        printf("status is %d\n", status);
        sleep(1);
    };
    return 0;
}

4.待配置的网络环境

上述代码我们已经成功虚拟了一个可发送数据的网卡,但是此虚拟网卡并没有一根“虚拟网线”与之相连,所以它无法向外界发送任何消息。所以我们还需要将这个虚拟网卡与我们的真实网卡连接。