百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

Linux虚拟接口之隧道介绍 linux虚拟技术

sinye56 2024-12-23 13:26 16 浏览 0 评论

Linux支持多种隧道,但是新用户可能会因为它们之间的差异而感到困惑,无法确定哪种隧道适合给定的场景。本文将简要介绍Linux内核中常用的隧道接口。内容没有代码分析,仅简要介绍了接口及其在Linux上的用法。感兴趣的话,可以通过iproute2的命令ip link help获得隧道接口列表以及特定隧道配置的帮助。

这篇文章介绍了以下常用接口:

  • IPIP
  • SIT
  • ip6tnl
  • VTI和VTI6
  • GRE和GRETAP
  • IP6GRE和IP6GRETAP
  • FOU
  • GUE
  • GENEVE
  • ERSPAN和IP6ERSPAN

阅读本文之后,我们将了解这些接口是什么,它们之间的区别,何时使用它们以及如何创建它们。

IPIP

顾名思义,IPIP隧道是RFC 2003中定义的IP over IP隧道。IPIP隧道标头如下所示:

通常用于通过公共IPv4互联网连接两个内部IPv4子网。它具有最低的开销,但只能传输IPv4单播流量。这意味着您无法通过IPIP隧道发送多播。

IPIP隧道同时支持IP over IP和MPLS over IP。

注意:加载ipip模块或首次创建IPIP设备时,Linux内核将在每个名称空间中创建tunl0默认设备,其属性为local = any和remote = any。接收IPIP协议数据包时,如果内核找不到其他本地/远程属性与其来源或目标地址更匹配的设备,则内核会将其转发给tunl0作为备用设备。

如下是创建IPIP隧道的方法:

 On Server A:
 # ip link add name ipip0 type ipip local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
 # ip link set ipip0 up
 # ip addr add INTERNAL_IPV4_ADDR/24 dev ipip0
 Add a remote internal subnet route if the endpoints don't belong to the same subnet
 # ip route add REMOTE_INTERNAL_SUBNET/24 dev ipip0
 
 On Server B:
 # ip link add name ipip0 type ipip local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
 # ip link set ipip0 up
 # ip addr add INTERNAL_IPV4_ADDR/24 dev ipip0
 # ip route add REMOTE_INTERNAL_SUBNET/24 dev ipip0

注意:请根据测试环境将LOCAL_IPv4_ADDR,REMOTE_IPv4_ADDR,INTERNAL_IPV4_ADDR,REMOTE_INTERNAL_SUBNET替换为地址。

SIT

SIT代表“简单Internet过渡”。主要目的是互连位于全球IPv4互联网中的隔离IPv6网络。

最初,它只有IPv6 over IPv4隧道模式。然而,经过多年的发展,它获得了对多种不同模式的支持,例如ipip(与IPIP隧道相同),ip6ip,mplsip等。模式any用于同时接受IP和IPv6流量,这在某些部署中可能很有用。 SIT隧道还支持ISATA,用法见示例。

SIT隧道报文头看起来如下所示:

加载sit模块后,Linux内核将创建一个默认设备,名为sit0。

如下是创建SIT隧道的方法:

 On Server A:
 # ip link add name sit1 type sit local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR mode any
 # ip link set sit1 up
 # ip addr add INTERNAL_IPV4_ADDR/24 dev sit1

然后,在远端执行相同的步骤。

ip6tnl

ip6tnl是基于IPv6的IPv4/IPv6隧道接口,看起来像SIT隧道的IPv6版本。报文头看起来如下所示:

ip6tnl支持ip6ip6,ipip6,和any模式。ipip6模式是IPv4 over IPv6,ip6ip6模式是IPv6 over IPv6,any模式支持IPv4/IPv6 over Pv6。

加载ip6tnl模块后,Linux内核将创建一个名为ip6tnl0的默认设备。

如下是创建ip6tnl隧道的方法:

 # ip link add name ipip6 type ip6tnl local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR mode any

VTI和VTI6

