Tun Tap区别
现在统一的说法是:
TUN是点对点的三层设备,工作在IP层,处理IP分组;
TAP是虚拟以太网设备,工作在第二层,处理以太网帧;
而以下查得的资料也印证了这一点:
摘自Universal TUN/TAP device driver的FAQ:
The TUN is Virtual Point-to-Point network device.TUN driver was designed as low level kernel support for IP tunneling.
The TAP is a Virtual Ethernet network device.TAP driver was designed as low level kernel support for Ethernet tunneling.
TUN works with IP frames. TAP works with Ethernet frames
摘自OpenVPN的FAQ:The difference between a tun and tap device is this: a tun device is a virtual IP point-to-point device and a tap device is a virtual ethernet device.
其实这只是一面,说的很笼统,下面看一些更多的不同:
1、设备号大不同。
TUN 设备号是10 200,是字符设备下的misc设备,在2.6内核的miscdevice.h中定义的TUN_MINOR(从设备号)也是200;而TAP的是36 16,字符设备的netlink支持。
参见device-list(2008-3):
http://www.lanana.org/docs/device-list/devices-2.6+.txt
2、显然,设备号的不同导致了文件节点的不同:
TUN:/dev/net/tun
TAP:/dev/tap0
但是Universal TUN/TAP device driver的似乎是/dev/tun的类型,仔细发现这是在2.4内核之前的,在2.6以后,TUN设备就会对应于文件/dev/net/tun。
3、补充一下,从其他资料偶尔看到了:
TAP:子网掩码是/24,255.255.255.0,对应以太网设备
TUN:子网掩码是/30,255.255.255.252,点对点设备。
最后,在VTUN源代码咋实现open设备的打开时,TAP和TUN也是分开的,好像有两个TUN,一个是/dev/tun的节点(不包含<linux/if_tun.h>),一个是/dev/net/tun(包含<linux/if_tun.h>)。前者看来是为了2.4的核而设置的。
总结一下吧(主要是TUN设备的困惑,TAP就没有):
2.4的核:TUN 设备号是36 16+,文件节点:/dev/tun0
2.6的核:TUN 设备号是10 200,文件节点:/dev/net/tun
补充一下,其实具体是TUN或者是TAP,都不是在open打开设备的文件节点时就确定的。文件节点只是内核提供给用户的接口而已,应用程序需要ioctl
设置自己的虚拟网络设备的工作模式,是TUN还是TAP。
所以上面第二点的理解,需要变通一下!
Tun/Tap驱动程序工作原理
Tun/Tap网卡创建
1. 确认内核是否支持tun/tap
-
确认内核是否有tun模块
[root@hunterfu]# modinfo tun filename: /lib/modules/2.6.34.7-56.fc13.i686.PAE/kernel/drivers/net/tun.ko alias: char-major-10-200 license: GPL author: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com> description: Universal TUN/TAP device driver srcversion: 880DE258930FE60D765B735 depends: vermagic: 2.6.34.7-56.fc13.i686.PAE SMP mod_unload 686
-
加载内核模块 -
[root@hunterfu ~]# modprobe tun [root@hunterfu ~]# lsmod | grep tun tun 10548 1
执行以上命令后,出现如上输出,说明模块加载成功
2. 创建和配置虚拟网卡
-
确认是否有tunctl命令,如果没有通过yum安装即可
[root@hunterfu ~]# yum install tunctl
-
创建虚拟网卡设备
[root@hunterfu ~]# tunctl -t tap0 -u root
-
设置虚拟网卡
[root@hunterfu ~]# ifconfig tap0 192.168.0.1 netmask 255.255.255.0 promisc
经过如上操作后,虚拟网卡已经建立和配置好了。
3. 作为系统服务随系统自动启动创建虚拟网卡
-
编写配置脚本(符合chkconfig规范)
[root@hunterfu ~]# cat /etc/init.d/config_tap #!/bin/bash # # config_tap Start up the tun/tap virtual nic # # chkconfig: 2345 55 25 USER="root" TAP_NETWORK="192.168.0.1" TAP_DEV_NUM=0 DESC="TAP config" do_start() { if [ ! -x /usr/sbin/tunctl ]; then echo "/usr/sbin/tunctl was NOT found!" exit 1 fi tunctl -t tap$TAP_DEV_NUM -u root ifconfig tap$TAP_DEV_NUM ${TAP_NETWORK} netmask 255.255.255.0 promisc ifconfig tap$TAP_DEV_NUM } do_stop() { ifconfig tap$TAP_DEV_NUM down } do_restart() { do_stop do_start } check_status() { ifconfig tap$TAP_DEV_NUM } case $1 in start) do_start;; stop) do_stop;; restart) do_restart;; status) echo "Status of $DESC: " check_status exit "$?" ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac
可以根据具体需求修改此脚本
-
加入到系统服务中
[root@hunterfu ~]# chkconfig --add config_tap [root@hunterfu ~]# chkconfig --level 345 config_tap on
- 操作完成后,就可以像其他标准服务一样,通过service config_tap start来进行创建和启动操作