TUN/TAP为用户空间提供分组接收和传输。既可以看作一个Point-to-Point设备,也可以看做一个Ethernet设备。它从用户空间程序接收分组,而不是从物理媒介;将分组写入用户空间程序而不是通过物理媒介。
一个程序打开/dev/net/tun字符型文件,并向内核发出ioctl()来注册一个网络设备。根据选项,这个网络设备将显示为tunXX或者tapXX。当程序关闭文件描述符时,这个网络设备和所有对应的路由都将关闭。
用户空间程序read/write IP数据包(通过tun)还是以太网帧(通过tap),取决于选择的设备类型。正在使用哪一个取决于ioctl()设置的flag。
http://vtun.sourceforge.net/tun 下的软件包包含两个简单的示例,介绍如何使用tun和tap设备。两个示例的工作原理都像在两个网络接口之间的桥一样。
另外,最好的例子来源于VTun( http://vtun.sourceforge.net ) :))
创建设备节点:
设置权限:
驱动程序模块自动加载:
确保内核启用了“内核模块加载器” - 模块自动加载支持。 内核应该在第一次访问时加载它。
手动加载:
后一种方法,每次当你需要使用模块的时候,你都需要加载它。另一种方法将在你打开/dev/net/tun的时候自动加载。
设备的名称 char *dev 是具有格式的字符串(e.g. "tun%d"),也可以是任何有效的网络设备名称。注意,字符指针将会被真实网络设备名覆盖。
如果 IFF_NO_PI 标志没有被设置,每一帧格式如下:
从3.8版开始,Linux支持多队列tuntap,它可以使用多个文件描述符(队列)来并行发送或接收数据包。 设备分配与以前相同,如果用户想要创建多个队列,则必须使用IFF_MULTI_QUEUE标志多次调用具有相同设备名称的TUNSETIFF。
char *dev 是设备的名称, queues 是要创建的队列数, fds 用于存储和返回创建给调用者的文件描述符(队列)。 每个文件描述符都作为一个队列的接口,可以被用户空间访问。
引入了一个新的 ioctl(TUNSETQUEUE) 来启用或禁用队列。 当用 IFF_DETACH_QUEUE 标志调用它时,队列被禁用。 当用 IFF_ATTACH_QUEUE 标志调用它时,队列被启用。 通过 TUNSETIFF 创建队列后,队列默认启用。
fd是我们想要启用或禁用的文件描述符(队列),当enable为真时,我们启用它,否则我们禁用它
虚拟机中的网络设置要设为:vmnet0为自动桥连,主机系统里IP地址手动设为和PLC一个频段,然后把虚拟机中的网络IP也设为和PLC一个频段,但是三个IP不要冲突。然后虚拟机中选择以太网就可以连接了。TUN与TAP是操作系统内核中的虚拟网络设备。TAP 等同于一个以太网设备,它操作第二层数据包如以太网数据帧。
TUN模拟了网络层设备,操作第三层数据包比如IP数据封包。
统一来讲就是,服务器如果拥有TUN/TAP模块,就可以开启VPN功能。
网桥,就是将两个局域网(LAN)连起来,根据MAC地址(物理地址)来转发帧,可以看作一个“低层的路由器”。
网桥通常用于联接数量不多的、同一类型的网段。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)