Linux上的虚拟隧道接口(VTI)与Cisco的VTI和Juniper的安全隧道(st.xx)类似。

这个特定的隧道驱动程序实现IP封装,可以与xfrm一起使用以提供安全隧道的概念,然后在其之上使用内核路由。

通常,VTI隧道的运行方式几乎与ipip或sit隧道相同,不同之处在于,它们添加了fwmark和IPsec封装/解封装。

VTI6是VTI的IPv6实现。

如下是创建VTI隧道的方法:

 # ip link add name vti1 type vti key VTI_KEY local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
 # ip link set vti1 up
 # ip addr add LOCAL_VIRTUAL_ADDR/24 dev vti1
 
 # ip xfrm state add src LOCAL_IPv4_ADDR dst REMOTE_IPv4_ADDR spi SPI PROTO ALGR mode tunnel
 # ip xfrm state add src REMOTE_IPv4_ADDR dst LOCAL_IPv4_ADDR spi SPI PROTO ALGR mode tunnel
 # ip xfrm policy add dir in tmpl src REMOTE_IPv4_ADDR dst LOCAL_IPv4_ADDR PROTO mode tunnel mark VTI_KEY
 # ip xfrm policy add dir out tmpl src LOCAL_IPv4_ADDR dst REMOTE_IPv4_ADDR PROTO mode tunnel mark VTI_KEY

也可以通过libreswan或strongSwan配置IPsec。

GRE和GRETAP

通用路由封装,也称为GRE,在RFC 2784中定义。

GRE隧道在内部和外部IP头之间添加了一个额外的GRE头。从理论上讲,GRE可以封装具有有效以太网类型的任何第3层协议,而IPIP只能封装IP。GRE报文头看起来如下所示:

请注意,GRE隧道支持传输多播流量和IPv6报文。

gre模块被加载,Linux内核将创建一个默认设备,命名gre0

如下是创建GRE隧道的方法:

 # ip link add name gre1 type gre local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR [seq] key KEY

GRE隧道在OSI第3层上运行,而GRETAP在OSI第2层上运行,这意味着内部头中有一个以太网头部。

如下是创建GRETAP隧道的方法:

 # ip link add name gretap1 type gretap local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR

IP6GRE和IP6GRETAP

IP6GRE是GRE的IPv6实现,它使我们能够封装基于IPv6的任何第3层协议。隧道头看起来如下所示:

与GRETAP一样,IP6GRETAP在内部标头中具有以太网头部:

如下是创建GRE隧道的方法:

 # ip link add name gre1 type ip6gre local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR
 # ip link add name gretap1 type ip6gretap local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR

FOU

隧道可以在网络堆栈的多个级别上发生。IPIP,SIT,GRE隧道位于IP级别,而FOU(UDP上的foo)是UDP级别的隧道。

使用UDP隧道具有一些优点,因为UDP与现有的硬件基础结构一起工作,例如NIC中的RSS,交换机中的ECMP。开发人员的验证结果显示SIT和IPIP协议的性能显著提高。

当前,FOU隧道支持基于IPIP,SIT,GRE的封装协议。FOU报文头示例如下所示:

如下是创建FOU隧道的方法:

 # ip fou add port 5555 ipproto 4
 # ip link add name tun1 type ipip remote 192.168.1.1 local 192.168.1.2 ttl 225 encap fou encap-sport auto encap-dport 5555

第一条命令为绑定到5555的IPIP配置了FOU接收端口;对于GRE,需要设置ipproto 47

第二条命令使用目标端口5555设置了用于FOU封装的新IPIP虚拟接口(tun1)。

注意:Red Hat Enterprise Linux不支持FOU。

GUE

通用UDP封装(GUE)是另一种UDP隧道。FOU和GUE之间的区别在于GUE具有自己的封装头,其中包含协议信息和其他数据。

当前,GUE隧道支持内部IPIP,SIT,GRE封装。GUE标头示例如下所示:

