Linux虚拟接口简介:隧道

Linux支持多种类型的隧道。 这使初学者感到困惑,他们难以理解技术的差异,也难以理解在特定情况下哪种隧道更适合使用。 我们今天出版的翻译材料将简要概述Linux内核的常用隧道接口。 我们不会深入研究这个主题,仅考虑隧道的一般功能以及在Linux中使用隧道的选项。



该材料的作者认为,此处讨论的内容可能与管理计算机网络有关的每个人都感兴趣。 可以使用iproute2 ip link help命令获取隧道接口列表以及有关特定配置的参考信息。

以下将介绍以下常用接口:IPIP,SIT,ip6tnl,VTI和VTI6,GRE和GRETAP,GRE6和GRE6TAP,FOU,GUE,GENEVE,ERSPAN和IP6ERSPAN。

阅读本文之后,您将了解这些接口的功能并找出它们之间的区别。 您将学习如何创建它们以及如何最好地使用它们。

IPIP


顾名思义,IPIP隧道是以IP over IP模式( RFC 2003 )运行的隧道。 IPIP隧道数据包头如下所示。


IPIP隧道数据包头

此类隧道通常用于通过公共IPv4网络(Internet)连接两个内部IPv4子网。 IPIP的使用在系统上产生了最小的额外负载,但是在这种隧道上只能执行单向数据传输(单播)。 即,已经建立了这样的隧道,将不可能将其用于多播数据传输。

IPIP隧道支持IP over IP和MPLS over IP模式。

请注意,在加载ipip模块或首次创建IPIP设备时,Linux内核将在每个名称空间中使用local=anyremote=any属性创建默认的tunl0设备。 在某些情况下,内核在接收IPIP数据包时会将其重定向到tunl0作为默认设备。 当内核找不到另一个local/remote属性与数据包的源地址和目标地址更匹配的设备时,就会发生这种情况。

创建IPIP隧道的方法如下:

在服务器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 

在服务器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_ADDRREMOTE_IPv4_ADDRINTERNAL_IPV4_ADDRREMOTE_INTERNAL_SUBNET需要替换为您环境中使用的地址。 对于其他配置示例也是如此,我们将在后面讨论。


SIT(简单Internet转换)是一种隧道技术,其主要目的是使用IPv4协议通过Internet连接隔离的IPv6网络。

最初,SIT技术只能在“ IPv6 over IPv4”隧道模式下工作。 但是,经过多年的发展,它已经获得了更多政权的支持。 特别是ipip (IPIP隧道也发生了同样的事情), ip6ipmplsipany

any模式都可用于处理IP和IPv6流量,这在某些情况下可能很有用。 SIT隧道还支持ISATAP 。 这是使用此技术的示例

SIT数据包的标头如下所示。


SIT隧道数据包头

sit模块加载时,Linux内核会创建默认sit0

这是创建SIT隧道的方法(这些步骤必须在服务器A和B上执行):

 # 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接口可在IPv4 / IPv6 over IPv6模式下工作。 它类似于SIT隧道的IPv6版本。 这就是ip6tnl包标头的样子。


ip6tnl隧道数据包头

ip6tnl隧道支持ip6ip6ipip6any模式。 ipip6模式由IPv4 over IPv6方案表示, ip6ip6模式是IPv6 over IPv6。 any模式都支持两种方案。

ip6tnl模块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接口和安全隧道(st.xx)的Juniper实施。

此隧道驱动程序实现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 

另外,可以使用libreswanstrongSwan配置IPsec。

GRE和GRETAP


GRE(通用路由封装)技术在RFC 2784中​​进行了描述。 在GRE隧道中,在内部和外部IP数据包的标头之间添加了一个额外的GRE标头。

从理论上讲,GRE可以封装具有有效以太网类型的任何第3层协议的数据包。 这将GRE技术与IPIP技术区分开来,后者仅支持IP数据包的封装。 这是使用GRE技术时包头的外观。


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隧道包头

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

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

GRE6和GRE6TAP


