1. 先搞清楚GRE隧道到底在什么场景下值得用
很多人第一次接触GRE,是因为看到教程里说"可以打通两个私网"。但真到了自己动手的时候,往往卡在第一个问题上:我到底该不该用GRE?这个问题不搞清楚,后面配完了也是白配。
GRE,全称Generic Routing Encapsulation,通用路由封装。它的核心逻辑就一句话:把一种协议的数据包整个套进另一种协议的数据包里,像套娃一样。最常见的用法是把私网IP包塞进公网IP包里,让两个原本互相看不见的私网,通过公网这条"公路"建立一条虚拟的直连通道。
但这里有个关键点很多人忽略:GRE本身不加密。它只是封装,不负责安全。所以如果你的数据在公网上跑,GRE隧道里的内容是可以被看到的。这也是为什么实际项目里,GRE经常和IPSec搭配使用——GRE负责封装多协议,IPSec负责加密。不过在eNSP里做实验,我们先把GRE隧道本身跑通,加密的事情后面再说。
那什么场景下适合用GRE?我总结了几类:
- 两个站点之间需要跑动态路由协议:比如两边都是OSPF或者IS-IS,想通过公网让两个私网互相学到路由。GRE隧道可以把公网"伪装"成一条直连链路,路由协议跑在隧道上就跟跑在专线上一样。
- 需要传输组播或非IP协议:IPSec只能加密单播IP包,但GRE可以封装组播、广播甚至非IP协议。所以如果业务里有组播需求,GRE是绕不开的。
- 临时打通两个异构网络:比如一边是IPv4,一边是IPv6,想通过GRE做过渡,虽然这不是最优雅的方案,但确实能快速跑通。
反过来说,如果只是两个点之间传一点单播数据,而且对安全有要求,那直接用IPSec就够了,没必要套一层GRE。多一层封装就多一层开销,MTU问题、分片问题都会跟着来。
在eNSP里做GRE实验,最大的好处是你可以随便折腾,配错了大不了重启设备。但实验环境有个坑:eNSP的模拟设备性能有限,如果你在隧道上跑OSPF还开了一堆调试,可能会卡到怀疑人生。所以建议先跑通静态路由,再上动态路由。
提示:eNSP里的AR系列路由器对GRE支持是完整的,但如果你用的是某些精简版镜像,可能会发现tunnel接口起不来。遇到这种情况,先检查镜像版本,换一个完整的AR镜像通常就能解决。
2. 实验拓扑设计与地址规划的门道
动手之前,先把拓扑想清楚。我见过太多人一上来就开设备、连线条,结果配到一半发现地址冲突了,或者接口选错了,又得推倒重来。花十分钟画个拓扑图,能省你半小时的排错时间。
2.1 三台路由器的经典三角结构
GRE实验最经典的拓扑是三台路由器:两台边缘路由器各自连接一个私网,中间一台路由器模拟公网。这个结构的好处是清晰——你能明确区分"公网部分"和"私网部分",排错的时候也容易定位问题出在哪一段。
具体来说:
- R1:左边站点的边缘路由器,连接私网A(比如192.168.1.0/24)
- R2:中间的公网路由器,只负责转发公网流量
- R3:右边站点的边缘路由器,连接私网B(比如192.168.2.0/24)
R1和R3之间通过R2所在的公网建立GRE隧道。隧道建立后,R1和R3之间就相当于有一条直连链路,私网A和私网B可以通过这条链路互相通信。
2.2 地址规划:公网和私网必须泾渭分明
地址规划是很多人容易翻车的地方。我的建议是:公网用一组地址段,私网用另一组,隧道用第三组。三组地址不要有任何重叠,否则路由表会乱成一锅粥。
具体规划如下表:
| 设备 | 接口 | 地址 | 说明 |
|---|---|---|---|
| R1 | GE0/0/0 | 10.0.12.1/24 | 连接公网R2 |
| R1 | GE0/0/1 | 192.168.1.1/24 | 连接私网A |
| R1 | Tunnel0/0/0 | 172.16.1.1/24 | GRE隧道接口 |
| R2 | GE0/0/0 | 10.0.12.2/24 | 连接R1 |
| R2 | GE0/0/1 | 10.0.23.2/24 | 连接R3 |
| R3 | GE0/0/0 | 10.0.23.3/24 | 连接公网R2 |
| R3 | GE0/0/1 | 192.168.2.1/24 | 连接私网B |
| R3 | Tunnel0/0/0 | 172.16.1.2/24 | GRE隧道接口 |
这里有个细节:隧道接口的地址我用了172.16.1.0/24这个段。为什么不用192.168.x.x?因为私网A和私网B已经占了192.168.1.0和192.168.2.0,如果隧道也用192.168段,虽然不冲突,但看起来容易混淆。用172.16段做隧道地址,一眼就能区分出来这是"隧道专用"。
另外,隧道接口的地址必须是两边在同一个网段,因为隧道本质上是一条点对点链路。R1的Tunnel0/0/0是172.16.1.1/24,R3的Tunnel0/0/0是172.16.1.2/24,它们在同一网段,这样隧道两端才能直接通信。
2.3 公网路由怎么通
在建立隧道之前,R1和R3必须能通过公网互相ping通对方的公网接口地址。也就是说,R1要能ping通10.0.23.3,R3要能ping通10.0.12.1。这是隧道能建立的前提。
在eNSP里,最简单的做法是在R2上什么都不配,R1和R3各写一条默认路由指向R2。但更规范的做法是在三台路由器上跑OSPF,把公网段宣告进去。两种方式都可以,看你的实验目的。如果只是想快速跑通GRE,静态路由就够了;如果想顺便练一下OSPF,那就一起配。
我个人的习惯是:实验环境用静态路由,生产环境用动态路由。因为实验里拓扑简单,静态路由一目了然,排错也快。生产环境拓扑复杂,静态路由维护成本太高。
注意:eNSP里配置接口地址后,记得用
display ip interface brief确认接口状态是Up。如果接口是Down,先检查连线是否正确,再检查接口是否被shutdown了。
3. 隧道接口配置:GRE的核心操作
隧道接口是GRE的灵魂。没有隧道接口,GRE就是一句空话。但隧道接口的配置有几个参数容易让人迷惑,我一个个拆开讲。
3.1 创建Tunnel接口并指定模式
在华为设备上,创建隧道接口的命令是:
interface Tunnel0/0/0 tunnel-protocol gre第一行创建了一个编号为0/0/0的隧道接口。这个编号你可以自己定,但建议从0/0/0开始,方便记忆。第二行指定隧道协议为GRE。如果不指定,默认可能是其他协议,隧道就起不来。
这里有个坑:隧道接口的编号在不同设备上可能不一样。有些设备支持Tunnel0/0/0,有些只支持Tunnel0/0/1或者Tunnel1。在eNSP里,AR路由器通常支持Tunnel0/0/0到Tunnel0/0/7。如果你输入interface Tunnel0/0/0提示错误,试试换个编号。
3.2 指定隧道的源和目的
这是GRE配置里最关键的一步:
source 10.0.12.1 destination 10.0.23.3source是本地公网接口的地址,destination是对端公网接口的地址。这两个地址必须是公网上可达的地址,否则隧道起不来。
为什么源地址要用公网接口的地址,而不是隧道接口的地址?因为隧道接口的地址是"隧道内部"的地址,公网路由器不认识。隧道包在公网上传输的时候,外层IP头用的是公网地址,内层才是隧道地址。所以源和目的必须写公网地址。
在R1上,source是10.0.12.1,destination是10.0.23.3。在R3上反过来,source是10.0.23.3,destination是10.0.12.1。两边必须对称,否则隧道建立不起来。
3.3 给隧道接口配地址
隧道接口也需要一个IP地址,这个地址用于隧道内部的通信:
ip address 172.16.1.1 255.255.255.0R1配172.16.1.1,R3配172.16.1.2。配完之后,R1应该能ping通172.16.1.2,R3应该能ping通172.16.1.1。如果ping不通,说明隧道没起来。
3.4 验证隧道状态
配置完成后,用以下命令检查:
display interface Tunnel0/0/0关注几个关键字段:
- Tunnel source:应该是你配置的源地址
- Tunnel destination:应该是你配置的目的地址
- Line protocol current state:应该是UP
- Internet Address:应该是你配置的隧道地址
如果Line protocol是DOWN,常见原因有三个:一是源和目的地址写反了;二是公网路由不通,源地址ping不到目的地址;三是隧道协议没指定为GRE。
还有一个命令也很有用:
display tunnel-info all这个命令会列出所有隧道的信息,包括隧道ID、类型、目的地址等。如果隧道没起来,这里可能显示不出来。
实操心得:在eNSP里,有时候隧道接口配置完了,状态也显示UP,但就是ping不通对端隧道地址。这种情况多半是因为eNSP的模拟转发有问题。试试在隧道接口上
shutdown再undo shutdown,或者重启一下设备,通常就能解决。这不是配置问题,是模拟器的bug。
4. 路由怎么走:让私网流量进入隧道
隧道起来了,只是第一步。接下来要让私网A和私网B的流量知道"应该走隧道"。这就涉及到路由配置。
4.1 静态路由方案:简单直接
最直接的方式是在R1和R3上各写一条静态路由:
在R1上:
ip route-static 192.168.2.0 255.255.255.0 Tunnel0/0/0在R3上:
ip route-static 192.168.1.0 255.255.255.0 Tunnel0/0/0这条命令的意思是:要去192.168.2.0/24的包,从Tunnel0/0/0接口发出去。因为隧道接口是对端的"入口",包从隧道接口出去,就会被GRE封装,然后通过公网送到对端。
静态路由的优点是简单、可控。缺点是如果私网段很多,每条都要写,维护起来麻烦。而且如果隧道断了,静态路由不会自动撤销,流量会黑洞。
4.2 动态路由方案:OSPF over GRE
如果私网段比较多,或者你想练一下动态路由,可以在隧道上跑OSPF。配置思路是:
在R1上:
ospf 1 area 0 network 192.168.1.0 0.0.0.255 network 172.16.1.0 0.0.0.255在R3上:
ospf 1 area 0 network 192.168.2.0 0.0.0.255 network 172.16.1.0 0.0.0.255注意:隧道网段172.16.1.0/24也要宣告进OSPF,否则OSPF邻居建立不起来。因为OSPF邻居是通过隧道接口的地址建立的,如果隧道网段不在OSPF里,邻居就起不来。
OSPF over GRE的好处是:私网路由可以动态学习,隧道断了OSPF邻居也会断,路由自动撤销,不会黑洞。缺点是配置稍微复杂一点,而且eNSP里跑OSPF over GRE可能会比较卡。
4.3 静态路由和动态路由怎么选
我个人的建议是:
- 实验环境:先用静态路由跑通,确认隧道没问题,再换成OSPF练手。
- 生产环境:如果私网段少(比如只有两三个),静态路由就够了;如果私网段多,或者有冗余需求,用OSPF。
- 混合方案:也可以隧道上跑静态路由,私网内部跑OSPF,然后做路由重分发。这种方案灵活但复杂,新手慎用。
不管用哪种方案,配完之后一定要验证。在R1上ping 192.168.2.1,应该能通。在R3上ping 192.168.1.1,也应该能通。如果ping不通,先检查隧道状态,再检查路由表。
display ip routing-table看看192.168.2.0/24这条路由有没有出现在R1的路由表里,下一跳是不是Tunnel0/0/0。如果没有,说明路由没配好。
5. 那些让人抓狂的典型故障与排查链路
GRE配置本身不复杂,但排错的时候往往让人抓狂,因为问题可能出在任何一个环节。我把自己踩过的坑和排查思路整理出来,你遇到问题的时候可以按这个顺序查。
5.1 隧道起不来:从底层往上查
隧道起不来是最常见的问题。排查顺序应该是:物理层→网络层→隧道层。
先看物理接口:
display ip interface brief确认GE0/0/0和GE0/0/1都是Up状态。如果物理接口Down,先解决物理层问题。
再看公网连通性:
ping 10.0.23.3在R1上ping R3的公网地址。如果不通,说明公网路由有问题。检查R2上的路由配置,确认R2知道怎么转发到10.0.12.0和10.0.23.0这两个网段。
公网通了之后,再看隧道接口:
display interface Tunnel0/0/0如果Line protocol是DOWN,检查source和destination是否写对。特别注意:source必须是本地公网接口的地址,destination必须是对端公网接口的地址。写反了隧道起不来。
还有一个容易忽略的点:如果公网接口的地址是动态获取的(比如DHCP),隧道source就不能写固定地址。这种情况下需要用source interface GE0/0/0的方式指定源接口,而不是源地址。不过在eNSP实验里,我们通常用静态地址,这个问题不常见。
5.2 隧道UP但ping不通:MTU和分片在捣鬼
隧道状态显示UP,但ping对端隧道地址不通,或者ping小包通、大包不通。这种情况多半是MTU问题。
GRE封装会增加额外的头部:外层IP头20字节,GRE头4字节,总共24字节。所以隧道接口的MTU应该比物理接口的MTU小24字节。如果物理接口MTU是1500,隧道接口的MTU应该是1476。
在华为设备上,隧道接口默认的MTU是1476,通常不需要改。但如果你的物理接口MTU不是1500,或者中间网络有更小的MTU,就可能出问题。
解决办法有两个:一是调整隧道接口的MTU:
interface Tunnel0/0/0 mtu 1400二是调整TCP MSS:
interface Tunnel0/0/0 tcp adjust-mss 1360MSS是TCP最大段大小,调整MSS可以让TCP主动减小包的大小,避免分片。1360这个值是经验值,通常能适配大多数网络。
注意:MTU问题在eNSP里不太容易复现,因为eNSP的模拟转发不涉及真实的分片。但在真实设备上,MTU问题是GRE最常见的坑之一。所以实验里配好了,上生产环境之前一定要确认MTU。
5.3 私网互通但时通时断:路由震荡
如果私网之间能ping通,但时通时断,或者延迟忽大忽小,可能是路由震荡。常见原因有两个:
一是OSPF邻居不稳定。检查OSPF邻居状态:
display ospf peer brief如果邻居状态在Full和Down之间来回跳,说明链路不稳定。可能是隧道接口的hello间隔和dead间隔不匹配,或者隧道本身有问题。
二是静态路由和动态路由冲突。如果同时配了静态路由和OSPF,可能会产生次优路径或者路由环路。检查路由表:
display ip routing-table 192.168.2.0看看这条路由的下一跳和优先级。如果有多条路由,确认哪条是活跃的。
5.4 一个隐蔽的坑:ACL把GRE流量拦了
如果公网接口上配了ACL,可能会把GRE流量拦掉。GRE的协议号是47,不是TCP也不是UDP。很多ACL默认只放行TCP和UDP,GRE就被拦了。
检查公网接口的ACL:
display acl all如果发现有ACL应用在公网接口的inbound方向,确认它是否放行了协议号47的流量。如果没有,需要加一条规则:
acl number 3000 rule 5 permit gre然后在接口上应用这个ACL。这个坑很隐蔽,因为ACL看起来跟GRE没关系,但实际上能把隧道彻底堵死。
6. 进阶玩法:GRE over IPSec和隧道冗余
隧道跑通之后,如果你还想折腾,可以试试下面两个进阶方向。这两个在实际项目里都很常见,但在eNSP里做实验需要一点耐心。
6.1 GRE over IPSec:给隧道加一层保险
前面说过,GRE本身不加密。如果数据敏感,需要在GRE外面再套一层IPSec。配置思路是:
- 先配好GRE隧道,确认私网能互通。
- 在R1和R3之间配置IPSec,保护GRE流量。
- IPSec的感兴趣流(ACL)要匹配GRE流量,也就是源和目的都是公网地址,协议号47。
IPSec的配置比较复杂,涉及IKE、IPSec策略、ACL等多个部分。在eNSP里做这个实验,建议先单独把IPSec跑通,再和GRE结合。否则出了问题很难定位是GRE的问题还是IPSec的问题。
GRE over IPSec的好处是:既保留了GRE支持多协议和组播的能力,又加上了IPSec的加密。缺点是配置复杂,而且双重封装会增加开销,MTU问题更突出。
6.2 隧道冗余:两条隧道做主备
如果两个站点之间需要高可用,可以建两条隧道,一条主一条备。实现方式有几种:
- 静态路由浮动:主隧道用一条静态路由,备隧道用另一条静态路由,但优先级更低。主隧道断了,备隧道自动接管。
- OSPF多路径:两条隧道都跑OSPF,OSPF会自动选一条最优路径。如果主路径断了,OSPF会切换到备路径。
- GRE Keepalive:华为设备支持在隧道接口上配置keepalive,定期发送探测包。如果连续几次收不到回应,就把隧道接口置为Down,触发路由切换。
配置keepalive的命令是:
interface Tunnel0/0/0 keepalive period 5 retry-times 3意思是每5秒发一次探测包,连续3次收不到回应就认为隧道断了。这个功能在eNSP里支持得不太好,有时候会误报。建议在真实设备上用。
6.3 隧道冗余的注意事项
做隧道冗余的时候,有几个点要注意:
一是路由收敛速度。如果主隧道断了,备隧道多久能接管?这取决于路由协议的收敛速度。OSPF通常几秒到几十秒,静态路由浮动取决于keepalive的检测时间。如果业务对中断时间敏感,需要调优。
二是非对称路由。如果主隧道和备隧道的路径不一致,可能会出现去包走主隧道、回包走备隧道的情况。这种非对称路由会导致防火墙或者状态检测设备丢包。解决办法是确保来回路径一致,或者用策略路由强制指定路径。
三是隧道震荡。如果keepalive参数设置得太激进,隧道可能会频繁震荡。比如period设成1秒,网络稍微抖动一下就认为隧道断了,然后切换,切换完了又恢复,来回折腾。建议period不要小于3秒,retry-times不要小于3次。
7. 实验做完之后,这些经验值得记下来
GRE这个技术本身不复杂,但细节很多。我在eNSP里反复做了很多次实验,总结了几条经验,都是踩过坑之后才明白的。
第一条:先通公网,再建隧道。很多人一上来就配隧道,结果隧道起不来,又回头查公网。正确的顺序是:先确保公网互通,再配隧道,再配路由。每一步都验证,不要跳步。
第二条:隧道地址和公网地址不要混用。隧道地址是隧道内部的,公网地址是隧道外部的。配路由的时候,指向隧道的路由下一跳是隧道接口,指向公网的路由下一跳是公网接口。搞混了流量就乱了。
第三条:MTU问题一定要提前考虑。实验里可能不暴露,但生产环境一定会遇到。隧道接口的MTU和TCP MSS都要调,不要等到出问题了再查。
第四条:ACL是隐形杀手。如果公网接口上有ACL,一定要确认放行了GRE协议号47。这个坑很隐蔽,排查起来很费时间。
第五条:eNSP的bug要有心理准备。eNSP毕竟是模拟器,不是真实设备。隧道起不来、ping不通、状态异常,有时候不是配置问题,是模拟器的问题。遇到这种情况,重启设备、重新配一遍,通常能解决。不要在一个bug上死磕太久。
第六条:文档和注释很重要。实验做完之后,把配置保存下来,关键步骤写上注释。过一段时间再回头看,没有注释的配置跟天书一样。特别是隧道这种涉及多个设备、多个步骤的配置,注释能帮你快速回忆起来。
最后说一个我自己的习惯:每次做完实验,我都会把配置导出来,存到一个专门的文件夹里,按日期和实验名称命名。这样以后遇到类似的需求,可以直接参考之前的配置,不用从头再来。这个习惯帮我省了很多时间,推荐你也试试。