tap和tun

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

猜你喜欢

转载自haoningabc.iteye.com/blog/2303122