tun/tap 驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装。利用tun/tap 驱动,可以将tcp/ip协议栈处理好的网络分包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到物理链路中。
开源项目openvpn ( http://openvpn.sourceforge.net)和Vtun( http://vtun.sourceforge.net)都是利用tun/tap驱动实现的隧道封装。
有时候,为了服务器测试,或虚拟机应用(VMware就自带了,但VBox没有),我们会需要一个虚拟网卡,这对Linuxer来说真是太简单了
如果使用Ubuntu,安装一条命令就够了
sudo apt-get install uml-utilities现在,我们可以来创建虚拟网卡了
tunctl -t tap0 -u peter创建了一个名为tap0的虚拟网卡(就象第一块网卡通常称为eth0),拥有者是用户peter。不过这里的拥有者不是指创建的设备文件/dev/net/tun的拥有者,有些应用可能需要对/dev/net/tun拥有写权限,需要另行处理,一个简单的办法就是把该用户加入uml-net用户组。
删除虚拟网卡tap0可以这样
tunctl -d tap0我们可以象配置eth0那样配置它:
ifconfig tap0 192.168.0.12 netmask 255.255.255.0如果需要一开机就自动创建,并且配置好,你可以在 /etc/network/interfaces中添加如下内容
auto tap0 iface tap0 inet manual up ifconfig $IFACE 192.168.0.12 up down ifconfig $IFACE down tunctl_user peter
如果你很好奇这一切是怎么创建的,可以查看interfaces的man页,以及/etc/network/if-*目录下的uml-utilities文件。
下面使我系统上的创建例程:
root@ubuntu:~# apt-get install uml-utilities正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
建议安装的软件包:
user-mode-linux
下列【新】软件包将被安装:
uml-utilities
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 52 个软件包未被升级。
需要下载 58.5 kB 的软件包。
解压缩后会消耗掉 336 kB 的额外空间。
获取:1 http://cn.archive.ubuntu.com/ubuntu/ natty/universe uml-utilities i386 20070815-1.1ubuntu2 [58.5 kB]
下载 58.5 kB,耗时 1秒 (46.1 kB/s)
选中了曾被取消选择的软件包 uml-utilities。
(正在读取数据库 ... 系统当前共安装有 184633 个文件和目录。)
正在解压缩 uml-utilities (从 .../uml-utilities_20070815-1.1ubuntu2_i386.deb) ...
正在处理用于 man-db 的触发器...
正在处理用于 ureadahead 的触发器...
ureadahead will be reprofiled on next reboot
正在设置 uml-utilities (20070815-1.1ubuntu2) ...
* Starting User-mode networking switch uml_switch [ OK ]
root@ubuntu:~# tunctl -t tap0 -u root
Set 'tap0' persistent and owned by uid 0
root@ubuntu:~# ifconfig
eth0 Link encap:以太网 硬件地址 f0:4d:a2:eb:d1:da
inet 地址:192.168.15.20 广播:192.168.15.255 掩码:255.255.255.0
inet6 地址: fe80::f24d:a2ff:feeb:d1da/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:269800 错误:0 丢弃:24 过载:0 帧数:0
发送数据包:24588 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:31748279 (31.7 MB) 发送字节:3586783 (3.5 MB)
中断:19
lo Link encap:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 跃点数:1
接收数据包:8925 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:8925 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:1067385 (1.0 MB) 发送字节:1067385 (1.0 MB)
root@ubuntu:~# ifconfig tap0 192.168.15.252 netmask 255.255.255.0
root@ubuntu:~# ifconfig
eth0 Link encap:以太网 硬件地址 f0:4d:a2:eb:d1:da
inet 地址:192.168.15.20 广播:192.168.15.255 掩码:255.255.255.0
inet6 地址: fe80::f24d:a2ff:feeb:d1da/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:271081 错误:0 丢弃:24 过载:0 帧数:0
发送数据包:24613 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:31837822 (31.8 MB) 发送字节:3589830 (3.5 MB)
中断:19
lo Link encap:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 跃点数:1
接收数据包:8925 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:8925 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:1067385 (1.0 MB) 发送字节:1067385 (1.0 MB)
tap0 Link encap:以太网 硬件地址 d6:6b:43:4c:26:a0
inet 地址:192.168.15.252 广播:192.168.15.255 掩码:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 跃点数:1
接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:0 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:500
接收字节:0 (0.0 B) 发送字节:0 (0.0 B)
root@ubuntu:~# ping 192.168.15.252
PING 192.168.15.252 (192.168.15.252) 56(84) bytes of data.
64 bytes from 192.168.15.252: icmp_req=1 ttl=64 time=0.043 ms
64 bytes from 192.168.15.252: icmp_req=2 ttl=64 time=0.032 ms
64 bytes from 192.168.15.252: icmp_req=3 ttl=64 time=0.041 ms
64 bytes from 192.168.15.252: icmp_req=4 ttl=64 time=0.037 ms
^C
--- 192.168.15.252 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2998ms
rtt min/avg/max/mdev = 0.032/0.038/0.043/0.006 ms