0%

Linux虚拟接口之隧道介绍

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隧道标头如下所示:

ipip

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
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.png

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

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

1
2
3
4
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.png

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
2
3
4
5
6
7
8
# 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

请注意,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

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

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

IP6GRE和IP6GRETAP

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

gre6

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

gre6tap

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

1
2
# 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

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

1
2
# 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

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

1
2
# 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最终可以完全取代这些早期格式。隧道头看起来如下所示:

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

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

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

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

1
2
3
4
5
6
7
# 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或特定于发行版的机制。