
接到不少朋友问GRE隧道实验怎么做尤其是刚接触华为eNSP模拟器的人一上来就被一堆命令和概念绕晕。我的建议是先别急着敲命令把GRE到底解决什么问题、隧道怎么建立、数据怎么封装搞明白再动手配就顺了。这篇文章就按我平时搭实验的习惯来写从拓扑设计、配置步骤到排错实战全走一遍看完你也能在eNSP上完整跑通一个GRE隧道实验。1. 实验背景与模拟环境搭建1.1 什么场景下需要GRE隧道先说个最常见的需求公司A分部在北京公司B分部在上海两边内网都是私网地址。正常情况下私网地址不能直接在公网上路由所以两地要通信方案有很多种GREGeneric Routing Encapsulation通用路由封装就是其中一种实现方式。GRE的核心思路是在公网IP报文里再封装一层完整的IP报文让原本无法在公网路由的私网报文能以“包裹”的形式穿越公网。打个比方就像你要寄一封内文用特殊信封写的信普通邮局不认识这种信封但你把信装进一个标准快递盒快递盒写上收件人和发件人地址快递公司就能把它送到目的地。GRE做的就是这层“标准快递盒”的工作。用eNSP模拟这个场景非常合适它自带华为AR系列路由器模型支持完整的GRE协议栈可以自由搭拓扑、抓包验证。相比用实体设备eNSP不用管物理连线改配置也很快特别适合学习和验证。1.2 eNSP安装与设备选型注意事项eNSP本身是华为官方免费的模拟器安装包不大但有几个坑提前说安装路径不要带中文或空格否则部分版本会报AR设备启动失败。首次启动会要求安装VirtualBox依赖组件如果已经装了新版VirtualBox可能和eNSP内置版本冲突建议按提示卸载重装eNSP自带的版本。如果AR设备启动后一直显示红色“启动失败”优先检查VirtualBox的兼容性和电脑的虚拟化支持BIOS里开启VT-x。实验设备选型上我用的是AR2220它支持GRE隧道、静态路由、OSPF等常规协议完全够用。接线上建议用串口连接就是拓扑图上两个设备之间用线连起来后双击连线选择接口这里统一用GigabitEthernet接口。1.3 实验拓扑与地址规划这次实验我设计了一个最典型的三节点拓扑架构如下设备接口地址用途R1G0/0/0192.168.12.1/24模拟站点A公网出口R1G0/0/1192.168.1.1/24模拟站点A内网网关PCI以太网口192.168.1.10/24站点A终端R2G0/0/0192.168.12.2/24模拟公网中间设备R2G0/0/1192.168.23.2/24模拟公网中间设备R3G0/0/0192.168.23.3/24模拟站点B公网出口R3G0/0/1192.168.3.1/24模拟站点B内网网关PC2以太网口192.168.3.10/24站点B终端R1和R3分别代表两地分部的出口路由器R2模拟运营商中间设备它只负责转发公网报文不需要知道私网路由。2. GRE封装原理与隧道设计逻辑2.1 报文封装结构拆解理解GRE核心是理解它的报文格式。一个标准的GRE封装后的报文在三层上是这样的结构外层IP头GRE头内层原始IP头原始载荷TCP/UDP数据外层IP头中源地址是隧道源地址tunnel source目的地址是隧道目的地址tunnel destination这两个地址必须是公网可达的。GRE头里最重要的字段是协议类型它标识了内层承载的报文类型比如0x0800表示承载IPv4报文。内层就是原始的私网IP报文这部分在隧道另一侧会被原样解封装出来。在eNSP里想直观验证这个结构可以后续抓包看但我建议在做实验之前先在脑中建立这个模型隧道不是物理链路是一个逻辑点对点通道数据进入隧道口后被打包出了隧道口再拆包。2.2 为什么需要tunnel source和tunnel destination很多新手配GRE时总问为什么我已经配了物理接口IP还非要再指定source和destination原因在于路由器需要知道进入隧道接口的报文应该从哪里发出去、发到哪里去。tunnel source告诉路由器用哪个物理接口的地址作为外层IP头源地址tunnel destination告诉路由器外层IP头目的地址是谁。如果source或destination配置错误隧道会建立不了或者数据封装后发错了方向。这个设计可以类比快递。你寄快递必须写清楚“从哪寄出”source和“寄给谁”destination快递单上这两个信息是必填项。GRE隧道也一样没有这两项包裹就没法投递。2.3 隧道接口IP地址与路由的关系隧道接口本身还要配一个IP地址比如我在实验中把隧道接口地址规划为10.0.12.1/30和10.0.12.2/30。这个地址是隧道两端的“逻辑直连地址”用于路由和连通性测试。它和物理接口地址的区别在于物理接口地址是真实链路上的隧道接口地址是虚拟链路两端的。当私网流量到达R1后R1查路由表发现目的网段是出接口为Tunnel0/0/0就会把报文交给隧道口处理隧道口封装后转发。理解这条转发路径是实验的关键内网到外网的路由下一跳不指向物理邻居而是指向隧道接口对端地址。这也是很多人在静态路由配置上翻车的重灾区。3. 实操配置步骤详解3.1 基础接口配置先把三台路由器的物理接口全都配好确保公网链路段l连通。以R1为例进入系统视图配置接口R1system-view [R1]interface GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.12.1 255.255.255.0 [R1-GigabitEthernet0/0/0]quit [R1]interface GigabitEthernet 0/0/1 [R1-GigabitEthernet0/0/1]ip address 192.168.1.1 255.255.255.0R2的配置类似但不需要配内网接口只配两个公网接口[R2]interface GigabitEthernet 0/0/0 [R2-GigabitEthernet0/0/0]ip address 192.168.12.2 255.255.255.0 [R2-GigabitEthernet0/0/0]quit [R2]interface GigabitEthernet 0/0/1 [R2-GigabitEthernet0/0/1]ip address 192.168.23.2 255.255.255.0R3的配置对应R1只是地址不同[R3]interface GigabitEthernet 0/0/0 [R3-GigabitEthernet0/0/0]ip address 192.168.23.3 255.255.255.0 [R3-GigabitEthernet0/0/0]quit [R3]interface GigabitEthernet 0/0/1 [R3-GigabitEthernet0/0/1]ip address 192.168.3.1 255.255.255.0此时R1和R3之间要能互相ping通物理接口地址。如果R2不作为公网路由网关转发那R1和R3各自加一条默认路由或指向R2的静态路由。为了方便我这里直接在R1和R3上分别加默认路由指向R2[R1]ip route-static 0.0.0.0 0.0.0.0 192.168.12.2 [R3]ip route-static 0.0.0.0 0.0.0.0 192.168.23.2R2上需要放行转发因为R2本身是L3转发所以默认就能转。先用ping测沟轻松如果中间转发不通检查R2的接口地址和路由表。3.2 配置GRE隧道接口这是实验的核心环节。在R1上创建隧道接口Tunnel0/0/0[R1]interface Tunnel 0/0/0 [R1-Tunnel0/0/0]tunnel-protocol gre [R1-Tunnel0/0/0]ip address 10.0.12.1 255.255.255.252 [R1-Tunnel0/0/0]tunnel source 192.168.12.1 [R1-Tunnel0/0/0]tunnel destination 192.168.23.3逐条命令解释一下tunnel-protocol gre指定隧道封装协议为GRE。这个命令可以把隧道接口配置为其他封装类型比如GRE over IPv6、IPsec等千万别漏配否则默认可能是其他协议类型。ip address配置隧道接口IP两端要在同一个子网实验中用的是/30子网。tunnel source指定隧道源地址写本地物理接口地址。tunnel destination指定隧道目的地址写对端物理接口地址。然后在R3上做对称配置[R3]interface Tunnel 0/0/0 [R3-Tunnel0/0/0]tunnel-protocol gre [R3-Tunnel0/0/0]ip address 10.0.12.2 255.255.255.252 [R3-Tunnel0/0/0]tunnel source 192.168.23.3 [R3-Tunnel0/0/0]tunnel destination 192.168.12.1两端配置完成后在R1上执行ping -a 10.0.12.1 10.0.12.2如果能通说明GRE隧道已经建立成功。这里-a指定发起ping的源地址为隧道接口地址确保流量从隧道口出而不是物理接口出。3.3 配置内网路由打通私网网段物理接口和隧道口都已经配好了但此时PCI192.168.1.10还是ping不通PC2192.168.3.10因为R1和R3不知道怎么把内网网段路由到隧道上。在R1上添加通往站点B内网的静态路由[R1]ip route-static 192.168.3.0 255.255.255.0 10.0.12.2这条命令的含义是凡是发往192.168.3.0/24的流量下一跳是10.0.12.2即隧道对端地址。下一跳写隧道接口地址而不是写对端物理接口地址这点非常关键也是新手高发误区。同样在R3上添加通往站点A内网的静态路由[R3]ip route-static 192.168.1.0 255.255.255.0 10.0.12.1此时再试一下PCI ping PC2通了就说明GRE隧道已经承载了私网流量。3.4 验证命令与结果分析实验做完不能只看“通了”还要会用命令验证隧道质量和转发路径。在R1上执行display tunnel-info all这个命令会显示所有隧道接口的基本信息包括隧道协议类型、源地址、目的地址、隧道接口状态。如果看到Protocol状态是up说明GRE隧道是正常的。再执行display ip routing-table查看路由表中192.168.3.0/24的下一跳和出接口预期是下一跳10.0.12.2出接口Tunnel0/0/0。还可以用tracert验证数据走的是隧道R1tracert 192.168.3.10如果配置正确你会看到第一跳直接跳到10.0.12.2而不是192.168.12.2说明数据没有走物理直连R2而是走隧道口。4. 常见故障排查与排除实录4.1 隧道接口协议起不来有一次我搭实验隧道接口配置完物理口状态是up但隧道口协议一直down。检查命令是display interface Tunnel 0/0/0发现Protocol为down。排查过程ping tunnel destination对应的物理地址发现源地址不对R1 ping不通R3的公网地址问题出在中间路由。检查R2的路由表确认它知道去192.168.23.3的路由。检查R1的默认路由是否指向了R2。当时是因为R1默认路由没配报文根本出不去隧道协议自然起不来。经验教训GRE隧道协议起不来90%的原因是tunnel source和tunnel destination之间物理链路不通先把两端物理接口地址互ping通再去查隧道配置。还有一个常见坑tunnel source写成了隧道接口地址比如隧道源写10.0.12.1这是错的tunnel source必须写物理接口地址。4.2 隧道通了但私网ping不通隧道接口状态up甚至ping -a 10.0.12.1 10.0.12.2也通但PCI ping PC2不通。这种场景我统计过基本就是两类问题静态路由下一跳被误写成对端物理接口地址而不是隧道接口地址。如果把ip route-static 192.168.3.0 255.255.255.0 192.168.23.3写进去R1查路由表会认为去192.168.3.0/24的报文应该发到192.168.23.3这个物理邻居导致和隧道逻辑冲突报文行为异常。回程路由缺失。R3上如果不写通往192.168.1.0/24的静态路由PC2 ping PCI时响应报文到了R3查不到回程路由直接丢弃。这也是为什么GRE实验必须两端路由对称配置。4.3 小包能通大包不通数据包超过一定大小就断典型症状是ping小字节数正常但ping大字节数失败比如ping -s 1500 192.168.3.10不通。根因是MTU最大传输单元问题。GRE隧道会增加一个外层IP头20字节和GRE头4字节一共24字节左右的额外开销。如果物理口MTU是1500隧道内层IP报文超过1476字节封装后报文就会超过物理口MTU导致分片或被丢弃。解决办法是调整隧道接口的MTU[R1-Tunnel0/0/0]mtu 1400 [R3-Tunnel0/0/0]mtu 1400两端必须一致否则会出现一端发大包另一端收不到的情况。改成1400后再测试大包就稳定了。在真实网络中MTU调优还需要配合TCP MSS等其他手段实验里先把概念搞清楚即可。4.4 keepalive配置的坑华为设备的隧道接口默认不发送keepalive报文。但如果为了检测对端存活配置了keepalive比如[R1-Tunnel0/0/0]keepalive 10 3要注意keepalive报文本身也是GRE封装报文同样会占用MTU。如果隧道MTU设置过小keepalive报文无法被封装转发反而会导致隧道闪断。而且两端keepalive间隔参数要匹配一方发keepalive报文询问另一方要能回应否则会被误判为对端不可达。我个人的建议是实验阶段不必开keepalive把重点放在路由和封装原理上。生产环境需要开之前先确认MTU和两端参数兼容。4.5 常见问题速查表现象可能原因排查命令解决办法隧道协议down物理链路不通或source/destination配置错误ping tunnel destination修正隧道源目的地址确保物理连通私网Ping不通静态路由下一跳写错display ip routing-table下一跳改为隧道接口地址回程不通对端路由缺失在R3上查看是否有到R1内网的路由两端对称配置静态路由大包不通MTU小于GRE开销ping大包测试隧道口MTU调小两端一致隧道反复up/downkeepalive配置不当或MTU不匹配display interface Tunnel 0/0/0调整或关闭keepalive统一MTUsource接口被改变物理接口Down导致source失效display ip interface brief用Loopback作为隧道源更稳定5. 进阶扩展GRE隧道上运行动态路由5.1 动态路由提升网络冗余性静态路由配置简单但如果是多点组网或者链路存在备份路径静态路由就乏术了。GRE隧道本质上是一个逻辑链路完全可以在这条链路上运行动态路由协议最常见的是OSPF。在R1隧道接口上启用OSPF[R1]ospf 1 [R1-ospf-1]area 0.0.0.0 [R1-ospf-1-area-0.0.0.0]network 10.0.12.0 0.0.0.3 [R1-ospf-1-area-0.0.0.0]network 192.168.1.0 0.0.0.255R3上做类似配置把10.0.12.0/30和192.168.3.0/24宣告进OSPF。这样两端私网路由由OSPF动态学习不再需要静态路由。需要注意不要在物理公网接口上通告OSPF否则公网链路和GRE隧道之间会出现路由逻辑混乱。OSPF只在隧道口和私网口上启用这是个要点。5.2 多隧道场景的思路实际网络中可能是多点互连比如总公司R1分公司R3和R4需要建立两条GRE隧道。此时在R1上创建两个隧道接口分别配不同隧道源和隧道目的路由上再做分流或结合OSPF建立多个邻居。这样的好处是总部和分支、分支和分支之间的流量都能走隧道扩展性更好。实验里可以先做两条隧道感受一下多隧道接口的地址规划、路由策略复杂度这也是面试时经常被问到的话题。6. 实验心得与进一步学习建议这个GRE实验做下来我最大的体会是隧道技术是很多网络场景的基础组件GRE虽然老但它把“封装、解封装、逻辑链路、路由联动”这几个网络核心概念串得很顺。你如果能把GRE彻底搞懂再去学VxLAN、MPLS这种更复杂的隧道技术思路会轻松很多。实际动手时还有几个小建议。配置命令要养成敲完就验证的习惯别等到全部配完再一起查。每配置完一步马上用display和ping确认状态定位问题的时间能省一半。另外实验完成后建议保存配置save命令避免重启后配置丢失白配一遍。如果你在eNSP上做完这个实验可以自己尝试改动把物理接口地址换成Loopback地址做隧道源或者在GRE隧道上跑OSPF做双链路备份这些变式能帮你把原理理解得更透。后面有机会我再分享GRE结合其他协议的实测案例欢迎一起交流。