如下是创建GUE隧道的方法:

 # ip fou add port 5555 gue
 # ip link add name tun1 type ipip remote 192.168.1.1 local 192.168.1.2 ttl 225 encap gue encap-sport auto encap-dport 5555

这将为绑定到5555的IPIP设置一个GUE接收端口,并为GUE封装配置一个IPIP隧道。

注意:Red Hat Enterprise Linux不支持GUE。

GENEVE

通用网络虚拟化封装(GENEVE)支持VXLAN,NVGRE和STT的所有功能,旨在克服它们的局限性。许多人认为GENEVE最终可以完全取代这些早期格式。隧道头看起来如下所示:

看起来非常类似于VXLAN。主要区别在于GENEVE报文头是灵活的。通过使用新的Type-Length-Value(TLV)字段扩展标头来添加新功能非常容易。有关更多详细信息,可以查看最新的ietf草案或参考什么是GENEVE?

开放式虚拟网络(OVN)使用GENEVE作为默认封装。

如下是创建GENEVE隧道的方法:

 # ip link add name geneve0 type geneve id VNI remote REMOTE_IPv4_ADDR

ERSPAN和IP6ERSPAN

封装的远程交换端口分析器(ERSPAN)使用GRE封装将基本的端口镜像功能从第2层扩展到第3层,从而允许通过可路由的IP网络发送镜像的流量。ERSPAN标头看起来如下所示:

ERSPAN隧道允许Linux主机充当ERSPAN流量源,并将ERSPAN镜像流量发送到远程主机或ERSPAN目标,后者接收并解析从Cisco或其他具有ERSPAN功能的交换机生成的ERSPAN数据包。此设置可用于分析,诊断和检测恶意流量。

Linux当前支持两个ERSPAN版本的大多数功能:v1(类型II)和v2(类型III)。

如下是创建ERSPAN隧道的方法:

 # ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 1 erspan IDX
 or
 # ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 2 erspan_dir DIRECTION erspan_hwid HWID
 
 Add tc filter to monitor traffic
 # tc qdisc add dev MONITOR_DEV handle ffff: ingress
 # tc filter add dev MONITOR_DEV parent ffff: matchall skip_hw action mirred egress mirror dev erspan1

概括

下面是我们介绍的所有隧道的总结。

隧道/链接类型

外部报文头

封装报文头

内部报文头

ipip

IPv4

None

IPv4

sit

IPv4

None

IPv4 / IPv6

ip6tnl

IPv6

None

IPv4 / IPv6

vti

IPv4

IPsec

IPv4

vti6

IPv6

IPsec

IPv6

gre

IPv4

GRE

IPv4 / IPv6

gretap

IPv4

GRE

以太网+ IPv4 / IPv6

ip6gre

IPv6

GRE

IPv4 / IPv6

ip6gretap

IPv6

GRE

以太网+ IPv4 / IPv6

fou

IPv4 / IPv6

UDP

IPv4 / IPv6 / GRE

gue

IPv4 / IPv6

UDP + GUE

IPv4 / IPv6 / GRE

geneve

IPv4 / IPv6

UDP +geneve

以太网+ IPv4 / IPv6

erspan

IPv4

GRE + ERSPAN

IPv4 / IPv6

ip6erspan

IPv6

GRE + ERSPAN

IPv4 / IPv6

注意:本教程中的所有配置都是临时生效的,并且在服务器重新启动后会丢失。如果要使配置在重新引导后保持不变,请考虑使用网络配置守护程序,例如NetworkManager或特定于发行版的机制。

相关推荐

CTO偷偷传我的系统性能优化十大绝招(万字干货)

上篇引言:取与舍软件设计开发某种意义上是“取”与“舍”的艺术。关于性能方面,就像建筑设计成抗震9度需要额外的成本一样,高性能软件系统也意味着更高的实现成本,有时候与其他质量属性甚至会冲突,比如安全性、...

提升效率!VMware虚拟机性能优化十大实用技巧

