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=any
和
remote=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_ADDR
,
REMOTE_IPv4_ADDR
,
INTERNAL_IPV4_ADDR
和
REMOTE_INTERNAL_SUBNET
需要替换为您环境中使用的地址。 对于其他配置示例也是如此,我们将在后面讨论。
坐
SIT(简单Internet转换)是一种隧道技术,其主要目的是使用IPv4协议通过Internet连接隔离的IPv6网络。
最初,SIT技术只能在“ IPv6 over IPv4”隧道模式下工作。 但是,经过多年的发展,它已经获得了更多政权的支持。 特别是
ipip
(IPIP隧道也发生了同样的事情),
ip6ip
,
mplsip
和
any
。
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隧道支持
ip6ip6
,
ipip6
和
any
模式。
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
另外,可以使用
libreswan或
strongSwan配置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中的许多隧道技术。 这是它们的摘要表。
请注意,所有隧道(在此处显示其创建示例)仅在重新启动服务器之前存在。 如果要创建在重新引导后恢复的隧道,请考虑使用守护程序来配置网络,例如
NetworkManager ,或使用所使用的Linux发行版中的适当机制。
亲爱的读者们! 您使用什么Linux隧道?