linux下使用tun/tap虚拟网卡

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u.意思

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值