我40岁,干跨境婚恋中介的。为服务各国用户,常得弄英语、日语、俄语系统环境,VMware虚拟机帮了不少忙。用久了发现优化下性能,效率能更高。今儿就来聊聊优化技巧和同类软件。一、VMware虚拟...

低延迟场景下的性能优化实践

本文摘录自「全球C++及系统软件技术大会」ScottMeyers曾说到过,如果你不在乎性能,为什么要在C++这里,而不去隔壁的Pythonroom呢?今天我们就从“低延迟的概述”、“低延迟系...

Linux性能调优之内存负载调优的一些笔记

写在前面整理一些Linux内存调优的笔记,分享给小伙伴博文没有涉及的Demo,理论方法偏多,可以用作内存调优入门博文内容涉及:Linux内存管理的基本理论寻找内存泄露的进程内存交换空间调优不同方式的...

优化性能套路:带你战胜这只后段程序员的拦路虎

来源|极客时间《卖桃者说》作者|池建强编辑|成敏你好,这里是卖桃者说。今天给大家推荐一篇文章,来自倪朋飞老师的专栏《Linux性能优化实战》,文章主要讲的是优化性能的套路,这几乎是每个后端程序员...

SK海力士CXL优化解决方案已成功搭载于Linux:带宽提升30%,性能提升12%以上

SK海力士宣布,已将用于优化CXL(ComputeExpressLink)存储器运行的自研软件异构存储器软件开发套件(HMSDK)中主要功能成功搭载于全球最大的开源操作系统Linux上,不但提升了...

Linux内核优化:提升系统性能的秘诀

Linux内核优化:提升系统性能的艺术在深入Linux内核优化的世界之前,让我们先来理解一下内核优化的重要性。Linux内核是操作系统的核心,负责管理系统资源和控制硬件。一个经过精心优化的内核可以显著...

Linux系统性能优化:七个实战经验

Linux系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如在Linux上搭建了一个web服务,经常出现网页无法打开、打开速...

腾讯面试:linux内存性能优化总结

【1】内存映射Linux内核给每个进程都提供了一个独立且连续的虚拟地址空间,以便进程可以方便地访问虚拟内存;虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同字长的处理器,地址空间的范围也不同...

Linux文件系统性能调优《参数优化详解》

由于各种的I/O负载情形各异,Linux系统中文件系统的缺省配置一般来说都比较中庸,强调普遍适用性。然而在特定应用下,这种配置往往在I/O性能方面不能达到最优。因此,如果应用对I/O性能要求较高,除...

Nginx 性能优化(吐血总结)

一、性能优化考虑点当我需要进行性能优化时,说明我们服务器无法满足日益增长的业务。性能优化是一个比较大的课题,需要从以下几个方面进行探讨当前系统结构瓶颈了解业务模式性能与安全1、当前系统结构瓶颈首先需要...

Linux问题分析与性能优化

排查顺序整体情况:top/htop/atop命令查看进程/线程、CPU、内存使用情况,CPU使用情况;dstat2查看CPU、磁盘IO、网络IO、换页、中断、切换,系统I/O状态;vmstat2查...

大神级产品:手机装 Linux 运行 Docker 如此简单

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:灵昱Termux作为一个强大的Android终端模拟器,能够运行多种Linux环境。然而,直接在Termux上运行Docker并不可行,需要...

新手必须掌握的Linux命令

Shell就是终端程序的统称,它充当了人与内核(硬件)之间的翻译官,用户把一些命令“告诉”终端程序,它就会调用相应的程序服务去完成某些工作。现在包括红帽系统在内的许多主流Linux系统默认使用的终端是...

Linux 系统常用的 30 个系统环境变量全解析

在Linux系统中,环境变量起着至关重要的作用,它们犹如隐藏在系统背后的“魔法指令”,掌控着诸多程序的运行路径、配置信息等关键要素。尤其在shell脚本编写时,巧妙运用环境变量,能让脚本如虎...

取消回复欢迎 发表评论: