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隧道的方法:
1 | On Server A: |
注意:请根据测试环境将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隧道的方法:
1 | On Server A: |
然后,在远端执行相同的步骤。
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隧道的方法:
1 | 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隧道的方法:
1 | ip link add name vti1 type vti key VTI_KEY local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR |
也可以通过libreswan或strongSwan配置IPsec。
GRE和GRETAP
通用路由封装,也称为GRE,在RFC 2784中定义。
GRE隧道在内部和外部IP头之间添加了一个额外的GRE头。从理论上讲,GRE可以封装具有有效以太网类型的任何第3层协议,而IPIP只能封装IP。GRE报文头看起来如下所示:
请注意,GRE隧道支持传输多播流量和IPv6报文。
当gre
模块被加载,Linux内核将创建一个默认设备,命名gre0
。
如下是创建GRE隧道的方法:
1 | 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隧道的方法:
1 | 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隧道的方法:
1 | ip link add name gre1 type ip6gre 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隧道的方法:
1 | ip fou add port 5555 ipproto 4 |
第一条命令为绑定到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隧道的方法:
1 | ip fou add port 5555 gue |
这将为绑定到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隧道的方法:
1 | 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隧道的方法:
1 | ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 1 erspan IDX |
概括
下面是我们介绍的所有隧道的总结。
隧道/链接类型 | 外部报文头 | 封装报文头 | 内部报文头 |
---|---|---|---|
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或特定于发行版的机制。