GRE6是GRE的IPv6等效项。 GRE6隧道使您可以将任何第3层协议封装在IPv6中。 这就是GRE6包标头的样子。


GRE6隧道包头

与GRETAP隧道一样,在GRE6TAP隧道中,内部数据包头中也有以太网头。


GRE6TAP隧道包头

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

 # ip link add name gre1 type gre6 local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR # ip link add name gretap1 type gretap6 local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR 

ou


可以在网络堆栈的不同级别执行隧道。 IP层存在IPIP,SIT和GRE隧道。 FOU隧道(根据“ foo over UDP”方案安排)在UDP级别上运行。

通过IP隧道使用UDP隧道有一些优势。 事实是UDP协议可与现有的硬件基础结构一起使用。

例如,这是网卡中的RSS ,交换机中的ECMP ,这些是无需中央处理器参与即可计算校验和的技术。 将适当的FOU 修补程序应用到开发人员,可以显着提高SIT和IPIP的性能。

当前,FOU隧道支持基于IPIP,SIT和GRE的协议封装。 这是FOU包标头的样子。


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 。 第二个命令配置新的虚拟IPIP接口( tun1 ),该接口专为FOU封装而设计,其目标端口为5555。

请注意,红帽企业版Linux不支持FOU隧道。

ue


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

GUE隧道当前支持IPIP,SIT和GRE的内部封装。 这就是GUE包标头的样子。


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隧道。

红帽企业版Linux不支持GUE隧道。

给予


GENEVE隧道(通用网络虚拟化封装)支持XLAN,NVGRE和STT的所有功能。 GENEVE技术旨在规避这三种技术的已确定限制。 许多人认为,从长远来看,这项技术能够完全替代这三种旧格式。 这是GENEVE隧道数据包标头的样子。


GENEVE隧道包头

此标头类似于VXLAN数据包的标头。 两者之间的主要区别是GENEVE标头更灵活。 通过使用Type-Length-Value(TLV)字段扩展标头,可以非常轻松地实现新功能。

有关GENEVE的详细信息可以在此处此处找到。

GENEVE在开放式虚拟网络 (OVN)SDN解决方案中用作标准封装工具。 以下是创建GENEVE隧道的方法:

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

ERSPAN和IP6ERSPAN


封装的远程交换端口分析器(ERSPAN)技术使用GRE封装将端口镜像的基本功能从第2层扩展到第3层。 这使您可以通过路由的IP网络转发镜像流量。 这就是ERSPAN包标头的样子。


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 

您也可以这样做:

 # 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 

添加一个tc过滤器以监控流量:

 # 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 

总结


我们在这里介绍了Linux中的许多隧道技术。 这是它们的摘要表。

隧道/连接类型
外头
封装头
内页眉
ipip
IPv4

IPv4
坐下
IPv4

IPv4 / IPv6
ip6tnl
IPv4

IPv4 / IPv6
vti
IPv4
安全协议
IPv4
vti6
IPv6
安全协议
IPv6
格蕾
IPv4
GRE
IPv4 / IPv6
格列塔普
IPv4
GRE
以太网+ IPv4 / IPv6
gre6
IPv6
GRE
IPv4 / IPv6
gre6tap
IPv6
GRE
以太网+ IPv4 / IPv6
ou
IPv4 / IPv6
UDP协议
IPv4 / IPv6 / GRE
gue
IPv4 / IPv6
UDP + GUE
IPv4 / IPv6 / GRE
日内瓦
IPv4 / IPv6
UDP +日内瓦
以太网+ IPv4 / IPv6
尔斯潘
IPv4
GRE + ERSPAN
IPv4 / IPv6
ip6erspan
IPv6
GRE + ERSPAN
IPv4 / IPv6

请注意,所有隧道(在此处显示其创建示例)仅在重新启动服务器之前存在。 如果要创建在重新引导后恢复的隧道,请考虑使用守护程序来配置网络,例如NetworkManager ,或使用所使用的Linux发行版中的适当机制。

亲爱的读者们! 您使用什么Linux隧道?

Source: https://habr.com/ru/post/zh-CN457386/


All Articles