tun/tap虚拟网卡介绍
tun是一种虚拟网络设备,tun设备一端连接着用户程序,一端连接着内核协议栈,任何时候从协议栈发到tun网卡的数据都能从用户程序中读到,而从用户程序写入/dev/net/tun的数据都会被内核协议栈收到。通过程序打开/dev/net/tun设备时,就会发现主机上多了一张网卡,打开多次会新增多张网卡,命名依次为tun0/tun1/tun2…,读写tun网卡的方式与正常读写一个文件一样。
更多参考:https://blog.csdn.net/VE_Edge/article/details/122721863
创建虚拟网卡
创建虚拟网卡程序:tun.c
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <linux/if_tun.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{
int tun_fd, nread, err;
char buffer[1500];
struct ifreq ifr;
if ((tun_fd = open("/dev/net/tun", O_RDWR)) < 0) {
return tun_fd;
}
memset(&ifr, 0, sizeof(ifr));
/*
*ifr_flags:
* IFF_TUN:tun
* IFF_TAP:tap
*/
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
if ((err = ioctl(tun_fd, TUNSETIFF, (void *) &ifr)) < 0) {
close(tun_fd);
return err;
}
printf("open tun device: %s for reading...\n", ifr.ifr_name);
if (tun_fd < 0) {
perror("opening tun error");
exit(1);
}
while (1) {
nread = read(tun_fd, buffer, sizeof(buffer));
if (nread < 0) {
perror("reading tun error");
close(tun_fd);
exit(1);
}
printf("read %d bytes from %s\n", nread,ifr.ifr_name);
}
return 0;
}
使用虚拟网卡
编译运行会生成名字为tun0/tap0的网卡,运行虚拟网卡之前要确保系统已经加载tun.ko驱动
TUN 与 TAP 的区别
TUN 和 TAP 的区别在于工作的网络层次不同,用户程序通过 TUN 设备只能读写网络层的 IP 数据包,而 TAP 设备则支持读写链路层的数据包(通常是以太网数据包,带有 Ethernet headers)
tun.ko驱动
https://download.csdn.net/download/qq_43799679/86402345