VPS之家

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

Linux已经支持多种类型的隧道,但是新用户可能会对它们的差异感到困惑,不确定哪一种最适合给定的环境,所以在这里做个总结。列数一下这些隧道协议的不同区别。此外,还可以iproute2命令获得隧道接口列表以及特定隧道配置的帮助。

Bash

ip link help

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

  • IPIP
  • SIT
  • ip6tnl
  • VTI和VTI6
  • GRE和GRETAP
  • IP6GRE和IP6GRETAP
  • FOU
  • GUE
  • GENEVE
  • ERSPAN 和IP6ERSPAN

IPIP隧道

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

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

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

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

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

Bash

# 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隧道的头信息是这样的:

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

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

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

Bash

# 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版本。它的头信息是这样的:

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

ip6tnl支持ip6ip6、ipip6、any模式。模式ipip6是IPv6上的IPv4,模式ip6ip6是IPv6上的IPv6,模式any支持IPv6上的IPv4/IPv6。 当加载ip6tnl模块时,Linux内核将创建一个默认设备,名为ip6tnl0。

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

Bash

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隧道的方法:

Bash

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

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

GRE的头信息是这样的:

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

请注意,您可以通过GRE隧道传输多播流量和IPv6。当加载gre模块时,Linux内核将创建一个默认设备,名为gre0。

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

Bash

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中:

Bash

brctl addif your-bridge gre1

GRETAP的头信息是这样的:

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

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

Bash

ip link add name gretap1 type gretap local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR

IP6GRE 和 IP6GRETAP

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

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

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

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

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

Bash

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的头信息是这样的:

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

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

Bash

# 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报头的一个示例如下:

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

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

Bash

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

创建一个 CUE 从 5555 端口接收 IPIP 数据包,并为 GUE 封装配置一个 IPIP 隧道。

注意:Red Hat Enterprise Linux 不支持 GUE。

GENEVE

Generic Network Virtualization Encapsulation (GENEVE) 支持 VXLAN、NVGRE 和 STT,旨在克服它们的局限性。很多人认为 GENEVE 最终能够完全代替这些早期的格式。

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

看起来与 VXLAN 非常相似。主要的区别在于 GENEVE 头是弹性的。通过扩展新的 Type-Length-Value (TLV) 字段,可以轻松添加新功能。

Open Virtual Network (OVN) 使用 GENEVE 作为默认的封装。

创建 GENEVE 隧道:

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

ERSPAN 与 IP6ERSPAN

Encapsulated Remote Switched Port Analyzer (ERSPAN) 使用 GRE 将基础端口镜像功能从二层扩展到三层,允许通过可路由的 IP 网络发送镜像流量。

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

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

Linux 当前支持两个 ERSPAN 版本的绝大多数功能。

创建 ERSPAN 隧道:

# 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
Tunnel/Link Type Outer Header Encapsulate Header Inner Header
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 Ether IPv4/IPv6
ip6gre IPv6 GRE IPv4/IPv6
ip6gretap IPv6 GRE Ether IPv4/IPv6
fou IPv4/IPv6 UDP IPv4/IPv6/GRE
gue IPv4/IPv6 UDP GUE IPv4/IPv6/GRE
geneve IPv4/IPv6 UDP Geneve Ether IPv4/IPv6
erspan IPv4 GRE ERSPAN IPv4/IPv6
ip6erspan IPv6 GRE ERSPAN IPv4/IPv6

转载自:https://blog.tianjinkun.com/post/113.html
https://blog.crazytaxii.com/posts/an_introduction_2_tunnel/