Generic Routing Encapsulation (GRE) 和IP-in-IP (IPIP) 是两个相似的隧道机制,但经常混淆。在本文中,我们将介绍它们的运作机制、区别以及何时使用它们。

IPIP

IP-in-IP 听起来就像:一个IP包封装在另一个IP包中。外层报头的协议字段为IPv4为4,IPv6为41。

IPv4与IPv6封装的所有组合在技术上都是可行的,但是有些厂商可能不支持所有组合。. 在Cisco IOS上有三种IPIP封装方法:IPv4/IPv4、IPv6/IPv6和IPv6/IPv4。

Router(config)# interface tun0
Router(config-if)# tunnel mode ?
  aurp    AURP TunnelTalk AppleTalk encapsulation
  cayman  Cayman TunnelTalk AppleTalk encapsulation
  dvmrp   DVMRP multicast tunnel
  eon     EON compatible CLNS tunnel
  gre     generic route encapsulation protocol
  ipip    IP over IP encapsulation
  ipsec   IPSec tunnel encapsulation
  iptalk  Apple IPTalk encapsulation
  ipv6    Generic packet tunneling in IPv6
  ipv6ip  IPv6 over IP encapsulation
  mpls    MPLS encapsulations
  nos     IP over IP encapsulation (KA9Q/NOS compatible)
  rbscp   RBSCP in IP tunnel

GRE

GRE (defined in RFC 2784 and updated by RFC 2890) 比IPIP更进一步,在内部和外部IP报头之间添加了自己的附加报头。

GRE报头的长度是可变的,从4字节到16字节不等,这取决于启用了哪些可选特性。

  • C, K, and S: Bit flags which are set to one if the checksum, key, and sequence number fields are present, respectively
  • Ver: GRE version number (zero)
  • Protocol: Ethertype of the encapsulated protocol
  • Checksum: Packet checksum (optional)
  • Key: Tunnel key (optional)
  • Sequence Number: GRE sequence number (optional)

GRE理论上可以使用有效的以太类型封装任何第三层协议, 而IPIP只能封装IP。

GRE在Cisco IOS上 可以 被IPv4或IPv6封装。(The multipoint option is used for DMVPN)

Router(config)# interface tun0
Router(config-if)# tunnel mode gre ?
  ip          over IP
  ipv6        over IPv6
  multipoint  over IP (multipoint)

默认情况下,只包含一个最小的4字节头。其他GRE选项可以独立地打开或关闭:

Router(config-if)# tunnel ?
  bandwidth           Set tunnel bandwidth informational parameter
  checksum            enable end to end checksumming of packets
  destination         destination of tunnel
  flow                flow options
  key                 security or selector key
  mode                tunnel encapsulation method
  mpls                MPLS tunnel commands
  path-mtu-discovery  Enable Path MTU Discovery on tunnel
  protection          Enable tunnel protection
  rbscp               Set tunnel RBSCP parameters
  route-via           Select subset of routes for tunnel transport
  sequence-datagrams  drop datagrams arriving out of order
  source              source of tunnel packets
  tos                 set type of service byte
  ttl                 set time to live
  udlr                associate tunnel with unidirectional interface
  vrf                 set tunnel vrf membership

总而言之,GRE可以:

• 封装任何第三层协议(而不只是IP)
• 添加一个额外的校验(这对TCP/IPv4没什么用)
• 指定一个隧道key
• 执行数据包排序( Enforce packet sequencing )

当然,这些特性是以额外的开销为代价的;如果不需要GRE的额外功能,IPIP也可以。