Linux - 虚拟网络设备- TUN,TAP,ip tunnel

引用


一. 引言

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设备文件进行数据的收发。

Tunnel 类型

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本实验旨在通过创建虚拟网络设备,在Linux操作系统上进行广域网配置实验。以下是实验报告: 一、实验环境 1. 操作系统:Ubuntu 20.04 LTS 2. 虚拟机软件:VirtualBox 6.1.22 二、实验步骤 1. 创建两个虚拟机,分别命名为Router和Host,并设置虚拟机的网络适配器为“仅NAT网络”模式。 2. 在Router虚拟机上创建两个虚拟网络设备tun0和tun1。其tun0设备为本地网络连接,IP地址为192.168.1.1/24;tun1设备为广域网连接,IP地址为10.0.0.1/24。 ``` sudo ip tuntap add mode tun tun0 sudo ip tuntap add mode tun tun1 sudo ip link set dev tun0 up sudo ip link set dev tun1 up sudo ip addr add 192.168.1.1/24 dev tun0 sudo ip addr add 10.0.0.1/24 dev tun1 ``` 3. 在Host虚拟机上创建一个虚拟网络设备tun0,IP地址为192.168.1.2/24。 ``` sudo ip tuntap add mode tun tun0 sudo ip link set dev tun0 up sudo ip addr add 192.168.1.2/24 dev tun0 ``` 4. 在Router虚拟机上启用IP转发功能。 ``` sudo sysctl -w net.ipv4.ip_forward=1 ``` 5. 在Router虚拟机上设置路由,将Host虚拟机的数据包转发到tun1设备。 ``` sudo ip route add 192.168.1.0/24 dev tun0 sudo ip route add default via 10.0.0.2 dev tun1 ``` 6. 在Host虚拟机上设置默认网关为Router虚拟机的tun0设备。 ``` sudo ip route add default via 192.168.1.1 dev tun0 ``` 7. 测试网络连接,Host虚拟机可以ping通Router虚拟机的tun0设备和tun1设备。 三、实验总结 通过本实验,我们成功地创建了虚拟网络设备,在Linux操作系统上进行了广域网配置实验。我们可以通过创建虚拟网络设备,实现不同网络之间的连接,并进行数据传输。虚拟网络设备的创建和配置,是Linux系统网络配置的一个重要部分,也是进行网络编程和网络调试的必备技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值