GRE 出现的背景:
随着网络(公司)规模的增大,越来越多的公司需要在跨区域之间建设自己的分公司。但随之也就出现了这样的问题,考虑这样一个场景。公司 A 在北京和上海间开设了两家公司,由于业务的需要,需要实现两家公司间的数据通信。公司考虑到未来的发展,在北京和上海启动了 IPV6 作为网络层的传输协议。但由于使用的 ISP (供应商,比如联通)在公网提供的是 IPV4 的网络层协议,这时想要通信该怎么办呢?
GRE 就是为了解决这个问题而出现的,专业些说解决的就是异种网络的传输问题。
GRE 的原理
GRE 采用了 Tunnel 技术,进行异种网络的传输。
乘客协议(Passenger):想要实现通信的协议,如例子中的 IPV6 协议
封装协议:将乘客协议封装起来的协议,按照一定的规则,进行封装和解封装。
传输协议:ISP 认识的协议,如 IPV4 协议。
将想要通信的协议封装成 GRE 协议,然后传输 GRE 协议,在对方收到 GRE 协议后,解封装,拿出想要通信的协议,然后解析。
- checksum:校验和,用于检测整个 GRE 数据包的准确性,包括图中黄色的部分。
- Protocol Type:使用的协议,比如 Ox0800 表示 IP 协议,公网传输的协议。
- Key:用于隧道的认证
GRE 的配置
这里假设 R2 为 ISP 提供的公网访问接口,R1 和 R3 使用的是公司内网地址。正常来说,内网地址是无法通过公网进行传递的。公网地址接受后会将其丢掉。
如果想实现通信,就可以使用 GRE 协议,目的仅仅是想让 ISP 将 R1 的数据包发送到 R3,就像在 R1 和 R3 中间建立起了一条直连的通道。
# STEP1: R1 config interface
# config default route for R2 because we need R1 to R3 to be reachable
Router(config)# ip route 0.0.0.0 0.0.0.0 12.1.1.2
# open tunnel interface
Router(config)#in tunnel 0
Router(config-if)#tunnel mode gre ip
Router(config-if)#ip 13.1.1.1 255.255.255.0
Router(config-if)#tunnel source 12.1.1.1
Router(config-if)#tunnel destination 23.1.1.2
Router#show running-config interface tunnel 0
# transfer network traffic to Tunnel0 Interface
Router(config)#ip route 192.168.2.0 255.255.255.0 Tunnel 0
# STEP2: R2 config interface
# STEP3: R3 config interface
# config default route for R2 because we need R3 to R1 to be reachable
Router(config)# ip route 0.0.0.0 0.0.0.0 23.1.1.1
# open tunnel interface
Router(config)#in tunnel 0
Router(config-if)#tunnel mode gre ip
Router(config-if)#ip 13.1.1.2 255.255.255.0
Router(config-if)#tunnel source 23.1.1.2
Router(config-if)#tunnel destination 12.1.1.1
Router#show running-config interface tunnel 0
# transfer network traffic to Tunnel0 Interface
Router(config)#ip route 192.168.1.0 255.255.255.0 Tunnel 0
这里从 Router1 的接口抓包:
Tunnel 接口配置 IP 的作用:
简化流量引入的配置过程。上面的配置通过静态路由将去往 192.168.2.0 的流量引入到 Tunnel 口中。
但加入存在多个网段,这样配置较为繁琐。
所以可以将 R1 和 R3 的接口运行动态路由协议,进而不用在去手动管理。