GRE 隧道与协议号 47
GRE 是最常见的三层隧道封装协议,封装后的外层报文在 IP 头里协议号写成 47,可用 ip proto gre 过滤。tcpdump 只解析到 IP 层,被封装的内层原始报文要看清楚源目地址与端口,必须交给 Wireshark 按 GRE 协议解封装。它常与 IPsec 组合用于站点互联,也可以单独使用,但单独使用时既不加密也不认证。
基本信息
| 适用平台 | Linux / macOS 的 tcpdump(libpcap 支持 proto 过滤) |
|---|---|
| 过滤语法 | ip proto gre,等价于 ip proto 47 |
| 协议号 | 47(IANA 分配) |
| 同类封装 | IP-in-IP 是协议号 4,VXLAN 是 UDP 4789,GENEVE 是 UDP 6081 |
典型使用场景
- 隧道连通性排查:确认外层 GRE 报文在两个方向上是否都有流动
- 隧道内业务异常定位:在网关侧抓外层包,再用 Wireshark 解出内层五元组
- 隧道 MTU 验证:GRE 会增加封装开销,抓包看大包是否被丢弃或分片
- 区分不同封装类型:GRE 与 IPIP、VXLAN 的过滤表达式不能互相替代
- 云上专线排障:确认安全组与云网络策略是否放行协议号 47
常用示例
常用示例
sudo tcpdump -i eth0 -nn 'ip proto gre' -c 20 # 只看隧道外层,取前 20 个包
sudo tcpdump -i eth0 -nn 'ip proto gre and host 203.0.113.10' -w gre.pcap # 限定对端并存盘
sudo tcpdump -i eth0 -nn 'ip proto 47 and greater 200' # 只保留体积较大的封装包
# 用 Wireshark 打开 gre.pcap,按 IP → GRE → 内层 IP 逐层展开查看
# 想在 tcpdump 里直接过滤内层地址需要手工算 BPF 偏移,可读性差,建议改用 Wireshark封装协议速查
| 封装类型 | 协议号或端口 | tcpdump 过滤 |
|---|---|---|
| GRE | IP 协议 47 | ip proto gre |
| IP-in-IP | IP 协议 4 | ip proto 4(部分平台写作 ipencap) |
| VXLAN | UDP 4789 | udp port 4789 |
| GENEVE | UDP 6081 | udp port 6081 |
GRE 自身不做加密与完整性校验,内层报文在公网上形同明文。合规要求高的场景应叠加 IPsec 形成 IPsec over GRE,或直接改用其他自带加密的隧道技术,不要用 GRE 传输敏感数据。
GRE keepalive 是部分厂商的实现扩展,并非协议必需项;抓不到保活报文不代表隧道异常,应以接口状态与业务流量是否通畅为准。
GRE 基础头最少 4 字节,外层还要再包一个新的 IP 头(IPv4 为 20 字节、IPv6 为 40 字节),隧道因此会吃掉约 24 字节以上的有效载荷空间。两端 MTU 与 MSS 未同步调小时,典型表现就是隧道内小包通、大包被丢弃或超时。