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/24R2中间的公网路由器只负责转发公网流量R3右边站点的边缘路由器连接私网B比如192.168.2.0/24R1和R3之间通过R2所在的公网建立GRE隧道。隧道建立后R1和R3之间就相当于有一条直连链路私网A和私网B可以通过这条链路互相通信。2.2 地址规划公网和私网必须泾渭分明地址规划是很多人容易翻车的地方。我的建议是公网用一组地址段私网用另一组隧道用第三组。三组地址不要有任何重叠否则路由表会乱成一锅粥。具体规划如下表设备接口地址说明R1GE0/0/010.0.12.1/24连接公网R2R1GE0/0/1192.168.1.1/24连接私网AR1Tunnel0/0/0172.16.1.1/24GRE隧道接口R2GE0/0/010.0.12.2/24连接R1R2GE0/0/110.0.23.2/24连接R3R3GE0/0/010.0.23.3/24连接公网R2R3GE0/0/1192.168.2.1/24连接私网BR3Tunnel0/0/0172.16.1.2/24GRE隧道接口这里有个细节隧道接口的地址我用了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/24R3的Tunnel0/0/0是172.16.1.2/24它们在同一网段这样隧道两端才能直接通信。2.3 公网路由怎么通在建立隧道之前R1和R3必须能通过公网互相ping通对方的公网接口地址。也就是说R1要能ping通10.0.23.3R3要能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.1destination是10.0.23.3。在R3上反过来source是10.0.23.3destination是10.0.12.1。两边必须对称否则隧道建立不起来。3.3 给隧道接口配地址隧道接口也需要一个IP地址这个地址用于隧道内部的通信ip address 172.16.1.1 255.255.255.0R1配172.16.1.1R3配172.16.1.2。配完之后R1应该能ping通172.16.1.2R3应该能ping通172.16.1.1。如果ping不通说明隧道没起来。3.4 验证隧道状态配置完成后用以下命令检查display interface Tunnel0/0/0关注几个关键字段Tunnel source应该是你配置的源地址Tunnel destination应该是你配置的目的地址Line protocol current state应该是UPInternet 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就可能出问题。解决办法有两个一是调整隧道接口的MTUinterface Tunnel0/0/0 mtu 1400二是调整TCP MSSinterface 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和UDPGRE就被拦了。检查公网接口的ACLdisplay 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多路径两条隧道都跑OSPFOSPF会自动选一条最优路径。如果主路径断了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上死磕太久。第六条文档和注释很重要。实验做完之后把配置保存下来关键步骤写上注释。过一段时间再回头看没有注释的配置跟天书一样。特别是隧道这种涉及多个设备、多个步骤的配置注释能帮你快速回忆起来。最后说一个我自己的习惯每次做完实验我都会把配置导出来存到一个专门的文件夹里按日期和实验名称命名。这样以后遇到类似的需求可以直接参考之前的配置不用从头再来。这个习惯帮我省了很多时间推荐你也试试。