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#include #include #include #include #include #include #include #include #include #include /* 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