Linux - 虚拟网络设备- TUN,TAP,ip tunnel
引用
- Tun/Tap interface tutorial
- 什么是IP隧道,Linux怎么实现隧道通信?
- Linux内核网络设备--TUN. TAP设备
- linux ipip隧道及实现
- Linux tun:tap 详解
- 用户态协议栈tapip代码分析-tun/tap和veth
一. 引言
Linux 虚拟网络的背后都是由一个个的虚拟设备构成的。虚拟化技术没出现之前,计算机网络系统都只包含物理的网卡设备,通过网卡适配器,线缆介质,连接外部网络,构成庞大的 Internet。
然而,随着虚拟化技术的出现,网络也随之被虚拟化,相较于单一的物理网络,虚拟网络变得非常复杂,在一个主机系统里面,需要实现诸如交换、路由、隧道、隔离、聚合等多种网络功能。
而实现这些功能的基本元素就是虚拟的网络设备,比如 tap、tun 和 veth-pair。
二. Concept
2.1 TUN设备
一种虚拟网络设备,点对点的设备。三层设备,即处理的是IP数据包。不需要物理地址,即不需要ARP。 用于创建路由。因为通过读写/dev/tun设备可以直接从协议栈的三层读写ip包,所以tun设备常用于vpn、tunnel、ipsec之类的。
2.2 TAP设备
一种虚拟网络设备,ethernet以太网设备。二层设备,即处理的是二层报文。用于创建网桥。因为通过读写/dev/tap设备可以直接从协议栈的二层读写mac帧,所以tap设备常用语构建实现网桥、虚交换机等.
注:lo, ip tunnels设备没有qdisc处理。
2.3 IP隧道
Linux 原生支持多种三层隧道,其底层实现原理都是基于 tun 设备。我们可以通过命令 ip tunnel help
查看 IP 隧道的相关操作。
,Linux 原生一共支持 5 种 IP 隧道。
ipip
:即IPv4 in IPv4
,在 IPv4 报文的基础上再封装一个 IPv4 报文。gre
:即通用路由封装(Generic Routing Encapsulation
),定义了在任意一种网络层协议上封装其他任意一种网络层协议的机制,IPv4 和 IPv6 都适用。sit
:和ipip
类似,不同的是sit
是用 IPv4 报文封装 IPv6 报文,即IPv6 over IPv4
。isatap
:即站内自动隧道寻址协议(Intra-Site Automatic Tunnel Addressing Protocol
),和sit
类似,也是用于 IPv6 的隧道封装。vti
:即虚拟隧道接口(Virtual Tunnel Interface
),是 cisco 提出的一种IPsec
隧道技术。
IP隧道技术是路由器把一种网络层协议封装到另一个协议中以跨过网络传送到另一个路由器的处理过程。IP 隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。移动IPv4主要有三种隧道技术,它们分别是:IP in IP、最小封装以及通用路由封装。更多信息可以参看百度百科:IP隧道 和 隧道技术 。
Linux系统内核实现的IP隧道技术主要有三种(PPP、PPTP和L2TP等协议或软件不是基于内核模块的):ipip、gre、sit 。这三种隧道技术都需要内核模块 tunnel4.ko 的支持。
ipip 需要内核模块 ipip.ko ,该方式最为简单!但是你不能通过IP-in-IP隧道转发广播或者IPv6数据包。你只是连接了两个一般情况下无法直接通讯的IPv4网络而已。至于兼容性,这部分代码已经有很长一段历史了,它的兼容性可以上溯到1.3版的内核。据网上查到信息,Linux的IP-in-IP隧道不能与其他操作系统或路由器互相通讯。它很简单,也很有效。
GRE 需要内核模块 ip_gre.ko ,GRE是最初由CISCO开发出来的隧道协议,能够做一些IP-in-IP隧道做不到的事情。比如,你可以使用GRE隧道传输多播数据包和IPv6数据包。
sit 他的作用是连接 ipv4 与 ipv6 的网络。个人感觉不如gre使用广泛 。
三. 数据流向
3.1 TUN
- 1.1User Application A通过套接字(socket A)发数据发给使用与eno16777736处于同一个网段ip的应用程序,数据走向为通过socket A发给协议栈,最后通过netdevice子系统中的eno16777736的设备驱动(以太网驱动)发送出去,这个是通过真实的物理网卡发送出去。
- 1.2User Application B通过套接字(socket B)发送数据给使用与nsfocus_tun0处于同一个网段ip的应用程序,数据走向为通过socket B发送给协议栈,最后通过netdevice子系统中的nsfocus_tun0的设备驱动(tun驱动)发送出去。由于tun设备没有对应真实的物理网卡,所以nsfocus_tun0对端收取数据的是User Application C。User Application C通过读写/dev/tun设备文件进行数据的收发。
3.2 TAP
- 1.1User Application A通过套接字(socket A)发数据发给使用与eth处于同一个网段ip的应用程序,数据走向为通过socket A发给协议栈,最后通过netdevice子系统中的eno16777736的设备驱动(以太网驱动)发送出去,这个是通过真实的物理网卡发送出去
- 1.2User Application B通过套接字(socket B)发送数据给使用与nsfocus_tap0处于同一个网段ip的应用程序,数据走向为通过socket B发送给协议栈,最后通过netdevice子系统中的nsfocus_tap0的设备驱动(tun驱动)发送出去。由于tun设备没有对应真实的物理网卡,所以nsfocus_tap0对端收取数据的是User Application C。User Application C通过读写/dev/tun设备文件进行数据的收发。
Linux - 虚拟网络设备- TUN,TAP,ip tunnel相关推荐
- Linux 虚拟网络设备 tun/tap veth pair
Linux 虚拟网络设备 tun/tap veth pair 本篇主要介绍一下 linux 下面的 虚拟网络设备 tun/tap veth pair 随着容器逐步取代虚拟机,成为云基础架构的标准,然而 ...
- linux虚拟网络设备-- TUN/TAP MACVLAN MACVTAP(八)
TUN 设备 TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便得模拟网络行为.先来看看物理设备是如何工作的: 所有物理网卡收到的包会交给内核的 Network Stack 处理,然后通过 So ...
- linux虚拟网络设备--eth, tap/tun, veth-pair(九)
Linux 虚拟网络的背后都是由一个个的虚拟设备构成的.虚拟化技术没出现之前,计算机网络系统都只包含物理的网卡设备,通过网卡适配器,线缆介质,连接外部网络,构成庞大的 Internet. 然而,随着虚 ...
- linux虚拟网络设备之tun/tap驱动程序设计原理(五)
简介 虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在li ...
- linux上使用tun/tap设备模拟一个虚拟网卡,并将该虚拟网卡连接到新创建的网桥上
目录 linux上使用tun/tap设备模拟一个虚拟网卡,并将该虚拟网卡连接到新创建的网桥上 一.tun/tap设备简介 二.在linux上使用tun/tap设备模拟一个虚拟网卡 三. 创建网桥连接到 ...
- Linux 虚拟网络设备
一.tun/tap(虚拟网卡) TUN/TAP设备浅析(一) – 原理浅析 - 简书 (jianshu.com) (3条消息) Linux-虚拟网络设备-tun/tap_sld880311的专栏-CS ...
- linux 虚拟网络设备详解(四)
Linux 抽象网络设备简介 和磁盘设备类似,Linux 用户想要使用网络功能,不能通过直接操作硬件完成,而需要直接或间接的操作一个 Linux 为我们抽象出来的设备,既通用的 Linux 网络设备来 ...
- 虚拟网卡 TUN/TAP 驱动程序设计原理
简介 虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在li ...
- 网络设备中的linux,理解linux虚拟网络设备veth
原标题:理解linux虚拟网络设备veth 前面介绍了linux network namespace,接着介绍一下如何让一个独立的网络命名空间和主机的网络互通,这里我们需要用到linux虚拟网络设备v ...
- Linux - 虚拟网络设备 - bridge,veth,namespace
引用 轻松理解 Docker 网络虚拟化基础之网络 namespace! 轻松理解 Docker 网络虚拟化基础之 veth 设备! 深入理解 Linux 上软件实现的"交换机" ...
最新文章
- Why Object.prototype.hasOwnProperty.call(myObj, prop)
- java 银联支付反馈,微信支付/支付宝支付/银联支付,对比加总结(Java服务端)
- linux下搭建redis并解决无法连接redis的问题
- 微信团队放大招!他们为了小程序居然...
- Silverlight 导入数据时读取txt文件乱码
- ITK:计算图像的蒙版区域的直方图
- spark 1.6.0 简单使用
- [css] 如何使用css实现跨浏览器的最小高度?
- Android设计模式之——中介者模式
- python从网址爬图片协程_python 用 gevent 协程抓取海量网页
- c - 比较字符串的大小
- ThinkpadT470接通电源开机显示电量0%充不进电且电源指示灯不亮的解决办法
- libevent源码深度剖析二
- MMD原神动画制作(学习教程一)
- M5311连接HTTPS服务器下载bin文件(干货)
- JRebel:Cannot reactivate, offline seat in use.
- 怎么把PDF转换成jpg图片?这两种方法快来get
- 项目管理学习总结(19)——一百人研发团队的难题:研发管理、绩效考核、组织文化和OKR
- 从零开始配置搭建云服务器(Linux系统、简明详细教程)
- 在 Ubuntu 中安装 Firefox
热门文章
- python实现强化学习
- spring中如何实现参数隐式传递_Java进阶架构之开源框架面试题系列:Spring+SpringMVC+MyBatis(含答案分享)...
- java 观察者模式_设计模式-Java-观察者模式-RxJava
- privoxy基本配置-简洁版
- 给一张表加一个自动编号字段_Python办公自动化|从Word到Excel
- 首都师范大学计算机技术复试分数线,2020年首都师范大学计算机应用技术考研分析...
- html表单如何提示信息,表单提示信息
- Python实现微信小游戏:飞机大战
- arduino无源蜂鸣器歌曲编码_Arduino 蜂鸣器音乐代码转化程序开发
- 传奇私服DBC2000合并数据库时删除重复Name关键字SQL指令