云网络中的虚拟网络设备Tap与Tun

一、Tap和Tun的概述

1.1.tap和tun介绍

Tap/Tun设备是Linux操作系统内核中的虚拟网络设备,提供与硬件网卡完全相同的功能,但一般物理网卡一端连接的是物理网络,一端连接的是网络协议栈,而Tap/Tun主要用于用户空间和内核空间传递报文,即一端连接的是应用程序(通过字符设备文件/net/dev/tun),一端连接的是网络协议栈。

1.2.tap和tun作用

创建一个tap设备与tun设备,查看两者的不同:

(1)Tun是一个三层设备,该设备没有mac地址,只能从/net/dev/tun字符设备上读取IP数据包,写入的也只能是IP数据包,因此不能进行二层操作,如发送ARP请求和以太网广播。

(2)tap是二层设备,该设备有mac地址,处理的是二层MAC层数据帧,从/net/dev/tun字符设备上读取的是MAC层数据帧,写入的也只能是MAC层数据帧。

即Tap设备和真实的物理网卡功能更接近,可以与物理网卡桥接。

二、Tap和Tun设备工作原理

Tun/Tap一端连接网络协议栈,另一端连接的是一个应用层程序,这样协议栈发送给Tun/Tap的数据包就可以被这个应用程序读取到。

2.1.数据接收

(1)应用程序B/C发送数据,通过Socket层到达TCP/IP协议栈。

扫描二维码关注公众号,回复: 17132198 查看本文章

(2)网络协议栈对数据报文进行解析,查看对应的目标IP地址。

(3)若目标IP地址为Internet则根据路由将数据发往物理网卡。

(4)若目标IP地址是Tun/Tap网段地址,则通过路由将数据发往Tun/Tap虚拟网卡,Tun/Tap收取数据后写入字符设备驱动/net/dev/tun中,并被应用程序A读取。

2.2.数据发送

(1)应用程序A将需要发送给外部的数据经过自己的网络协议栈封装成二层mac帧,写入字符设备驱动,并由Tun/Tap虚拟网卡读取发送给协议栈。

(2)TCP/IP协议栈解析数据报文,并按照目标IP、目标MAC地址等信息进行数据转发。

2.3.注意事项

tap和tun连接的是应用程序和网络协议栈,当发送数据包的时候,如果与应用程序连接的是TCP/IP协议栈,则使用TCP/IP协议栈来发送数据包,如果与应用程序相连接的tap设备,则使用tap设备来发送数据。那到底该怎么选择呢?我们知道namespace本质上是被划分了一个独立于宿主机的网络空间,他在自己的空间中有自己的私网IP地址,但它其实也相当于宿主机中的一个进程,拥有自己独立的网络协议栈,一般选择与tap设备来进行连接,而对于QQ应用程序来讲,它是宿主机的一个独立的进程,本身并没有独立的网络空间,因此需要与主机的网络协议栈进行连接,总的来讲对于拥有独立网络空间的应用进程可以与tap设备来进行直接连接,而没有独立网络空间的应用进程选择与TCP/IP协议栈进行连接。

三、Tun和tap设备应用场景

3.1.tun的应用场景

Tun是一个网络层设备,支持点到点的网络通信,常用于tunnel隧道和VPN的构建,tunnel技术是网络设备把网络层数据包封装到另一个协议中以跨过网络传送到另一个网络设备的处理过程,主要用于公网主机和私有网络互联互通。在Linux系统中支持多种隧道技术,其底层实现原理都是基于Tun设备。

3.2.Linux常用隧道技术

(1)ipip:IPv4 in IPv4,在IPv4报文的基础上再封装一个IPv4报文,可以使得目标为私网IP地址的数据报文能被封装公网IP后在公网中进行转发。

(2)gre:通用路由封装,可以在任意一种网络层协议上封装其他任意一种网络层协议的机制,IPv4和IPv6都适用。

(3)sit:与ipip类似,不同的是sit是用IPv4报文封装IPv6报文,即IPv6 over IPv4。

(4)isatap:站内自动隧道寻址协议,和sit类似,也是用于IPv6的隧道封装。

(5)vti:虚拟隧道接口,是Cisco提出的一种IPsec隧道技术。

3.3.tun原理讲解

我们创建完tun设备之后,虚拟网络设备通常会在操作系统的网络协议栈中注册自己的虚拟接口。当数据包到达协议栈时,协议栈可以通过检查数据包的目的地址和接口配置来确定数据包应该被路由到哪个虚拟接口,从而确定数据包是给哪个设备的。当虚拟机中的应用程序想要通过隧道访问其他主机,会经过tap设备,并使用tap设备的ip地址作为隧道的源IP去访问外部。

