用户态程序创建虚拟网卡

TUN 和 TAP 的区别

  • TUN (Network TUNnel):TUN 设备工作在网络层,模拟的是网络层设备,主要处理 IP 数据包。TUN 设备会将用户态发送的数据作为 IP 数据包传递到内核的网络层。
  • TAP (Network TAP):TAP 设备工作在数据链路层,模拟的是以太网设备,处理以太网帧。它可以处理整个以太网帧,通常用于创建虚拟网络的桥接。

用户态程序创建虚拟网卡

1. 打开字符设备 /dev/net/tun

  • 这个字符设备是 TUN/TAP 虚拟网络设备的入口点,用户态程序通过打开它来获得对虚拟网络设备的访问。
  • 使用 open() 系统调用打开 /dev/net/tun 字符设备,成功后将获得一个文件描述符(fd),这个文件描述符将用于后续操作。
int fd = open("/dev/net/tun", O_RDWR);
if (fd < 0) {
    perror("Opening /dev/net/tun");
    return fd;
}

/dev/net/tun 是 Linux 系统中用于支持 TUN/TAP 虚拟网络设备的字符设备文件。它为用户态程序提供了一个接口,通过该接口,程序可以创建和管理虚拟网络接口(TUN 或 TAP 设备),并通过文件描述符与内核进行网络数据的读写操作。

2. 准备 ifreq 结构体并使用 TUNSETIFF 命令字进行 ioctl 调用

  • struct ifreq 是一个用于配置网络接口的标准结构体,其中包含虚拟网卡的名字、类型(TUN 或 TAP)等信息。
  • 在创建虚拟网卡时,程序需要使用 ioctl() 系统调用,将该结构体传递给内核来创建虚拟网卡。
  • 具体来说,TUNSETIFF 命令字会将用户态的请求发送到内核,要求创建一个虚拟网卡。
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));

// 设置虚拟网卡名字,比如 "tun0"
strncpy(ifr.ifr_name, "tun0", IFNAMSIZ);

// 设置为 TUN 模式,或者 TAP 模式(IFF_TAP),并且将接口配置为非多路复用
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;

// 使用 ioctl 创建虚拟网卡
if (ioctl(fd, TUNSETIFF, (void *)&ifr) < 0) {
    perror("ioctl TUNSETIFF");
    close(fd);
    return -1;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值