`
haoningabc
  • 浏览: 1475118 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

linux下TUN/TAP虚拟网卡的使用

tap 
阅读更多
tun在网络层
tap在二层
lsmod|grep tun

linux下TUN/TAP虚拟网卡的使用
http://www.tuicool.com/articles/mu6vY3
ibm的文章
http://www.ibm.com/developerworks/cn/linux/l-tuntap/
skb_buffer
http://blog.chinaunix.net/uid-21768364-id-209652.html


modinfo tun
modprobe tun
lsmod|grep tun
yum install tunctl -y

centos7没有了
http://heanet.dl.sourceforge.net/project/tunctl/tunctl/1.5/tunctl-1.5.tar.gz
http://netassist.dl.sourceforge.net/project/tunctl/tunctl/1.5/tunctl-1.5.tar.gz
yum install docbook* -y
tar zxvf tunctl-1.5.tar.gz
cd tunctl-1.5
make
make install


http://www.blogjava.net/kuuyee/archive/2010/12/07/339987.html
http://www.tuicool.com/articles/mu6vY3

建立
tunctl -t tap0 -u root
删除使用
tunctl -d tap0


设置桥接,
把本机网络eth0通过桥接,连到tap设备上,使tap设备能和外部通信
ip link
ifconfig eth0 0.0.0.0 promisc
brctl addif br0 eth0
ip link set br0 up
dhclient br0
brctl addif br0 tap0


给tap设置网络

ifconfig tap0 10.0.2.2  netmask 255.255.255.0 promisc


http://blog.csdn.net/ixidof/article/details/10148899

tunctl的代码非常简单:
tunctl.c:
/* Copyright 2002 Jeff Dike
 * Licensed under the GPL
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <linux/if_tun.h>

/* TUNSETGROUP appeared in 2.6.23 */
#ifndef TUNSETGROUP
#define TUNSETGROUP   _IOW('T', 206, int)
#endif

static void Usage(char *name)
{
  fprintf(stderr, "Create: %s [-b] [-u owner] [-g group] [-t device-name] "
          "[-p|-n] [-f tun-clone-device]\n", name);
  fprintf(stderr, "Delete: %s -d device-name [-f tun-clone-device]\n\n",
          name);
  fprintf(stderr, "The default tun clone device is /dev/net/tun - some systems"
          " use\n/dev/misc/net/tun instead\n\n");
  fprintf(stderr, "-b will result in brief output (just the device name)\n");
  fprintf(stderr, "-n will result in a point-to-point tun device,\n");
  fprintf(stderr, "-p in an ethernet tap device. Default is a tap,\n");
  fprintf(stderr, "   except the device contains \"tun\" in the name.\n");
  exit(1);
}

int main(int argc, char **argv)
{
  struct ifreq ifr;
  struct passwd *pw;
  struct group *gr;
  uid_t owner = -1;
  gid_t group = -1;
  int tap_fd, opt, delete = 0, brief = 0, type = 0;
  char *tun = "", *file = "/dev/net/tun", *name = argv[0], *end;

  while((opt = getopt(argc, argv, "bd:f:npt:u:g:h")) > 0){
    switch(opt) {
      case 'b':
        brief = 1;
        break;
      case 'd':
        delete = 1;
        tun = optarg;
        break;
      case 'f':
        file = optarg;
        break;
      case 'p':
        if(type != 0)
          Usage(name);
        type = IFF_TAP;
        break;
      case 'n':
        if(type != 0)
          Usage(name);
        type = IFF_TUN;
        break;
      case 'u':
        pw = getpwnam(optarg);
        if(pw != NULL){
          owner = pw->pw_uid;
          break;
        }
        owner = strtol(optarg, &end, 0);
        if(*end != '\0'){
          fprintf(stderr, "'%s' is neither a username nor a numeric uid.\n",
                  optarg);
          Usage(name);
        }
        break;
      case 'g':
        gr = getgrnam(optarg);
        if(gr != NULL){
          group = gr->gr_gid;
          break;
        }
        group = strtol(optarg, &end, 0);
        if(*end != '\0'){
          fprintf(stderr, "'%s' is neither a groupname nor a numeric group.\n",
                  optarg);
          Usage(name);
        }
        break;

      case 't':
        tun = optarg;
        break;
      case '?':
      case 'h':
      default:
        Usage(name);
    }
  }

  argv += optind;
  argc -= optind;

  if(argc > 0)
    Usage(name);

  if((tap_fd = open(file, O_RDWR)) < 0){
    fprintf(stderr, "Failed to open '%s' : ", file);
    perror("");
    exit(1);
  }

  if(type == 0) {
    type = strstr(tun, "tun") ? IFF_TUN : IFF_TAP;
  }

  memset(&ifr, 0, sizeof(ifr));

  ifr.ifr_flags = type | IFF_NO_PI;
  strncpy(ifr.ifr_name, tun, sizeof(ifr.ifr_name) - 1);
  if(ioctl(tap_fd, TUNSETIFF, (void *) &ifr) < 0){
    perror("TUNSETIFF");
    exit(1);
  }

  if(delete){
    if(ioctl(tap_fd, TUNSETPERSIST, 0) < 0){
      perror("disabling TUNSETPERSIST");
      exit(1);
    }
    printf("Set '%s' nonpersistent\n", ifr.ifr_name);
  }
  else {
    /* emulate behaviour prior to TUNSETGROUP */
    if(owner == -1 && group == -1) {
      owner = geteuid();
    }

    if(owner != -1) {
      if(ioctl(tap_fd, TUNSETOWNER, owner) < 0){
        perror("TUNSETOWNER");
        exit(1);
      }
    }
    if(group != -1) {
      if(ioctl(tap_fd, TUNSETGROUP, group) < 0){
        perror("TUNSETGROUP");
        exit(1);
      }
    }

    if(ioctl(tap_fd, TUNSETPERSIST, 1) < 0){
      perror("enabling TUNSETPERSIST");
      exit(1);
    }

    if(brief)
      printf("%s\n", ifr.ifr_name);
    else {
      printf("Set '%s' persistent and owned by", ifr.ifr_name);
      if(owner != -1)
          printf(" uid %d", owner);
      if(group != -1)
          printf(" gid %d", group);
      printf("\n");
    }
  }
  return(0);
}


执行编译:
gcc -g -Wall -o tunctl tunctl.c
分享到:
评论

相关推荐

    论文研究-TUN/TAP虚拟网卡设备在Ad-hoc组网中的应用与实现 .pdf

    TUN/TAP虚拟网卡设备在Ad-hoc组网中的应用与实现,蔡佳翌,李绍胜,极限场景下的通信是工程师们最容易忽略,而关键时刻却又至关重要的研究重点之一。因自然灾害或战争形成的重灾区,基础通信设施往

    网络编程中使用tun虚拟网络接口建立IP隧道的实例

    本文简单介绍一下Linux虚拟网卡的概念,并以tun设备为例在客户端和服务器端分别建立一个实际的虚拟网卡,最终实现一个从客户端到服务器的简单的IP隧道,希望本文能对理解虚拟网卡和IP隧道有所帮助,本文将提供完整的...

    linux代码分析

    Tun/Tap驱动是Linux内核中用于创建虚拟网络接口的关键组件,它在软件层面模拟了网络硬件的行为,使得无需实际物理网络设备就能进行网络数据包的收发。这种虚拟化技术在网络安全测试、虚拟机网络配置以及网络隔离等...

    Embeded linux之网卡驱动.docx

    TUN/TAP设备支持为用户提供了一种在用户空间接收和发送数据包的能力,可以用来虚拟网卡或点对点通道。 **使用环境:** - 当用户空间的程序需要使用TAP设备来实现特定功能时,例如创建虚拟网络环境或进行网络测试。 ...

    vmware中linux怎么设置网络.docx

    需要确保内核支持TUN/TAP设备驱动,然后可以像配置物理网卡一样配置虚拟网络设备。 - 如果内核不支持,可以通过重新编译内核,将TUN/TAP设备驱动设为模块(M)。 以上就是在VMware中配置Linux网络的基本步骤和相关...

    77-配置 linux-bridge mechanism driver1

    例如,一个名为 br0 的 Linux Bridge 可以将物理网卡 eth0 和通过 TAP(Tun/Tun)设备连接的虚拟网卡 vnet0/vnet1 连接在一起。这样,虚拟机 VM1 和 VM2 就可以像在同一个物理交换机上一样相互通信,并且能够通过 ...

    Ubuntu18.04下的KVM网络配置(附各种问题解答)

    KVM(Kernel-based Virtual Machine)是一种开源的虚拟机软件,能够在 Linux 操作系统上实现虚拟化技术。配置 KVM 网络需要了解网桥模式的配置方法,以下是详细的配置步骤和相关知识点。 一、网桥模式的配置方法 1...

    虚拟化技术

    - **BT(Binary Translation)**:通过软件实现的完全虚拟化,例如使用模拟器。 - **HVM(Hardware-Assisted Virtualization)**:利用现代处理器提供的硬件辅助虚拟化功能实现。 - **半虚拟化(Para-...

    qemu-kvm配置bridge

    - tunctl:配置TUN/TAP虚拟网络接口。 - libvirt:提供虚拟化管理的库和API。 - qemu-kvm:KVM虚拟机的运行时环境。 3. 配置桥接网络接口:创建一个新的网络配置文件,设置一个桥接设备br0,将其绑定到物理网络接口...

    OpenStack-Neutron架构

    1. **TAP/TUN/VETH**:TAP/TUN是Linux内核实现的一对虚拟网络设备,TAP工作在二层,TUN工作在三层。它们为用户程序提供了类似物理网络设备的操作能力,可以用来实现虚拟网卡等功能。VETH设备则成对出现,可以理解为...

    基于virtio-user的新exception path方案.pdf

    3. FlowBifurcation:利用SR-IOV能力虚拟出多张网卡(一个物理功能PF和多个虚拟功能VF),利用网卡分流引擎将特定网络流导向内核驱动控制的虚拟网卡。此方案依赖于硬件的包分类和过滤能力,缺乏灵活性。 DPDK v...

    KVM 安装配置和常见操作.pdf

    此外,还需安装`tunctl`来管理TUN/TAP设备,以支持某些网络配置。 在配置网络时,通常选择桥接模式,使虚拟机直接接入物理网络。这需要禁用NetworkManager服务,并创建一个新的桥接设备,如`br0`。在`/etc/...

    128-OVS 中的各种网络设备1

    1. Tap INTERFACE:命名为 tapXXXX,用于连接 instance 的虚拟网卡。 2. Linux Bridge:命名为 qbrXXXX,用于连接虚拟网络设备和物理网卡。 3. Veth Pair:命名为 qvbXXXX, qvoXXXX,用于连接 Linux Bridge 和 ...

    KVM 安装配置和常见操作 (2).docx

    首先,安装`tunctl`,用于创建TUN/TAP设备: ``` wget tunctl-1.5.tar.gz tar xzvf tunctl-1.5.tar.gz cd tunctl-1.5 make make install ``` 接下来,禁用NetworkManager,因为它可能与桥接网络冲突: `...

    dpdk记录文档

    - **内核网络接口库(KNI)**:类似于Linux的TUN/TAP接口,但提供了更高的性能,支持单个物理网口虚拟化为多个KNI接口。 ### 日志系统篇 #### 全局日志变量rte_logs - **结构体定义**: ```c struct rte_logs ...

    OpenStack网络管理

    1. **网卡虚拟化**: - **TAP设备**:是一种二层设备,可以在Linux内核和用户空间之间传输数据帧。 - **TUN设备**:是一种三层设备,用于在Linux内核和用户空间之间传输IP数据包。 - **VETH**:是一种成对出现的...

Global site tag (gtag.js) - Google Analytics