TUN/TAP 设备

http://vtun.sourceforge.net/tun http://vtun.sourceforge.net ##概述 TUN/TAP虚拟网络设备为用户空间程序提供了网络数据包的发送和接收能力。他既可以当做点对点(Point-to-Point)设备(TUN),也可以当做以太网(Ethernet)设备(TAP)。实际上,不仅Linux支持TUN/TAP虚拟网络设备,其他UNIX也是支持的,他们之间只有少许差别。

要使用TUN/TAP, 1.首先需要通过open系统调用打开/dev/net/tun设备节点, 2.然后调用ioctl在内核中注册相应的网络设备,注册之后在/sys/class/net/目录下会出现tunXX或tapXX的目录。 3.当通过close关闭相关的设备描述符时网络设备,和相对应的路由会消失。

根据用户空间创建的TUN/TAP设备的不同,设备能承载的数据包也是不同的。TUN设备可以用来承载IP数据包,而TAP设备用来承载ethernet数据包。

##使用TUN/TAP的系统 1.linux openproxy代理程序。 2.android 蓝牙Tethering模块。

##配置设备节点 确保tun驱动模块已经在内核中加载

modprobe tun

如果linux系统启动过程中没有创建/dev/net/tun设备节点,可以通过如下方式创建配置 1.创建设备节点

mkdir /dev/net (如果这个目录不存在)
mknod /dev/net/tun c 10 200

2.设置权限 例如:

chmod 0666 /dev/net/tun

##用户空间编程

/usr/include/linux/if.h
/usr/include/linux/if_tun.h

####分配网络设备 下面的代码段分配了一个tun设备

  1 #include 
  2 #include 
  3 #include 
  4 #include  
  5 #include 
  6 #include 
  7 #include 
  8 #include 
  9 #include 
 10 #include 
 11 #include 
 12 
 13 int main(int argc, char** argv)
 14 {   
 15     printf("hello \n");
 16     struct ifreq ifr;
 17     int fd,err;
 18     if((fd = open("/dev/net/tun", O_RDWR)) < 0 ) {
 19          printf("open /dev/net/tun failed %s", strerror(errno));
 20           return 0;
 21     }
 22     
 23     memset(&ifr, 0, sizeof(ifr));
 24     
 25     /* Flags: IFF_TUN   - TUN device (no Ethernet headers)
 26      *        IFF_TAP   - TAP device
 27      *
 28      *        IFF_NO_PI - Do not provide packet information
 29      */
 30     ifr.ifr_flags = IFF_TUN;
 31     strncpy(ifr.ifr_name, "ruby", IFNAMSIZ);
 32     
 33     if((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){
 34          printf("close /dev/net/tun failed");
 35          close(fd);
 36          return err;
 37     }
 38     sleep(10000);
 39     if (fd > 0) {
 40         close(fd);
 41     }
 42     return 0;
 43 }

执行sudo tuntest后在/sys/class/net目录下会创建ruby的目录. 此时执行sudo ifconfig ruby up然后通过ifconfig可以看见设备已经启动

ruby[@ruby](http://my.oschina.net/u/1712):~$ ifconfig 
eth0      Link encap:以太网  硬件地址 64:00:6a:07:a2:2f  
          inet 地址:192.168.64.195  广播:192.168.64.255  掩码:255.255.255.0
          inet6 地址: fe80::6600:6aff:fe07:a22f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
          接收数据包:11525229 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:4667719 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000 
          接收字节:11810552102 (11.8 GB)  发送字节:470775666 (470.7 MB)

lo        Link encap:本地环回  
          inet 地址:127.0.0.1  掩码:255.0.0.0
          inet6 地址: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  跃点数:1
          接收数据包:233290 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:233290 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1 
          接收字节:62033189 (62.0 MB)  发送字节:62033189 (62.0 MB)

ruby      Link encap:未指定  硬件地址 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  跃点数:1
          接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:0 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:500 
          接收字节:0 (0.0 B)  发送字节:0 (0.0 B)

tap0      Link encap:以太网  硬件地址 aa:d0:43:6a:66:b3  
          inet 地址:10.154.209.135  广播:10.154.209.255  掩码:255.255.255.0
          inet6 地址: fe80::a8d0:43ff:fe6a:66b3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
          接收数据包:468 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:601 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:100 
          接收字节:321995 (321.9 KB)  发送字节:101515 (101.5 KB)

wlan2     Link encap:以太网  硬件地址 d8:fe:e3:5a:f9:bc  
          UP BROADCAST MULTICAST  MTU:1500  跃点数:1
          接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:0 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000 
          接收字节:0 (0.0 B)  发送字节:0 (0.0 B)

通过以上配置我们生成的虚拟网络设备ruby就可以使用了。

转载于:https://my.oschina.net/strikeboy/blog/710992

你可能感兴趣的:(TUN/TAP 设备)