GRE 实战与排错 — 抓包、配置与故障定位
GRE 隧道 Wireshark 抓包过滤、Linux/Cisco 配置命令、MTU 黑洞与递归路由排查、与 IPSec/VXLAN 对比 / 网络层(隧道) / IP 协议号 47 / RFC 2784
这篇你能学到
- 怎么用 Wireshark / tcpdump 把 GRE 隧道的外层封装和内层原包分别看清楚。
- Linux 和 Cisco 上从零建一条 GRE 隧道的完整命令,以及放行、MSS Clamping 这些必配项。
- 四类高频故障(ping 不通、大文件卡死、隧道 flap、接口假 UP)的结论与排查路径,外加对比表和面试速查。
1. 抓包观察
下面这些过滤式的作用:把海量流量里属于 GRE 的部分挑出来,并进一步定位到具体某条隧道、某种乘客协议,或者抓 MTU 相关的 ICMP 回包。
| 过滤式 | 作用 |
|---|---|
gre / ip.proto == 47 | 所有 GRE 报文 |
gre.key == 100 | 精确匹配某条 Key 隧道 |
gre.proto == 0x0800 / == 0x6558 | 乘客为 IPv4 / 以太帧(GRETAP) |
icmp.type == 3 && icmp.code == 4 | PMTUD"需要分片",排查 MTU 黑洞 |
这两条命令的区别在于抓的位置不同:抓物理网卡看到的是套了壳的外层包,抓隧道口看到的是已经拆完壳的内层原包——两边对照就能判断封装到底成没成功。
排障必看三点:外层 Protocol=47(封装是否成功)、GRE Flags/Version(两端标志一致与否)、内外层地址(是否走错隧道或递归)。
2. 常用命令 / 配置
Linux(iproute2)
这段命令做的事:加载 GRE 内核模块 → 建一个点对点隧道口并给它配上隧道内网段地址 → 设好 MTU 和走隧道的路由 → 顺带建一个二层版本的 GRETAP → 打开转发、放行协议号 47 → 最后用 MSS Clamping 从根上避免 MTU 黑洞。
| |
Cisco IOS
这段配置做的事:建一个虚拟隧道接口 Tunnel0,给它配隧道内地址和 1476 的 MTU,指明外层从哪个物理口发出、发往哪个公网地址,开启 Keepalive 探活,最后把去往对端私网的路由指到隧道口。
3. 常见故障与排错
现象:隧道 UP 但 ping 不通对端
先记住结论: 隧道 UP 只是本地配置成立,包大概率压根没出去或没被收下——问题出在协议 47 被拦、两端 key 不对称,或者中间有 NAT。
排查/解决:两端抓 proto gre 验证收发;ip -d link show gre1 比对 key;NAPT 环境改 VXLAN/WireGuard。
现象:能 ping,大文件卡死
先记住结论: 这是典型 MTU 黑洞——小包过得去、大包被丢,根因是 DF 置位 + PMTUD 回包被丢。
排查/解决:隧道 MTU 1476 + 两端 MSS Clamp 1436。
现象:隧道周期 flap
先记住结论: 十有八九是递归路由——隧道目的地址是通过隧道自身学到的,路由一振荡隧道就掉。
排查/解决:ip route add 2.2.2.2/32 via <物理网关>;路由协议过滤端点网段。
现象:接口"假 UP"
先记住结论: 别信这个 UP。Linux 无状态,接口状态不反映对端死活。
排查/解决:用定时 ping / 路由 Hello / BFD 探测。
| 现象 | 原因 | 排查/解决 |
|---|---|---|
| 隧道 UP 但 ping 不通对端 | 协议 47 被拦 / key 不对称 / NAT 后 | 两端抓 proto gre 验证收发;ip -d link show gre1 比对 key;NAPT 环境改 VXLAN/WireGuard |
| 能 ping,大文件卡死 | MTU 黑洞:DF 置位+PMTUD 回包被丢 | 隧道 MTU 1476 + 两端 MSS Clamp 1436 |
| 隧道周期 flap | 递归路由:隧道目的经隧道自身学到 | ip route add 2.2.2.2/32 via <物理网关>;路由协议过滤端点网段 |
| 接口"假 UP" | Linux 无状态,不反映对端死活 | 用定时 ping / 路由 Hello / BFD 探测 |
4. 与其他协议对比
| 维度 | GRE | IP-in-IP | IPSec 隧道 | VXLAN |
|---|---|---|---|---|
| 承载 | IP 47 | IP 4 | ESP 50 | UDP 4789 |
| 加密 | ❌ | ❌ | ✅ | ❌ |
| 组播/非 IP | ✅ | ❌ | ❌ | ✅ |
| NAT 穿越 | ❌ | ❌ | NAT-T | ✅ |
| 状态 | 无 | 无 | 有(IKE) | 无 |
结论:GRE 不可替代在"承载任意协议 + 跑组播/动态路由 + 无状态极简";短板是"不加密 + 难穿 NAT"。生产常用 GRE over IPSec。
5. 速查表 / 常见面试题
| 项目 | 值 |
|---|---|
| IP 协议号 | 47 |
| RFC | RFC 2784 / 扩展 2890 |
| 最小头长 / 开销 | 4 B / 24 B |
| 建议 MTU / MSS | 1476 / 1436 |
| Version | 必须为 0(1=PPTP) |
| Protocol Type | IPv4 0x0800、以太帧 0x6558 |
- Q:GRE 用哪个端口? 不用端口,用 IP 协议号 47,也是难穿 NAPT 的根因。
- Q:有 IPSec 为何还要 GRE? IPSec 隧道只封 IP 单播,无法承载组播/动态路由;GRE 先封成单播 IP 再交 IPSec 加密。
- Q:Key 能当密码吗? 不能,明文可伪造,安全靠 IPSec/ACL。
- Q:MTU 为何 1476? 1500−20(外层IP)−4(GRE)=1476。
- Q:递归路由? 隧道目的经隧道自身学到致 flap;配指向物理下一跳的明细路由解决。