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就可以使用了。