tap in the second layer
lsmod|grep tun
the use of TUN/TAP virtual network card under linux
http://www.tuicool.com/articles/mu6vY3
ibm article
http://www.ibm.com/developerworks/cn /linux/l-tuntap/
skb_buffer
http://blog.chinaunix.net/uid-21768364-id-209652.html
modinfo tun do modprobe lsmod | grep tun yum install tunctl -y
centos7 is gone
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
Establish tunctl -t tap0 -u root remove use tunctl -d tap0
Set up bridging,
connect the local network eth0 to the tap device through the bridge, so that the tap device can communicate with the outside world
ip link ifconfig eth0 0.0.0.0 promisc brctl addif br0 eth0 ip link set br0 up dhclient br0 brctl addif br0 tap0
Set up the network for the tap
ifconfig tap0 10.0.2.2 netmask 255.255.255.0 promisc
http://blog.csdn.net/ixidof/article/details/10148899
The code of tunctl is very simple:
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; do = 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': do = 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); }
Execute the compilation:
gcc -g -Wall -o tunctl tunctl.c