Linux TUN/TAP

Description

TUN/TAP provides packet reception and transmission for user space programs.

It can be seen as a simple Point-to-Point or Ethernet device, which,

instead of receiving packets from physical media, receives them from

user space program and instead of sending packets via physical media

writes them to the user space program.

/* demo.c */
#include <fcntl.h>  
#include <string.h>  
#include <stdio.h>  
#include <stdlib.h> 
#include <sys/ioctl.h> 
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/if.h>
#include <linux/if_tun.h>

int tun_open(char *devname)
{
    struct ifreq ifr;
    int fd, err;

    if ( (fd = open("/dev/net/tun", O_RDWR)) == -1 ) {
        perror("open /dev/net/tun");
        return -1;
    }

    memset(&ifr, 0, sizeof(ifr));
    ifr.ifr_flags = IFF_TUN;
    strncpy(ifr.ifr_name, devname, IFNAMSIZ);  

    
    if ( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) == -1 ) {
        perror("ioctl TUNSETIFF");
        close(fd);
        return -1;
    }

  return fd;
}

int main(int argc, char **argv)
{
    int i, fd, nbytes;
    char buf[2048];

    fd = tun_open("tun0") ;
    printf("Device tun0 opened\n");

    while(1) {
        nbytes = read(fd, buf, sizeof(buf));
        printf("Read %d bytes from tun0\n", nbytes);
        for( i = 0; i < nbytes; i++)  
          printf("%02x ", buf[i]);  
        printf("\n");
    }

    return 0;
}

Terminal1:

[[email protected] sf_share]$ make demo

cc     demo.c   -o demo

[[email protected] sf_share]$ ./demo

Device tun0 opened

Terminal2:

[[email protected] sf_share]$ ifconfig tun0 172.16.0.0/16 up

[[email protected] sf_share]$ ping 172.16.66.88

Termina 1 OutPut:

Read 88 bytes from tun0

00 00 08 00 45 00 00 54 00 00 40 00 40 01 7e ffffff87 ffffffac 10 00 00 ffffffac 10 64 01 08 00 05 ffffffdc 73 0c 00 01 ffffffb2 38 24 58 00 00 00 00 ffffffe2 ffffffb2 07 00 00 00 00 00 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37

Read 88 bytes from tun0

00 00 08 00 45 00 00 54 00 00 40 00 40 01 7e ffffff87 ffffffac 10 00 00 ffffffac 10 64 01 08 00 2b ffffffdc 73 0c 00 02 ffffffb3 38 24 58 00 00 00 00 ffffffbb ffffffb1 07 00 00 00 00 00 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37

Read 88 bytes from tun0

00 00 08 00 45 00 00 54 00 00 40 00 40 01 7e ffffff87 ffffffac 10 00 00 ffffffac 10 64 01 08 00 5f ffffffdb 73 0c 00 03 ffffffb4 38 24 58 00 00 00 00 ffffff86 ffffffb1 07 00 00 00 00 00 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37

时间: 2024-10-10 05:56:26

Linux TUN/TAP的相关文章

Linux下Tun/Tap设备通信原理

Tun/Tap都是虚拟网卡,没有直接映射到物理网卡,是一种纯软件的实现.Tun是三层虚拟设备,能够处理三层即IP包,Tap是二层设备,能处理链路层网络包如以太网包.使用虚拟网络设备,可以实现隧道,如OpenVPN的实现.这篇文章我主要根据自己画的一个图来简单说明在隧道实现中两个虚拟网络设备数据包的流程. 上面的图中,左右两边分别为两台机器.一台有一块物理网卡配置了IP:172.16.1.11,这台机器的系统里有一个Tun(以Tun为例,不讲Tap了)设备,配置了IP:192.168.1.11;

Linux中的TUN/TAP设备

今天才发现这家伙...怎么讲...深以为耻.晚上的任务是加深对它的了解,就这么定了. 1. General questions.1.1 What is the TUN ?  The TUN is Virtual Point-to-Point network device. TUN driver was designed as low level kernel support for IP tunneling. It provides to userland application two int

虚拟网卡TUN/TAP 驱动程序设计原理

昨天韦哥写了<Linux下Tun/Tap设备通信原理>一文,只提到了两个使用Tun的用户进程之间的通信路径,并没有说明Tun虚拟网卡驱动是如何实现的,而正好看到了这里的一篇讲解这方面的文章,果断转载了,感谢作者,原文在这里:虚拟网卡TUN/TAP 驱动程序设计原理 简介 虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在linux环境下的设计思路. tun

CentOS下使用TUN/TAP虚拟网卡的基本教程

在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备.不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能.TAP 等同于一个以太网设备,它操作第二层数据包如以太网数据帧.TUN模拟了网络层设备,操作第三层数据包比如IP数据封包.操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据.在后种情况下,TUN/TAP设备向

[原]openstack-networking-neutron(二)---tun/tap

简介 虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在linux环境下的设计思路. tun/tap驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装.利用tun/tap驱动,可以将tcp/ip协议栈处理好的网络分包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到物理链

ubuntu14.04安装tun/tap网络设备

14.04的系统默认是没有tun设备的,所以需要通过在内核中编译时勾选此设备.接下来分步来介绍如何安装tun设备. 一.更新ubuntu桌面版源: sudo gedit /etc/apt/sources.list deb http://mirrors.yun-idc.com/ubuntu/ trusty main restricted universe multiverse deb http://mirrors.yun-idc.com/ubuntu/ trusty-security main r

【华为云技术分享】《跟唐老师学习云网络》 - TUN/TAP网线

介绍TUN/TAP设备的概念和常见作用(即打通VM和Host间的网络),以及和Veth-pair网线的区别.这一节内部比较简单,因为主要内容已经在Veth网线里面讲了. 什么是TUN/TAP TUN/TAP是Linux中一种虚拟出来的网络设备,简单说,它也是一种“网线”,只是这种网线和Veth牌网线有点不同.Veth网线的2头是一样的,都是水晶头.TUN/TAP网线的2头长得不一样,一头是水晶头,另一头是USB的. 稍正式一点的描述,它是一种用户空间和内核空间传输报文用的网线.一头是普通的网卡,

TUN/TAP设备浅析

https://www.jianshu.com/p/660e69326e65 在 linux 2.4 及之后的内核版本中,tun/tap 驱动是默认编译进内核中的. (tun编译到内核中, tap作为内核模块编译) TUN/TAP设备浅析(一) -- 原理浅析 https://www.jianshu.com/p/09f9375b7fa7 TUN/TAP设备浅析(二) -- TUN/TAP的编程 https://www.jianshu.com/p/ab91f7cd98cd TUN/TAP设备浅析(

ERROR: Cannot open TUN/TAP

把网关(wheezy)更新到jessie之后,系统里的openvpn起不来,查看一下日志报错: ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2) 进到/dev目录下发现根本就没有/dev/net/tun,然后我搜索内核中是否有这个模块: #ls /lib/modules/`uname -r`/kernel/drivers/net/tun.* /lib/modules/3.14-2-am