linux下TUN/TAP虚拟网卡的使用

https://blog.csdn.net/bytxl/article/details/26586109

在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能。
TAP 等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN模拟了网络层设备,操作第三层数据包比如IP数据封包。
操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据。在后种情况下,TUN/TAP设备向操作系统的网络栈投递(或“注入”)数据包,从而模拟从外部接受数据的过程。
服务器如果拥有TUN/TAP模块,就可以开启VPN代理功能。

tun/tap 驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装。利用tun/tap 驱动,可以将tcp/ip协议栈处理好的网络分包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到物理链路中。
开源项目openvpn (http://openvpn.sourceforge.net)和Vtun(http://vtun.sourceforge.net)都是利用tun/tap驱动实现的隧道封装。

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。

所以上面第二点的理解,需要变通一下!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值