当前位置: 首页 > 后端技术 > Java

Linux虚拟网络设备tun-tapvethpair

时间:2023-04-01 19:32:53 Java

Linux虚拟网络设备tun/tapvethpair本文主要介绍Linux下的虚拟网络设备tun/tapvethpair。随着容器逐渐取代虚拟机,它们成为云基础设施的核心。但是容器的网络管理部分是离不开Linux虚拟网络设备的,所以了解常用的Linux虚拟网络设备对于我们理解云中的网络架构是很有帮助的。Linux虚拟网络的背后是由虚拟设备组成的。在虚拟化技术出现之前,计算机网络系统一般只包含物理网卡设备。由于虚拟化技术的出现,网络也需要虚拟化,而虚拟化的网络变得非常复杂。在主机中实现诸如交换机、路由、隔离等网络功能,从而为容器时代提供基础1.什么是虚拟网络设备?在Linux中,网络设备的驱动程序并不直接与内核协议栈交互,而是利用内核的网络设备管理模块作为中间桥梁。这样做的好处是驱动程序不需要知道网络协议栈的细节,协议栈也不需要为特定的驱动程序处理数据包。对于内核网络设备管理模块,虚拟设备和物理设备没有区别。所有网络设备都可以配置IP。一般来说,虚拟网络设备和物理网络设备没有区别。它们的一端连接到内核协议栈,而另一端的行为取决于不同网络设备的驱动程序实现。2.tun/tap虚拟网络设备TUN/TAP虚拟网络设备一端连接协议栈,另一端不是物理网络,而是用户空间的另一个应用程序。也就是说,协议栈发给TUN/TAP的数据包可以被这个应用程序读取,当然应用程序也可以直接给TUN/TAP发数据包。一个典型的使用TUN/TAP网络设备的例子如下图所示:在上图中,我们配置了一个IP为18.12.0.92的物理网卡,tun0是一个IP为18.12.0.92的TUN/TAP设备10.0.0.12。数据包的流向是:应用程序A通过socketA发送一个数据包,假设这个数据包的目的IP地址是10.0.0.22socketA把这个数据包丢给网络协议栈。协议栈根据本地路由规则和数据包的目的IP,从tun0设备发送数据包。tun0收到数据包后,将数据包转发给用户空间的应用程序B。应用B收到数据包后构造一个新的数据包,将原来的数据包嵌入到一个新的数据包(IPIP包)中,最后通过socketB转发数据包注意:新数据的源地址数据包变成tun0的地址,目的IP地址变成另外一个地址18.13.0.91.socketB将数据包发送到协议栈。根据本地路由规则和数据包的目的IP,协议栈决定通过设备eth0发送数据包,于是数据包被转发到设备eth0,设备eth0经过物理网络。将数据包发送出去。我们可以看到发送到10.0.0.22的网络数据包是通过用户空间的应用程序B使用18.12.0.92发送到远程网络上的18.13.0.91。网络包到达18.13.0.91后,将里面的原始数据包转发到本地10.0.0.22。这就是VPN的基本实现原理。使用TUN/TAP设备,我们有机会将协议栈中的部分数据包转发给用户空间中的应用程序,让应用程序处理数据包。常见的使用场景包括数据压缩和加密等功能。注意:TUN和TAP设备的区别在于TUN设备是一个虚拟的端到端的IP层设备,也就是说用户空间的应用程序只能通过IP网络数据包(第三层)进行读写TUN设备,而TAP设备是一个虚拟的链路层设备,可以通过TAP设备读写链路层数据包(第2层)。如果使用Linux网络工具包iproute2创建网络设备TUN/TAP设备,需要指定--devtun和--devtap来区分。流行的例子如:由于疫情,你需要在家工作。当你需要访问公司内网时,却无法正常访问。但是当您连接到VPN时,VPN软件会在您的计算机中创建一个TUN。设备(可以想象成网卡)然后可以接收到你发给公司的ip段(172.17..)会把请求转发给用户空间的VPN软件,VPN软件会根据你的VPN配置,把目的地址改为你公司的外网地址,然后通过网卡转发,实现访问你公司的通过VPN的内联网。3.vethpair虚拟网络设备veth虚拟网络设备的特点是会成对出现,pair英文是paired的意思,也就是说你创建veth的时候会创建一对veth设备,veth设备连接到Linux网络协议栈,另一端没有连接到物理网络,而是另一个veth设备。配对的veth发送数据后,会直接到另一个veth设备,每个veth可以设置一个IP地址,参与三层IP网络路由过程iplinkaddveth0typevethpeernameveth1#创建一个vethpairwhich是一对veth0和veth1ipaddradd20.1.0.10/24devveth0#给veth设备添加IP地址ipaddradd20.1.0.11/24devveth1iplinksetveth0up#设置设备启动iplinksetveth1upAt这次可以通过ifconfig看到两个虚拟设备,或者通过iplinkshowveth0:flags=4163mtu1500inet20.1.0.10netmask255.255.255.0broadcast0.0.0.0inet6fe80::4c36:f8ff:feee:2664prefixlen64scopeid0x20ether4e:36:f8:ee:26:64txqueuelen1000(以太网)RX数据包1420字节(1020.0B)RX错误0丢弃0溢出0帧0TX数据包25字节1930(1.8KiB)TX错误0丢弃0溢出0载体0冲突0veth1:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500inet20.1.0.11netmask255.255.255.0broadcast0.0.0.0inet6fe80::c4bd:37ff:fe62:3f2prefixlen64scopeid0x20etherc6:bd:37:62:03:f2txqueuelen1000(以太网)RX数据包25字节1930(1.8KiB)RX错误0丢弃0溢出0帧0TX数据包14字节1020(1020.0B)TX错误0丢弃0溢出0载波0碰撞20.1.0.10和20.1.0.11可用[root@localhost~]#ping20.1.0.10PING20.1.0.10(20.1.0.10)56(84)字节的数据。来自20.1.0.10的64字节:icmp_seq=1ttl=64time=0.102ms64bytesfrom20.1.0.10:icmp_seq=2ttl=64time=0.066ms64bytesfrom20.1.0.10:icmp_seq=3ttl=64time=0.056ms此时可以通过iproute[root@localhost看到路由信息~]#iproutedefaultvia10.0.2.2devenp0s3protodhcpmetric100defaultvia192.168.56.1devenp0s8protostaticmetric10110.0.2.0/24devenp0s3protokernelscopelinksrc10.0.2。15指标10020.1.0.0/24devveth0proto内核作用域链接src20.1.0.1020.1.0.0/24devveth1proto内核作用域链接src20.1.0.114。场景总结4.1tun/tap可以用于VPN,VPN的底层原理是使用tun设备,还可以做数据压缩和数据加密等4.2vethpair连接两个不同的网络命名空间(netns),连接docker容器,连接网桥(Bridge)等网络设备,其实还有很多其他设备网桥(virtualswitch)等等。了解基本的虚拟网络设备可以帮助你更好的理解Docker底层网络和K8s底层网络等参考:https://morven.life/posts/net...https://typesafe.cn/posts/lin。..欢迎来到我的个人博客JohnnyHut