目录
文章目录
GRE 通用路由封装协议
GRE(Generic Routing Encapsulation,通用路由封装)隧道协议,RFC 1701。
- GRE 的协议栈结构:基于 IP 网络层协议来封装 L2/L3 报文。
- 传输协议(Transport Protocol / Delivery Protocol):负责对封装后的报文进行转发的协议称为传输协议。
- 封装协议(Encapsulation Protocol):上述的 GRE 协议称为封装协议,也称为运载协议(Carrier Protocol)。
- 乘客协议(Passenger Protocol):封装前的报文协议称为乘客协议。
- 净荷(Payload Packet):系统收到的需要封装和路由的数据报称为净荷。
- GRE 解决了异种网络的传输问题,实现跨公网的网络互联。
-
GRE 扩展了受跳数限制的路由协议的工作范围,支持企业灵活设计网络拓扑。
-
GRE 可以封装组播数据,经常与 IPSec 组合使用。IPSec VPN 用于在两个端点之间提供安全的 IP 通信,但 IPSec 只能加密并传播单播数据流量,例如:ICMP;而无法加密和传输组播数据,例如:语音、视频、动态路由协议。GRE 补充了这一缺陷:首先通过 GRE 对报文进行封装,然后再由 IPSec 对封装后的报文进行加密和传输,从而保证了组播业务的安全。
GRE 报文格式
|------------------------------------------------------------------------------|
| bit0-3 | 4-12 | 13-15 | 16 - 31 |
|-------------|----------------|-------|---------------------------------------|
| C | | K | S | Reserved0 | Ver | Protocol Type |
|--------------------------------------|---------------------------------------|
| Checksum(optional) | Reserved1(optional) |
|------------------------------------------------------------------------------|
| Key(optional) |
|------------------------------------------------------------------------------|
| Sequence Number (optional) |
|------------------------------------------------------------------------------|
GRE 的实现原理
Linux 配置指令
加载 GRE 内核模块
Linux 上使用 GRE 需要加载特定的内核模块:
# 开启 IPv4 路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 查看 GRE 内核模块信息
modinfo ip_gre
# 查看 GRE 内核模块是否安装
lsmod | grep ip_gre
# 加载 GRE 内核模块
modprobe ip_gre
modprobe --first-time ip_gre
East side
- 创建 GRE Tunnel 虚拟接口设备,并指定 GRE Endpoints 的 Source 和 Destination IP 地址。
ip tunnel add GRE-1 mode gre local 172.16.50.75 remote 172.16.50.8 key 100 ttl 255 dev ens3
- 启用 GRE Tunnel 虚拟接口设备。
ip link set dev GRE-1 up
- 配置 GRE Tunnel 虚拟接口设备的本地路由 IP 地址(注:仅用于本地路由,不会出现在隧道路径中),作为 Tunnel 的标识,便于配置本地隧道路由。
ip addr add 10.10.10.1 peer 10.10.10.2 dev GRE-1
- 配置本地隧道路由,指向隧道设备,以此来引导流量进入隧道。
ip route add 192.168.2.0/24 via 10.10.10.1 dev GRE-1
West side
ip tunnel add GRE-1 mode gre remote 172.16.50.75 local 172.16.50.8 key 100
ip link set GRE-1 up
ip addr add 10.10.10.2 peer 10.10.10.1 dev GRE-1
ip route add 192.168.1.0/24 via 10.10.10.2 dev GRE-1
GRE 的 Keepalive 检测
Keepalive 检测功能用于检测隧道对端是否可达。
GRE 支持多租户
一个 GRE Enpoints 可能存在多个隧道,因而需要有一个标志位来唯一标识当前网络包属于哪个隧道,这就是 GRE Header 中的 key,简称 GRE Key。
The Key field is used to create separate sub-tunnels within a GRE Tunnel.
例如:
tunnel-1
host-1
ip tunnel add GRE-1 mode gre remote 172.16.50.8 local 172.16.50.75 key 100
ip link set GRE-1 up
ip addr add 10.10.10.1 peer 10.10.10.2 dev GRE-1
ip route add 192.168.2.0/24 via 10.10.10.1 dev GRE-1
host-2
ip tunnel add GRE-1 mode gre remote 172.16.50.75 local 172.16.50.8 key 100
ip link set GRE-1 up
ip addr add 10.10.10.2 peer 10.10.10.1 dev GRE-1
ip route add 192.168.1.0/24 via 10.10.10.2 dev GRE-1
tunnel-2
host-1
ip tunnel add GRE-2 mode gre remote 172.16.50.8 local 172.16.50.75 key 200
ip link set GRE-2 up
ip addr add 10.10.100.1 peer 10.10.100.2 dev GRE-2
ip route add 192.168.20.0/24 via 10.10.100.1 dev GRE-2
host-2
ip tunnel add GRE-2 mode gre remote 172.16.50.75 local 172.16.50.8 key 200
ip link set GRE-2 up
ip addr add 10.10.100.2 peer 10.10.100.1 dev GRE-2
ip route add 192.168.10.0/24 via 10.10.100.2 dev GRE-2