Linux 虚构网络设备 tun/tap veth pair
本篇次要介绍一下 linux 上面的 虚构网络设备 tun/tap veth pair
随着容器逐渐取代虚拟机,成为云基础架构的规范,然而容器的网络管理局部是离不开 Linux 虚构网络设备的,所以理解罕用的 Linux 虚构网络设备对于咱们云了解网络架构很有帮忙
Linux 虚构网络的背地都是由一个个虚构设施形成的,在虚拟化技术还没呈现之前,计算机网络零碎个别都只蕴含物理网卡设施
因为虚拟化技术的呈现,网络也须要被虚拟化,虚构网络变得很简单,将一台主机外面实现 如 交换机,路由,隔离,等等网络性能,从而为容器时代提供根底
1. 什么是虚构网络设备
在 Linux 中 网络设备的驱动程序不间接和内核协定栈交互,而是通过内核的网络设备治理模块作为两头桥梁,这样做的益处是,驱动程序不须要理解网络协议栈的细节,协定栈也不须要针对特定驱动解决数据包。
对于内核网络设备治理模块来说,虚构设施和物理设施 是没有区别的 都是网络设备 都能配置 IP
总的来说,虚构网络设备与物理网络设备没有什么区别,它们的一端连贯着内核协定栈,而另一端的行为是什么取决于不同网络设备的驱动实现。
2.tun/tap 虚构网络设备
TUN/TAP 虚构网络设备一端连着协定栈,另外一端不是物理网络,而是另外一个处于用户空间的应用程序。也就是说,协定栈发给 TUN/TAP 的数据包能被这个应用程序读取到,当然应用程序能间接向 TUN/TAP 发送数据包。
一个典型的应用 TUN/TAP 网络设备的例子如下图所示:
上图中咱们配置了一个物理网卡,IP 为18.12.0.92
,而 tun0 为一个 TUN/TAP 设施,IP 配置为10.0.0.12
。数据包的流向为:
- 应用程序 A 通过 socket A 发送了一个数据包,假如这个数据包的目标 IP 地址是
10.0.0.22
- socket A 将这个数据包丢给网络协议栈
- 协定栈依据本地路由规定和数据包的目标 IP,将数据包由给 tun0 设施发送进来
- tun0 收到数据包之后,将数据包转发给了用户空间的应用程序 B
- 应用程序 B 收到数据包之后结构一个新的数据包,将原来的数据包嵌入在新的数据包(IPIP 包)中,最初通过 socket B 将数据包转发进来
Note: 新数据包的源地址变成了 tun0 的地址,而目标 IP 地址则变成了另外一个地址
18.13.0.91
.
- socket B 将数据包发给协定栈
- 协定栈依据本地路由规定和数据包的目标 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 设施咱们有机会将协定栈中的局部数据包转发给用户空间的应用程序,让利用程序处理数据包。罕用的应用场景包含数据压缩、加密等性能。
Note: TUN 和 TAP 设施的区别在于,TUN 设施是一个虚构的端到端 IP 层设施,也就是说用户空间的应用程序通过 TUN 设施只能读写 IP 网络数据包(三层),而 TAP 设施是一个虚构的链路层设施,通过 TAP 设施能读写链路层数据包(二层)。如果应用 Linux 网络工具包 iproute2 来创立网络设备 TUN/TAP 设施 则须要指定
--dev tun
和--dev tap
来辨别。
艰深例子 比方
:因为疫情 你须要在家办公,当你须要去拜访公司的内网的时候 失常来说 是拜访不到的,然而当你连贯了 VPN 后,VPN 软件会在你的电脑里 创立一个 TUN 设施(能够设想为网卡)而后它能接管到你的发往 公司的 ip 段(172.17。。)它会把申请转发给用户空间的 VPN 软件,VPN 软件会依据你的 VPN 配置 把目地地址改成你公司的外网地址 而后通过 网卡转发进来 就实现了 通过 VPN 拜访 你公司的内网了。
3.veth pair 虚构网络设备
veth 虚构网络设备的特点是 它会 成对呈现
,pair 英文就是成对的意思,也就是说 你创立 veth 的时候 它会创立一个对 veth 设施,veth 设施一段连着 Linux 网络协议栈,另外一端 不是连物理网络,而是另外的一个 veth 设施
,成对的 veth 发送数据后会间接到另外一个 veth 设施下来,而且每个 veth 都能够设置 IP 地址,并且 参加 三层 IP 网络路由过程
ip link add veth0 type veth peer name veth1 #创立一个 veth pair 它是一对 别离是 veth0 和 veth1
ip addr add 20.1.0.10/24 dev veth0 #给 veth 设施增加 IP 地址
ip addr add 20.1.0.11/24 dev veth1
ip link set veth0 up #设置设施启动
ip link set veth1 up
此时通过 ifconfig 能够看到 两个虚构设施,也能够通过 ip link show
veth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 20.1.0.10 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::4c36:f8ff:feee:2664 prefixlen 64 scopeid 0x20<link>
ether 4e:36:f8:ee:26:64 txqueuelen 1000 (Ethernet)
RX packets 14 bytes 1020 (1020.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 25 bytes 1930 (1.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 20.1.0.11 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::c4bd:37ff:fe62:3f2 prefixlen 64 scopeid 0x20<link>
ether c6:bd:37:62:03:f2 txqueuelen 1000 (Ethernet)
RX packets 25 bytes 1930 (1.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 14 bytes 1020 (1020.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
此时去 ping 20.1.0.10 和 20.1.0.11 都是能够通的
[root@localhost ~]# ping 20.1.0.10
PING 20.1.0.10 (20.1.0.10) 56(84) bytes of data.
64 bytes from 20.1.0.10: icmp_seq=1 ttl=64 time=0.102 ms
64 bytes from 20.1.0.10: icmp_seq=2 ttl=64 time=0.066 ms
64 bytes from 20.1.0.10: icmp_seq=3 ttl=64 time=0.056 ms
此时通过 ip route 能够看到 路由信息
[root@localhost ~]# ip route
default via 10.0.2.2 dev enp0s3 proto dhcp metric 100
default via 192.168.56.1 dev enp0s8 proto static metric 101
10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15 metric 100
20.1.0.0/24 dev veth0 proto kernel scope link src 20.1.0.10
20.1.0.0/24 dev veth1 proto kernel scope link src 20.1.0.11
4. 场景总结
4.1 tun/tap
能够用来做 VPN,VPN 的底层原理就是 应用 tun 设施,还能够做数据压缩 和 数据加密等
4.2 veth pair
连贯两个不同的网络命名空间 (netns),连贯 docker 容器,连贯网桥(Bridge) 等
总结
本篇次要介绍了 Linux 的 2 种 虚构网络设备,其实还有不少其它的设施 bridge(虚构交换机)等等。。
了解根底的虚构网络设备可能帮忙你更好的了解 Docker 底层网络 和 K8s 底层网络等
参考:https://morven.life/posts/net…
https://typesafe.cn/posts/lin…
欢送大家拜访 集体博客 Johnny 小屋