TUN/TAP虚拟网络设备的原理:
在Linux内核中添加了TUN/TAP虚拟网络设备驱动程序和关联的字符设备/dev/net/tun。字符设备tun用作交换用户空间和内核空间数据的接口。内核向虚拟网络设备发送数据包时,数据包存储在与设备相关的队列中,在用户空间程序通过打开的字符设备tun的描述符读取之前,不会复制到用户空间的缓冲区中。这相当于数据包直接发送到用户空间。通过系统调用write发送数据包时的原理也类似。
TUN设备是允许程序轻松模拟网络行为的虚拟网络设备。
TUN模拟三层设备。这意味着可以在网络层处理数据,更一般地说,可以处理IP数据包。
首先,我们来看看物理设备是如何工作的。
对于某些无效数据包,可以选择删除堆栈。
如果实际上是作为本机数据包传递的数据包,并且该数据包实际上是上层应用程序所必需的,则堆栈通过套接字API通知上层正在等待的应用程序。
让我们看一下TUN的工作原理。
我们知道,普通网卡通过网线发送和接收数据包,而TUN设备比较特殊,通过设备文件发送和接收数据包。
如上图所示,tunX和上面的eth0在逻辑上是相同的,tunX表示网络接口,尽管系统通过软件进行了模拟。
网络接口tunX代表的虚拟网卡通过文件/dev/tunX连接到应用程序,应用程序每次使用系统调用时都会将数据写入此文件。此数据是网络层数据包,通过虚拟网卡通过网络接口tunX传递到网络堆栈。
此应用程序还可以读取通过系统调用通过/dev/tunX文件通过堆栈传递到tunX的所有数据包。
堆叠可以像操作普通网卡一样操作tunX表示的虚拟网卡。
例如,tunX的IP地址设置路由设置,总之,从堆栈的角度来看,tunX代表的网卡与其他普通网卡没有太大区别。当然,一定要说区别。换句话说,我们很清楚tunX设备没有MAC地址。tunX只模拟到网络层。
如果是tapX,在堆栈眼里,tapX和实际网卡没有任何区别!!
例如:
在上图中,左边和右边分别是两台机器。物理网卡包括IP: 172.16.1.11,该系统的系统包括Tun设备,IP: 192.168.1.11。另一个物理网卡配置为IP: 172.16.1.12,系统具有Tun设备,配置为IP: 192.168.1.12。
2TAP设备
如图所示,创建TAP设置后,将在Linux设备文件目录中创建相应的char设备。用户程序可以像打开常规文件一样打开该文件进行读/写。
执行Write()操作时,数据将进入TAP设备,对于Linux网络层,这相当于TAP设备接收一包数据,请求内核接受。这相当于普通物理网卡从外部接收一包数据。但是,实际数据来自Linux的用户程序。Linux收到此数据后,将根据网络配置执行后续处理,以执行用户程序向Linux内核网络层注入数据的功能。
用户程序执行read()请求时,相当于查询内核是否有需要从TAP设备发送的数据,如果有,则相当于拿出到用户程序中,完成TAP设备的数据传输功能。
TAP设备的一个图像的比喻如下:
使用TAP设备的应用程序相当于其他计算机,TAP设备是相互连接的本机网卡。应用程序通过读取操作与本机网络核心通信。
TAP设备的工作方式与TUN设备相同,但存在以下差异:
3)。
TAP:子网掩码为/24,255.255.255.0,与以太网设备相对应
TUN:子网掩码为/30,255.255.255.252,点对点设备。
4)设备节点编号不同:
内核2.4: TUN设备编号为36 16,文件节点:/dev/tun0
内核2.6: TUN设备编号为10 200,文件节点:/dev/net/tun
OSI模型的7层:
第一层是物理层
第二层是数据链路层
第三层是网络层
第四层是传输层
第五层是会话层
第六层是表现层
第七层是应用层
3VETH
VETH设备负责反转通信数据的方向,需要传输的数据将转换为需要接收的数据,并传递回内核网络层进行处理,从而间接完成数据注入。
VETH设备总是成对出现,请求发送到一端的数据总是在另一端显示为请求的接受。
这个设备不能直接由用户程序操作,但很容易使用。如果创建和配置正确,在一端输入数据后,VETH将更改数据方向,并将其发送到内核网络核心,以完成数据注入。你可以从另一端读取这个数据。
1b
发表评论