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 == 4PMTUD"需要分片",排查 MTU 黑洞

这两条命令的区别在于抓的位置不同:抓物理网卡看到的是套了壳的外层包,抓隧道口看到的是已经拆完壳的内层原包——两边对照就能判断封装到底成没成功。

1
2
tcpdump -i eth0 -nn proto gre # 外层视角
tcpdump -i gre1 -nn # 隧道口 = 已解封装内层

排障必看三点:外层 Protocol=47(封装是否成功)、GRE Flags/Version(两端标志一致与否)、内外层地址(是否走错隧道或递归)。

2. 常用命令 / 配置

Linux(iproute2)

这段命令做的事:加载 GRE 内核模块 → 建一个点对点隧道口并给它配上隧道内网段地址 → 设好 MTU 和走隧道的路由 → 顺带建一个二层版本的 GRETAP → 打开转发、放行协议号 47 → 最后用 MSS Clamping 从根上避免 MTU 黑洞。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
modprobe ip_gre
ip link add gre1 type gre local 1.1.1.1 remote 2.2.2.2 ttl 255
ip link set gre1 up && ip addr add 172.16.0.1/30 dev gre1
ip link set gre1 mtu 1476 && ip route add 10.2.2.0/24 dev gre1
# 对端 R2 对称:local/remote 互换,地址 172.16.0.2/30
ip link add gretap0 type gretap local 1.1.1.1 remote 2.2.2.2 # 二层隧道 0x6558
sysctl -w net.ipv4.ip_forward=1
iptables -I INPUT -p gre -s 2.2.2.2 -j ACCEPT # 放行协议号 47
# TCP MSS Clamping 治 MTU 黑洞
iptables -t mangle -A FORWARD -o gre1 -p tcp --tcp-flags SYN,RST SYN \
  -j TCPMSS --set-mss 1436

Cisco IOS

这段配置做的事:建一个虚拟隧道接口 Tunnel0,给它配隧道内地址和 1476 的 MTU,指明外层从哪个物理口发出、发往哪个公网地址,开启 Keepalive 探活,最后把去往对端私网的路由指到隧道口。

1
2
3
4
5
6
7
interface Tunnel0
 ip address 172.16.0.1 255.255.255.252
 ip mtu 1476
 tunnel source Gi0/0
 tunnel destination 2.2.2.2
 keepalive 10 3
 ip route 10.2.2.0 255.255.255.0 Tunnel0

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. 与其他协议对比

维度GREIP-in-IPIPSec 隧道VXLAN
承载IP 47IP 4ESP 50UDP 4789
加密
组播/非 IP
NAT 穿越NAT-T
状态有(IKE)

结论:GRE 不可替代在"承载任意协议 + 跑组播/动态路由 + 无状态极简";短板是"不加密 + 难穿 NAT"。生产常用 GRE over IPSec

5. 速查表 / 常见面试题

项目
IP 协议号47
RFCRFC 2784 / 扩展 2890
最小头长 / 开销4 B / 24 B
建议 MTU / MSS1476 / 1436
Version必须为 0(1=PPTP)
Protocol TypeIPv4 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;配指向物理下一跳的明细路由解决。