GRE
GRE 是一种隧道协议,由 Cisco 开发,后来成为标准(RFC 2784,以及增强版 RFC 2890 增加了 Key 和 Sequence Number)。它的核心作用是:将一种网络协议的数据报封装在另一种网络协议中传输。最常见的是IP over IP,即把 IP 报文封装在另一个 IP 报文中。
通俗理解:就像把一个包裹(原始IP包)装进另一个包裹(新IP头),通过中间网络运送,到达目的地后再拆开。
为什么需要 GRE?
普通 IP 路由只能基于目的 IP 转发,无法做到:
传递多播或广播报文(IPsec 只能传递单播)
封装非 IP 协议(如 IPX、AppleTalk)
在路由协议(如 OSPF、EIGRP)穿越 NAT 或非广播网络时保持邻居关系
而 GRE 隧道可以:
把任意协议的数据包(包括组播、广播)封装在单播 IP 中,穿越 Internet。
为路由协议(如 OSPF)提供逻辑直连链路,使两个远距离路由器成为“邻居”。
GRE是可以支持组播的,所以总部和分部可以运行OSPF,这就是GRE非常大的优点。
GRE的配置
现在这个Tunne;10/0/0这个接口是Down的(需要在这个隧道上配置地址)
这个接口要去处理IP报文的话,协议上是要UP的
将私网流量导入到隧道--路由的方式(静态、动态)
AR3上配置
GRE简单配置案例
场景假设
两个办公室,分别使用私有 IP 网段:
192.168.1.0/24(左边)和192.168.2.0/24(右边)。它们通过公网 Internet连接,公网 IP:左路由器 R1 为
1.1.1.1,右路由器 R2 为2.2.2.2。需求:让两个私网互通,并且希望在隧道上运行动态路由协议(如 OSPF),以便自动学习对方的路由。
方案:在 R1 和 R2 之间建立GRE 隧道(GRE over IPv4),然后把两个私网的路由指向隧道接口。
配置步骤
1. 在 R1 上创建隧道接口
interface Tunnel0 ip address 10.0.0.1 255.255.255.252 # 隧道两端的虚接口IP(同子网) tunnel source 1.1.1.1 # 本端公网IP tunnel destination 2.2.2.2 # 对端公网IP tunnel protocol gre # 指定为GRE隧道(默认可能就是gre)2. 在 R2 上创建隧道接口
interface Tunnel0 ip address 10.0.0.2 255.255.255.252 tunnel source 2.2.2.2 tunnel destination 1.1.1.1 tunnel protocol gre3. 添加路由(静态或动态)
静态路由:将对方私网指向隧道接口。
# R1上 ip route 192.168.2.0 255.255.255.0 Tunnel0 # R2上 ip route 192.168.1.0 255.255.255.0 Tunnel0动态路由(OSPF):在 Tunnel0 上启用 OSPF,让隧道两端形成邻居,自动交换私网路由。
报文封装过程(核心知识点)
当 R1 内网192.168.1.10访问 R2 内网192.168.2.20时:
1. 原始 IP 包(假设 TCP 80):
| IP头 (s=192.168.1.10, d=192.168.2.20) | TCP数据 |2.R1 查路由:发现去往192.168.2.0/24的出口是 Tunnel0,于是把该包交给隧道接口。
3. 隧道封装(GRE):
先加上GRE 头(至少 4 字节,包含协议类型 0x0800 表示内层是 IPv4)。
再加上新 IP 头(源 IP = 1.1.1.1,目的 IP = 2.2.2.2,协议号 =47表示 GRE)。
新 IP 头 + GRE 头 + 原始 IP 包 = 完整的隧道报文。
| 新IP头 (s=1.1.1.1,d=2.2.2.2, proto=47) | GRE头 | 原始IP包 (s=192.168.1.10,d=192.168.2.20) |4. 公网转发:该报文通过公网路由到达 R2(公网路由器只看外层 IP 头)。
5. R2 解封装:
收到协议号=47 的报文,交给 GRE 处理模块。
剥掉新 IP 头和 GRE 头,恢复原始 IP 包。
查路由:目的
192.168.2.20是本地直连,转发给对应内网主机。
关键点:GRE 本身不加密、不认证,所有数据在公网上是明文的。
验证命令
show interface Tunnel0 # 查看隧道接口状态,是否 up/up show ip route | include Tunnel0 # 查看通过隧道路由 show ip ospf neighbor # 若跑OSPF,查看邻居是否建立 ping 10.0.0.2 source 10.0.0.1 # 测试隧道直连IP