本页目录
隧道技术对比
"隧道"是将一个协议封装在另一个协议中传输——GRE 最简的 IP-in-IP,VXLAN 为多租户叠加 L2,rathole/frp 通过中继暴露内网服务,WireGuard/IPsec 提供端到端加密。选型看封装开销、是否需要加密、和对 NAT 的兼容性。
概述
"隧道"是网络工程中的通用概念——将一个协议封装在另一个协议中传输。不同隧道解决不同问题:GRE 是最简单的 IP-in-IP 封装,VXLAN 在 L3 网络上叠加 L2 用于多租户,rathole 和 frp 通过中继暴露内网服务,WireGuard/IPsec 提供端到端加密。选型的核心考量是封装开销、是否需要加密、连接模型(按需 vs 常驻)和对 NAT 的兼容性。
隧道分类
L2 overlay: VXLAN, GENEVE — 数据中心虚拟网络, 24-bit VNI
L3 tunnel: GRE, IPIP, WireGuard — 站点互连, 加密 or not
Port forward: rathole, frp, ngrok — 内网服务暴露
Full VPN: WireGuard, IPsec, OpenVPN — 设备级加密接入
rathole vs frp
| rathole | frp | |
|---|---|---|
| 架构 | 对称 (server ↔ client) | 集中 (frps ↔ frpc) |
| 连接模型 | 预建 TCP 连接池 | 按需创建 TCP |
| 多服务 | per-service tunnel | per-service proxy |
| 加密 | 依赖上层 (TLS by Caddy) | 内置 (可选) |
| 协议支持 | TCP only | TCP/UDP/HTTP |
| Docker | server + client | server + client |
| 资源占用 | 极低 (~5MB RAM) | 中等 (~20MB) |
预建连接池的优势: server 和 client 启动时就预先建立多个空闲 TCP 连接。客户端请求到达 server → server 从池中取一个已建立的连接 → 转发数据 → 消除每次请求的 TCP 三次握手延迟。
预建连接池的代价: NAT 或 conntrack 可能把 idle 连接清掉 → early eof 错误 → client 需设 keepalive (TCP keepalive interval < conntrack timeout)。
GRE vs VXLAN
GRE (IP protocol 47):
封装: [Outer IP | GRE hdr(4-16B) | Inner IP | Payload]
设计: 通用 (Generic Routing Encapsulation) — 可封装任何协议
标识: 可选 Key (4B) — 多 GRE 隧道复用同一个 IP
VXLAN (UDP):
封装: [Outer Eth | Outer IP | UDP(port 4789) | VXLAN(8B) | Inner Eth | Inner L2+]
标识: VNI (24-bit) — 16M 个虚拟网络
ECMP: UDP src port 用作 entropy → 多路径路由
MTU: 50B overhead → 需要巨帧 (9000 MTU) 或分片
选型指南
| 需求 | 选择 |
|---|---|
| 暴露内网 HTTP 服务 | rathole + Caddy (auto TLS, 连接池) |
| 多协议内网穿透 | frp (TCP/UDP/HTTP, dashboard) |
| 低延迟 mesh VPN | WireGuard (内核, ~4K 行代码) |
| 自动 NAT 穿透 | Tailscale (STUN+DERP+UPnP) |
| 企业 VPN 网关 | IPsec/IKEv2 (硬件 offload) |
| 数据中心 overlay | VXLAN + EVPN (BGP control plane) |
| 简单 IP tunnel | GRE (轻量, 无加密) |
参考
- rathole: github.com/rapiz1/rathole
- frp: github.com/fatedier/frp
- RFC: 2784 (GRE), 7348 (VXLAN)
Keywords: tunnel, rathole, frp, GRE, VXLAN, WireGuard, connection pool, overlay, port forwarding