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;
}

1007

被折叠的 条评论
为什么被折叠?



