ipip, sit, ip6tnl, vti, gre, gretap等常见隧道区别总结

天锦 发表于 码农也得有格调 分类,标签:

Linux已经支持多种类型的隧道,但是新用户可能会对它们的差异感到困惑,不确定哪一种最适合给定的环境。比如我在使用gre隧道时就搞不明白,都是gre隧道,为什么gre类型的不能把接口加到bridge里面,而必须要使用gretap。所以在这里做个总结。列数一下这些隧道协议的不同区别。此外,还可以iproute2命令获得隧道接口列表以及特定隧道配置的帮助

ip link help

本片文章将包含以下常用隧道

  • IPIP

  • SIT

  • ip6tnl

  • VTI和VTI6

  • GRE和GRETAP

  • IP6GRE和IP6GRETAP

  • FOU

  • GUE

  • GENEVE

  • ERSPAN 和IP6ERSPAN

IPIP隧道

与字面意思一样,就是一个IP over IP的隧道,在 RFC 2003 中定义了的,他的头信息是这样的:

ipip.png

它通常用于通过公共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 
# 添加远程设备其他子网的路由
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


注意:请根据您的测试环境将本地IP v4 ADDR、远程IP v4 ADDR、内部IP v4 ADDR和远程内部子网替换为相应的地址。以下配置示例也是如此。

SIT隧道

主要目的是互连位于全球IPv4互联网中的孤立的IPv6网络。 最初,它只有IPv6 over IPv4隧道模式。然而,经过多年的发展,它获得了对几种不同模式的支持,如ipip(IPIP隧道也是如此)、ip6ip、mplsip和any。模式any用于接受IP和IPv6流量,这在某些部署中可能很有用。SIT隧道也支持ISATA,可以看这个使用示例。 SIT隧道的头信息是这样的:

sit.png

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

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

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

ip6tnl隧道

ip6tnl是IPv4/IPv6 over IPv6隧道接口,看起来像是SIT隧道的IPv6版本。它的头信息是这样的:

ip6tnl.png


ip6tnl支持ip6ip6、ipip6、any模式。模式ipip6是IPv6上的IPv4,模式ip6ip6是IPv6上的IPv6,模式any支持IPv6上的IPv4/IPv6。 当加载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相当于IPv6中的VTI。

以下是创建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

RFC 2784 中定义了通用路由封装,也称为GRE,GRE隧道在内部和外部IP报头之间增加了一个额外的GRE报头。理论上,GRE可以用有效的封装以太网类型的第3层协议,不像IPIP只能封装IP。你可以在GRE隧道上传输OSPF这样的其他三层协议。

GRE的头信息是这样的:

gre.png

请注意,您可以通过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层,这意味着在内部报头中有一个以太网报头,你可以在上面跑二层应用,比如把它加到bridge中:

brctl addif your-bridge gre1

GRETAP的头信息是这样的:

gretap.png

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

ip link add name gretap1 type gretap local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR

IP6GRE 和 IP6GRETAP

IP6GRE是IPv6的GRE等价物,它允许我们封装IPv6上的任何第3层协议。它的头信息是这样的:

gre6.png

IP6GRETAP和GRETAP一样,在内部头中有一个以太网头:

gre6tap.png

以下是创建IP6GRE和IP6GRETAP隧道的方法:

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可以与现有的硬件基础设施一起工作,如网卡中的RSS、交换机中的ECMP和负载校验。开发人员的 补丁日志 记录了FOU相对于SIT和IPIP协议的性能有所提高。 目前,FOU隧道支持基于IPIP、SIT、GRE的封装协议。FOU的头信息是这样的:

fou.png


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

# configured a FOU receive port for IPIP bound to 5555; for GRE, you need to set ipproto 47
ip fou add port 5555 ipproto 4
# set up a new IPIP virtual interface (tun1) configured for FOU encapsulation, with dest port 5555.
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

GUE

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

目前,GUE隧道支持内部IPIP、SIT、GRE封装。GUE报头的一个示例如下:

gue.png

以下是创建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


0 篇评论

发表我的评论