目录
1. 简介
GRE(Generic Routing Encapsulation):即通用路由封装协议,一种隧道协议。
作用:
封装某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)报文,使这些报文能在另一个网络层协议中传输。
优点:
可通过IPv4连通多种异种网络(IPX、AppleTalk),有效利用现有网络,降低成本。
扩展网络跳数,支持灵活组网。 (如RIP最大跳数限制为16)
可封装组播数据,并和IPSec结合,保证语音、视频等组播业务安全。 (GRE over IPSec:先GRE封装,再IPSec加密)
可封装MPLS LDP,建立LDP LSP,实现MPLS骨干网互通。
可连接非连续子网,实现企业总部和分支间安全连接。
产生原因:
骨干网与非骨干网使用协议不同,导致非骨干网之间无法通过骨干网传输报文。通过GRE封装实现解决该问题。
2. GRE头格式
C 校验和位。表示是否GRE头包含Checksum字段。两端无须配置相同。
K 关键字位。 表示是否GRE头包含Key字段。两端配置必须相同。
Recursion 表示该GRE报文封装层数。若封装层数大于3,则丢弃该报文。防止报文无限封装。
Flags 预留字段。 必须为0。
Version 版本字段。 必须为0。
Protocol Type 乘客协议类型。 IPv4为0800,Ethernet为0x6558。
Checksum GRE头及负载的校验和字段。
Key 关键字字段。隧道接收端用于对报文验证。
GRE隧道传输IPX报文格式:
Ethernet头 + IP头 + GRE头 + IPX报文
GRE VPN分为:
GRE L2:即乘客协议是链路层协议。
GRE L3:即乘客协议是网络层协议。(默认GRE是GRE L3)
3. GRE L3
需要两端均配置GRE VPN,所以建议配置静态WAN IP。
配置页面
将WAN 配置为GRE VPN L3模式。
配置后,下挂PC访问192.168.5.152,在路由器上WAN口抓包如下:
外层IP对:
源IP:172.16.0.39
本地路由器WAN IP
目的IP:10.2.2.2
对端路由器WAN IP,即配置页面的Destination IP
内层IP对:
源IP:192.168.151.1
本地路由器生成的gre接口IP,即配置页面的Tunnel IP Address
ifconfig gre1显示(192.168.151.1)
目的IP:192.168.5.152
本地路由器下挂PC想要访问的IP
注意配置页面有个Tunnel mode的NAT support功能
如果enable:内层源IP使用gre1 IP,即192.168.151.1。
如果disable:内层源IP使用下挂PC真实IP。
配置完毕后,生成隧道接口gre1
ip link show gre1
22: gre1@NONE: mtu 1476 qdisc noqueue
link/gre 172.16.0.39 peer 10.2.2.2
10.2.2.2:即Destination IP,对端WAN IP
172.16.0.39:即本端WAN IP
还需gre1相关路由
# ip route show table VpnPdn
default dev gre1 scope link (下挂PC报文将经过gre1接口,进行GRE封装)
Linux实现
添加GRE L3 tunnel命令:
#grename=gre1
ip tunnel add $grename mode gre remote $remote_wan_ip local $local_wan_ipaddr ttl 2550
ip link set $grename up
ip addr add ${gre_tunnel_ip}/${gre_tunnel_ip_mask} dev $grename
ip route flush cache
主要还需添加对应路由表
若支持Tunnel NAT
iptables -t nat -A vpn_nat -o gre1 -j MASQUERADE
4. GRE L2
即Ethernet over GRE
可学到隧道对端设备的ARP
GRE L2除了封装以太网帧,还可以封装PPP,如PPTP数据报文。
配置界面
配置后,下挂设备访问1GRE L2抓包如下:
可知gre内部封装的是以太网帧。
最后生成接口gretap1
#ip link show gretap1
25: gretap1@NONE: mtu 1462 qdisc pfifo_fast master br0 state UNKNOWN qlen 1000
link/ether 36:28:36:ae:c4:bc brd ff:ff:ff:ff:ff:ff
为简化此处不介绍GRE L2 + VLAN功能。
组网拓扑
PC1-PC4在同一网段,都可通过图中router的DHCP分配IP。
CPE1和CPE2均有两个WAN IP,每个WAN网段不一样,每个WAN建立一个GRE隧道,每个隧道对应不同pvid。
最终:PC1和PC3 在同一VLAN ,二层互通。
PC2和PC4 在同一VLAN ,二层互通。
PC1 和PC4不通。PC2和PC3不通。
Linux实现
ip link add name [name] type [type]:
vlan
veth: 虚拟以太网接口
bridge: 网桥
vxlan:vxlan
ip6tnl: 虚拟隧道接口 IPv4 | IPv6 over IPv6
gre: 基于IPv4的GRE隧道
gretap: 基于 IPv4 的GRE L2隧道
ip6gre: 基于 IPv6 的GRE隧道
ip6gretap: 基于 IPv6 的GRE L2隧道
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.00000000 no eth0
wlan0
gretap1
创建一个单APN带VLAN的GRE L2 tunnel:
grename=gretap1
ip link add $grename type gretap remote $gre_remote_ip local $gre_local_ip ttl 255 nopmtudisc
ip link set dev $grename up
brctl addif br0 $grename
vconfig add $grename $gre_l2_untagged_vlan(pvid) //生成gretap1.0接口
ip link set dev $grename.$gre_l2_untagged_vlan up
brctl addif br0 $grename.$gre_l2_untagged_vlan
echo 1 > /proc/sys/net/bridge/bridge-nf-filter-vlan-tagged
ip link添加以太网接口,命令举例:
ip link add eth1 type ethernet