tun/tap 驱动

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux TUN/TAP设备是一种虚拟网络设备,它能够模拟一个网络接口。通过TUN/TAP设备,用户空间的程序可以像操作物理网络设备一样,发送和接收网络数据包。 TUN/TAP设备主要有两种模式:TUN模式和TAP模式。TUN模式主要用于IP层协议,TAP模式主要用于以太网层协议。两种模式的差异在于数据包的处理方式不同。 在Linux内核中,TUN/TAP设备的实现位于`drivers/net/tun.c`文件中。该文件中定义了一个名为`tun_net`的网络设备对象,并实现了`tun_chr_write_iter()`、`tun_chr_read_iter()`等函数,用于处理用户空间和内核空间之间的数据交互。 当用户空间的程序打开TUN/TAP设备时,会创建一个名为`tunX`的虚拟接口,其中`X`是一个数字,表示设备的编号。内核会将数据包发送到该虚拟接口,然后用户空间的程序可以通过读取该接口的文件描述符来接收数据包。同样地,用户空间的程序可以通过写入该接口的文件描述符来发送数据包。 TUN/TAP设备的实现使用了内核中的网络协议栈,因此它能够与其他网络设备无缝交互。用户空间的程序可以使用标准的套接字接口来与TUN/TAP设备进行通信,实现虚拟网络设备和物理网络设备之间的数据交换。 总之,TUN/TAP设备是一个非常有用的工具,它可以用于各种网络应用程序,如虚拟私有网络(VPN)和网络隧道。通过了解TUN/TAP设备的实现,我们可以更好地理解网络协议栈和Linux内核的工作原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值