四、Tap和Tun常用命令

 创建tap设备:

ip tuntap add tap1 nod tap

 删除tap设备(方式一):

ip tuntap del tap1 mod tap

 创建tun设备:

ip tuntap add tun1 mod tun

 删除tun设备:

ip tuntap del tun1 mod tun

删除tap设备(方式二):

ip link del dev tap1

删除tun设备(方式二):

ip link del dev tun1

创建虚拟对 ns1-veth1与 br-veth1:

ip link add ns1-veth1 type veth peer name br-veth1

veth接口添加到命名空间中:

ip link set ns1-veth1 netns ns1

开启Linux的路由转发功能:

sysctl-wnet.ipv4.ip_forward=1
# 在 Linux 系统中,开启路由转发功能允许系统将收到的数据包从一个网络接口
# 转发到另一个网络接口。这个功能对于将数据包从一个网络传输到另一个网络非
# 常有用,它允许 Linux 主机像路由器一样工作,将来自一个网络的数据包转发到另一个网络。
# iptables -P FORWARD ACCEPT 
# sysctl -w net.ipv4.ip_forward=1
# 这两个操作涉及到的确实都是关于数据包转发,但一个是在防火墙规则中设置数据包的转发允许,
# 另一个是开启操作系统的 IP 转发功能。它们是相互关联的,但是涉及到的具体操作和配置层面
# 有所不同。

加载IPIP模块:

modprobe ipip 
# 加载 Linux 内核中的 IPIP(IP in IP)模块。IPIP 是一种隧道协议,
# 它允许将一个 IP 数据包封装在另一个 IP 数据包中进行传输,从而实现
# 了在 IP 网络上进行虚拟私有网络(VPN)或隧道连接的功能。

 列出当前加载的关于ip的内核模块:

lsmod | grep ip  
# 列出当前加载的 Linux 内核模块。目的是找出已加载的与 IP 相关的内核模块。
ip netns exec ns1 ip addr add 10.1.1.1 peer 10.1.2.1 dev tun1
# 在网络命名空间 ns1 中配置了 tun1 设备的 IP 地址,建立了一个点对点
# 的连接,使得 tun1 设备能够进行点对点的通信,10.1.1.1 和 10.1.2.1
# 分别表示这个连接的两端。

 五、Tun的实验进阶

假设你在两个网络命名空间中ns1ns2使用 tun 设备建立了一个点对点的连接。

(1)在 ns1 中配置了 tun1 设备的地址为 10.1.1.1 peer 10.1.2.1,本地地址为 192.168.100.1,远程地址为 192.168.200.1

ip netns exec ns1 ip tunnel add tun1 mode ipip remote 
192.168.200.1 local 192.168.100.1
ip netns exec ns1 ip link set tun1 up
ip netns exec ns1 ip addr add 10.1.1.1 peer 10.1.2.1 dev tun1

(2)在 ns2 中配置了另一个 tun 设备 tun2 的地址为 10.1.2.1 peer 10.1.1.1,本地地址为 192.168.200.1,远程地址为 192.168.100.1

ip netns exec ns2 ip tunnel add tun2 mode ipip remote
192.168.100.1 local 192.168.200.1
ip netns exec ns1 ip link set tun1 up
ip netns exec ns2 ip addr add 10.1.2.1 peer 10.1.1.1 dev tun2

现在,你在 ns1 内的某个应用程序向 tun1 设备发送了一个数据包,目标地址为 10.1.2.1

ip netns exec ns1 ping 10.1.2.1

发送数据包

(1)应用程序生成一个数据包,将数据包发送给 tun1 设备。

(2)数据包的目标地址是 10.1.2.1,这个地址是 tun1 设备的 peer 参数对应的地址。

数据包封装

(1)tun1 设备封装这个数据包,在外层添加了本地地址 192.168.100.1 和远程地址 192.168.200.1 的信息。

通过隧道传输

(1)封装后的数据包通过网络传输到 ns2 中的 tun2 设备。

数据包解封

(1)在 ns2 中,tun2 设备解封数据包,还原出原始的数据包,其中目标地址为 10.1.2.1

数据包交付

(1)解封后的数据包被传递给 ns2 内部的目标地址 10.1.2.1

(2)这里 tun 设备的本地地址和远程地址,在数据包传输时起到重要作用,它们是封装中的源地址和目标地址,在隧道传输过程中用于数据包的正确路由和传输。

猜你喜欢

转载自blog.csdn.net/m0_73901077/article/details/134854097
今日推荐