路由封装(GRE)最早是由Cisco提出的,而目前它已经成为了一种标准,被定义在RFC 1701, RFC 1702, 以及RFC 2784中。简单来说,GRE就是一种隧道协议,用来从一个网络向另一个网络传输数据包。
如果你觉得它和虚拟专用网(×××)有些类似,那只是因为:从技术上讲,GRE隧道是某一类型的×××,但是并不是一个安全隧道方式。不过你也可以使用某种加密协议对GRE隧道进行加密,比如×××网络中常用的IPSEC协议。
实际上,点到点隧道协议(PPTP)就是使用了GRE来创建×××隧道。比如,如果你要创建Microsoft ×××隧道,默认情况下会使用PPTP,这时就会用到GRE
为什么要用GRE?
为什么要使用GRE进行隧道传输呢?原因如下:
有时你需要加密的多播传输。GRE隧道可以像真实的网络接口那样传递多播数据包,而单独使用IPSec,则无法对多播传输进行加密。多播传输的例子包括OSPF, EIGRP, 以及RIPV2。另外,大量的视频、VOIP以及音乐流程序使用多播。
 
你所采用的某种协议无法进行路由,比如NetBIOS或在IP网络上进行非IP传输。比如,你可以在IP网络中使用GRE支持IPXAppleTalk协议。
 
你需要用一个IP地址不同的网络将另外两个类似的网络连接起来。
 
如何配置GRE隧道?
在CISCO路由器上配置GRE隧道是一个简单的工作,只需要输入几行命令即可实现。以下是一个简单的例子。
路由器A:
interface Ethernet0/1
ip address 10.2.2.1 255.255.255.0   (  公网地址 )
interface Serial0/0
ip address 192.168.4.1 255.255.255.0 (  私网地址 )
interface Tunnel 0
ip address 1.1.1.2 255.255.255.0
tunnel source Serial0/0
tunnel destination 192.168.4.2
路由器B:
interface FastEthernet0/1
ip address 10.1.1.1 255.255.255.0
interface Serial0/0
ip address 192.168.4.2 255.255.255.0
interface Tunnel0
ip address 1.1.1.1 255.255.255.0
tunnel source Serial0/0
tunnel destination 192.168.4.1
在这个例子中,两个路由器均拥有虚拟接口,即隧道接口。这一接口属于各自的网络,就好像一个点到点的T1环路。跨越隧道网络的数据采用串行网络方式传输。
对于每个路由器都有两种途径将数据传递到另一端,即通过串行接口以及通过隧道接口(通过隧道传递数据)。该隧道可以传输非路由协议的数据,如NetBIOSAppleTalk。如果数据需要通过互联网,你可以使用IPSec对其进行加密。
从下面的信息反馈可以看出,路由器B上的隧道接口和其他网络接口没有什么不同:
RouterB# sh ip int brie
Interface   IP-Address   OK?  Method  Status                 Protocol
Ethernet0   10.1.1.1     YES  manual  up                     down
Serial0     192.168.4.2  YES  manual  up                     up
Serial1     unassigned   YES  unset   administratively down  down
Tunnel0     1.1.1.1      YES  manual  up                     up
RouterB#
解决GRE隧道的问题
由于GRE是将一个数据包封装到另一个数据包中,因此你可能会遇到GRE的数据包大于网络接口所设定的数据包最大尺寸的情况。接近这种问题的方法是在隧道接口上配置ip tcp adjust-mss 1436
另外,虽然GRE并不支持加密,但是你可以通过tunnel key命令在隧道的两头各设置一个密钥。这个密钥其实就是一个明文的密码。
由于GRE隧道没有状态控制,可能隧道的一端已经关闭,而另一端仍然开启。这一问题的解决方案就是在隧道两端开启keepalive数据包。它可以让隧道一端定时向另一端发送keepalive数据,确认端口保持开启状态。如果隧道的某一端没有按时收到keepalive数据,那么这一侧的隧道端口也会关闭。