——————————————————————————————————————————————————
GRE是通用路由封装协议,可以对某些网络层协议(如IPX、IPv6、AppleTalk等)的数据报进行封装,使这些被封装的数据报文能够在IPv4网络中传输。
GRE提供了将一种协议的报文封装在另一种协议报文中的机制,使报文能够在异种网络中传输,而异种报文传输的通道称为Tunnel。
目的
为了使某些网络层协议(如IPX、IPv6、AppleTalk等)的报文能够在IPv4网络中传输,可以将某些网络层协议的报文进行封装,以此解决了异种网络的传输问题。
GRE也可以作为VPN的第三层隧道协议,为VPN数据提供透明传输通道。目前,只有IPv4 L3VPN支持GRE隧道,IPv6 L3VPN暂时不支持GRE隧道。
——————————————————————————————————————————————————
产生的原因
骨干网中一般采用单一网络协议(例如IPv4)进行数据报文传输,但是不同的非骨干网上可能会使用不同网络协议(例如:IP、IPv6、IPX等)进行数据报文传输。由于骨干网与非骨干网使用的协议不同,这样将导致非骨干网之间无法通过骨干网传输数据报文。GRE协议通过实现一种协议封装另一种协议来解决这个问题。
如图:Group1和2运行Novell IPX的非骨干网,Term1和2运行IPv6的非骨干网,中间使用的是IPv4网络,为了实现group1和group2、term1和term2通过骨干网传输数据,可以在A和B之间采用GRE协议建立隧道,数据包封装在IPV4协议中,然后转发。
——————————————————————————————————————————————————
系统收到需要进行封装数据时,将首先对其加上GRE报文头,使之成为GRE报文,再将其封装在另一协议(如IP)中。这样,此报文的转发就可以完全由IP协议负责。
封装后的报文的格式:
净荷(Payload):系统收到的需要封装和传输的数据报称为净荷。
乘客协议(Passenger Protocol):封装前的报文协议称为乘客协议。
封装协议(Encapsulation Protocol):上述的GRE协议称为封装协议,也称为运载协议(Carrier Protocol)。
传输协议(Transport Protocol或者Delivery Protocol):负责对封装后的报文进行转发的协议称为传输协议。
例如一个封装在IP Tunnel中的IPX报文的格式可以表示为:
——————————————————————————————————————————————————
报文在GRE隧道中传输包括封装和解封装两个过程。如果私网报文从Ingress PE向Egress PE传输,则封装在Ingress PE上完成;而解封装在Egress PE上进行。
封装:
Ingress PE从连接私网的接口接收到私网报文后,首先交由私网上运行的协议模块处理。私网协议模块检查私网报文头中的目的地址域在私网路由表或转发表中查找出接口,确定如何路由此包。如果发现出接口是GRE Tunnel接口,则将此报文发给隧道模块。处理如下:
1、根据乘客报文的协议类型及GRE隧道所配置的Key参数,对报文进行GRE封装,即添加GRE头。
2、根据配置信息(传输协议为IP),给报文加上IP头。源地址是隧道的地址,IP头目的地址是隧道的目的地址。
3、根据该IP头目的地址,在公网路由表中查找相应的出接口并发送报文。
解封装:
解封装过程和封装过程相反。Egress PE从连接公网的接口收到该报文,分析IP头发现报文的目的地址为本设备,且协议字段值为47,表示协议为GRE,于是交给GRE模块处理。GRE模块去掉IP头和GRE报文头,并根据GRE头的Protocol Type字段,发现此报文的乘客协议为私网上运行的协议,于是交由此私网协议处理。此私网协议像对待一般数据报一样对此数据报进行转发。
——————————————————————————————————————————————————
在网络中部署GRE隧道价值三个方面:
使客户的部署不同协议网络使用单一网络协议进行数据传输。
可以扩大受协议的步跳数限制的网络的工作范围。
将一些不能连续的子网连接起来,用于组建VPN。
——————————————————————————————————————————————————
由于GRE协议并不具备检测链路状态的功能。如果远端端口不可达,隧道并不能及时关闭该Tunnel连接,这样会造成源端会不断的向对端转发数据,而对端却因Tunnel不通而丢弃所有报文,由此就会形成数据发送的空洞。
GRE的Keepalive检测功能用于时刻检测隧道链路是否处于Keepalive状态,即检测隧道对端是否可达。如果对端不可达,隧道连接就会及时关闭,避免形成数据空洞。
实现过程:
周期地发送Keepalive探测报文给对端。若对端可达,则源端会收到对端的回应报文;否则,收不到对端的回应报文。
1、当使能检测功能后,创建一个定时器周期地发送Keepalive探测报文,同时进行不可达计数。每发送一个探测报文,不可达计数加1。
2、对端每收到一个探测报文,就给源端发送一个回应报文。
3、如果源端的计数器值到达预先设置的值——重试次数(Retry Times)时,还没收到回送报文,就认为对端不可达。此时,源端将关闭隧道连接。
只要在隧道一端配置Keepalive,该端就具备Keepalive功能,而不要求隧道对端也具备该功能。隧道对端收到报文,如果是Keepalive探测报文,无论是否配置Keepalive,都会给源端发送一个回应报文。
——————————————————————————————————————————————————
扩大网络工作范围
网络运行IP协议,假设IP协议限制跳数为255。如果两台PC之间的跳数超过255,它们将无法通信。在网络中使用隧道可以隐藏一部分步跳,从而扩大网络的工作范围。
将不连续的子网连接起来,用于组建VPN
使用GRE隧道可以将不连续的子网连接起来,实现跨越广域网的VPN。例如,两个VPN子网Site1和Site2位于不同的城市,通过在网络边界设备之间建立GRE隧道,可以把这两个子网连接成一个连续的VPN网络。
GRE可应用于L2VPN,也可以应用于L3VPN。有两种模式:
CPE-based VPN中,GRE隧道两端驻留在CE上。在此模式中,CE指的就是客户终端设备CPE。
Network-based VPN中,GRE隧道两端驻留在PE上。
通常,VPN骨干网使用LSP作为公网隧道。但如果骨干网核心设备(P设备)只提供纯IP功能,不具备MPLS功能;而网络边缘的PE具备MPLS功能,这样,就不能使用LSP作为公网隧道。此时,可以使用GRE隧道替代LSP,在核心网提供三层或二层VPN解决方案。
——————————————————————————————————————————————————
GRE提供了将一种协议的报文封装在另一种协议报文中的机制,使报文能够在异种协议的网络中传输,而异种报文传输的通道称为Tunnel。
——————————————————————————————————————————————————
对应的源接口或者源地址所在接口上需要配置绑定GRE隧道协议,只有这些接口上绑定了GRE隧道协议,GRE隧道才能使用这些接口传输GRE封装的报文。
在隧道两端的路由器上进行如下配置。
——————————————————————————————————————————————————
创建Tunnel接口后,需要指定封装方式为GRE、设置Tunnel接口的源地址或源接口、设置Tunnel接口的目的端地址。此外为使隧道支持动态路由协议,还要配置Tunnel接口的IP地址。
配置隧道的源接口时,需要注意:隧道的源接口不能指定为自身的Tunnel接口,但可以指定为其他隧道的Tunnel接口。MTU值仅对设备本身发送报文时,经过GRE封装的报文有效,对于设备收到的报文进行GRE封装转发时,MTU值不生效。
——————————————————————————————————————————————————
在源端设备和目的端设备上都必须存在经过Tunnel转发的路由,需要进行GRE封装的报文才能正确转发。经过Tunnel接口的路由可以是静态路由,也可以是动态路由。
配置静态路由时,源端设备和目的端设备都需要配置:此路由目的地址不是Tunnel的目的地址,也不是对端Tunnel接口的地址,而是未进行GRE封装的报文的原始目的地址,出接口是本端Tunnel接口。
配置动态路由协议时,在Tunnel接口和与私网相连的路由器接口上都要使能该动态路由协议。并且,配置去往Tunnel目的端实际接口地址的路由时,为保证能够选择正确的路由,应注意Tunnel接口不能作为该路由的下一跳。
——————————————————————————————————————————————————
——————————————————————————————————————————————————
以典型组网为背景,介绍如何配置GRE使用静态路由,使得用户端之间的流量通过GRE隧道传输。设备到与其相连的客户端之间需要配置静态路由。
AR1、AR2、AR3属于VPN骨干网,之间运行OSPF。现需要在AR2和AR3之间建立直连链路,因此在AR2和AR3之间部署GRE隧道,通过静态路由指定到达对端的报文通过Tunnel接口转发,实现PC4和PC6互相通信。PC4和PC6分别指定AR2、AR3为自己的默认网关。
——————————————————————————————————————————————————
AR1:
int lo 0
ip add 1.1.1.1 32
int g0/0/0
ip add 192.168.100.1 30
int g0/0/1
ip add 192.168.100.5 30
router id 1.1.1.1
ospf 100
area 0
net 1.1.1.1 0.0.0.0
net 192.168.100.0 0.0.0.3
net 192.168.100.4 0.0.0.3
AR2:
int lo 0
ip add 2.2.2.2 32
int g0/0/0
ip add 192.168.100.2 30
int g0/0/1
ip add 192.168.1.254 24
router id 2.2.2.2
ospf 100
area 0
net 2.2.2.2 0.0.0.0
net 192.168.100.0 0.0.0.3
AR3:
int lo 0
ip add 3.3.3.3 32
int g0/0/0
ip add 192.168.100.6 30
int g0/0/1
ip add 192.168.2.254 24
router id 3.3.3.3
ospf 100
area 0
net 3.3.3.3 0.0.0.0
net 192.168.100.4 0.0.0.3
——————————————————————————————————————————————————
AR2:
int Tunnel 0/0/0
tunnel-protocol gre
ip add 192.168.100.9 30
source 192.168.100.2
destination 192.168.100.6
AR3:
int Tunnel 0/0/0
tunnel-protocol gre
ip add 192.168.100.10 30
source 192.168.100.6
destination 192.168.100.2
在配置隧道的时候,一定注意在配置目标地址的时候,别把命令搞错了。destination目标命令和description描述命令。
配置完成后,Tunnel接口状态变为UP,接口之间可以Ping通。
——————————————————————————————————————————————————
AR2:
ip route-static 192.168.2.0 24 Tunnel 0/0/0
AR3:
ip route-static 192.168.1.0 24 Tunnel 0/0/0
PC之间可以相互通信
——————————————————————————————————————————————————
PC Ping查看下数据包。
AR2 G0/0/1口收到PC的数据包,Src:192.168.1.1,Dst:192.168.2.1。
AR2收到数据包之后根据目的查找路由表和出接口,发现出接口是GRE Tunnel接口后,对源数据包进行封装,添加GRE头。添加隧道的源地址和目标地址。根据封装好的数据包查找相应的接口进行转发。
解封装反之。
——————————————————————————————————————————————————
由于GRE协议并不具备检测链路状态的功能。如果远端端口不可达,隧道并不能及时关闭该Tunnel连接,这样会造成源端会不断的向对端转发数据,而对端却因Tunnel不通而丢弃所有报文,由此就会形成数据发送的空洞。
GRE隧道的Keepalive功能是单向的。如果希望使两端都具备Keepalive功能,需在两端都使能GRE隧道的Keepalive功能。对端是否支持Keepalive功能不影响本端的Keepalive功能。但建议在隧道两端都使能Keepalive功能。
AR2:
int Tunnel 0/0/0
keepalive
AR3:
int Tunnel 0/0/0
keepalive
默认配置,指定发送Keeppalive报文定时器周期5秒。指定不可达计数器参数,默认3。
AR2:
int Tunnel 0/0/0
keepalive period 12 retry-times 4
AR3:
int Tunnel 0/0/0
keepalive period 12 retry-times 4
使能GRE隧道Keepalive功能并指定发送周期为12秒,不可达计数器为4。
——————————————————————————————————————————————————
为了增强GRE隧道的安全性,可以对GRE隧道两端进行端到端校验或者设置GRE隧道的识别关键字,通过这种安全机制防止错误识别、接收其它地方来的报文。
AR2:
int Tunnel 0/0/0
gre key 1111
AR3:
int Tunnel 0/0/0
gre key 1111
——————————————————————————————————————————————————
在骨干网上各路由器运行IGP协议实现互通,这里用OSPF进程100。与PC相连的路由器之间建立GRE隧道,使其彼此之间传输都通过GRE隧道。PC接入骨干网的那部分网段运行动态路由协议,这里用的是OSPF进程10。
前面的配置都一样。运行OSPF路由协议、Tunnel接口隧道配置。忽略。
——————————————————————————————————————————————————
AR2:
ospf 10
area 0
net 192.168.100.8 0.0.0.3
net 192.168.1.0 0.0.0.255
AR3:
ospf 10
area 0
net 192.168.100.8 0.0.0.3
net 192.168.2.0 0.0.0.255
可以看到经过Tunnel接口去往对端用户侧网段的OSPF路由,去往Tunnel目的端物理地址192.168.100.4/30的路由下一跳不是Tunnel接口。
——————————————————————————————————————————————————
GRE穿越VPN还没说,后续会有。
GRE隧道主要实现以下几种服务类型。
1、多协议的本地网通过单一协议的骨干网传输
两端运行IP本地网,骨干网使用Novell IPX等协议本地网。在设备之间采用GRE隧道封装,本地网和骨干网互不影响的进行通信。
2、 扩大了步跳数受限协议(如RIP)的网络的工作范围
两台终端之间的步跳数超过15,它们将无法通信。而通过在网络中使用隧道(Tunnel)可以隐藏一部分步跳,从而扩大网络的工作范围。
3、将一些不能连续的子网连接起来,用于组建VPN
运行IP协议的两个子网Group 1和Group 2分别在不同的城市,通过使用隧道可以实现跨越广域网的VPN。
4、与IPSec结合使用
GRE都是明文,不安全。对于诸如路由协议、语音、视频等数据先进行GRE封装,然后再对封装后的报文进行IPSec的加密处理。
GRE是一种应用较为广泛的一种网络层协议PDU封装于任一种网络层协议PDU中的技术,经常被用来构造GRE隧道穿越各种三层网络,并得到了大多数电信设备厂商的支持。
GRE(通用路由协议封装)是由Cisco和Net-smiths等公司于1994年提交给IETF的,标号为RFC1701和RFC1702。目前有多数厂商的网络设备均支持GRE隧道协议。GRE 规定了如何用一种网络协议去封装另一种网络协议的方法。
GRE协议的主要用途有两个:企业内部协议封装和私有地址封装。
在国内,由于企业网几乎全部采用的是TCP/IP协议,因此在中国建立隧道时没有对企业内 部协议封装的市场需求。企业使用GRE的唯一理由应该是对内部地址的封装。当运营商向多个用户提供这种方式的VPN业务时会存在地址冲突的可能性。
——————————————————————————————————————————————————
ENSP中的UGS6000设备。
选择一个本地的虚拟网卡,配置IP为192.168.0.254。开启设备后登录防火墙,用户名admin,密码:Admin@123
在G0/0/0口配置命令:service-manage all permit
访问地址:https://192.168.0.1:8443
防火墙先开启大招。
OSPF配置就省略了。
FW1配置GRE:
FW2配置GRE:
添加静态路由
FW2:
tracert跟踪的话要关于tracert攻击防范功能
UGS5500:
ip ttl-expires enable
undo firewall defend icmp-unreachable enable
undo firewall defend tracert enable
UGS6000V:
icmp ttl-exceeded send
icmp host-unreachable send
undo firewall defend icmp-unreachable enable
undo firewall defend tracert enable