FAKE_TCP
状态:Current
最后核对:2026-05-30
FAKE_TCP 是 NexusNet 用来伪装非 TCP 流量的 TCP-looking 封包封装。它用于 L4 UDP 路径:underlay 防火墙、NAT 或云安全组更容易放行协议 6,但不容易放行某些 UDP 的场景。
FAKE_TCP 是 packet transform,不是 TCP transport。它没有内核 TCP listener、 没有 SYN/SYN-ACK/ACK、没有 stream state、没有重传、没有排序,也没有拥塞控制。
目录
当前支持
| 区域 | Payload | FAKE_TCP 角色 | 当前状态 |
|---|---|---|---|
| L3 WireGuard | WireGuard UDP | L3 隧道不再支持 | 后端和 Agent 都拒绝 |
| L4 UDP listener | UDP datagram payload | 接收 FAKE_TCP 后转发 payload 到 UDP upstream | 支持,仅 RAW UDP |
| L4 UDP upstream | UDP datagram payload | 把下一跳 UDP payload 通过 FAKE_TCP 发送 | 支持,仅 RAW upstream |
L4 链里,当前支持的 profile 是:
text
payload = udp
outer = fake_tcp
security= raw核心模型
FAKE_TCP 构造的是一个普通 IP 包,外层 next protocol 是 TCP。TCP header 没有 options,TCP payload 里先放 NexusNet FAKE_TCP payload header,再放真正的协议 payload。
text
线上包:
outer IP header
outer TCP header, flags ACK+PSH
NexusNet FAKE_TCP payload header
inner payload bytesTCP 源端口和目标端口只是分类字段。它们不是 Linux TCP 栈分配的端口,而是 Agent 直接在 raw IP 或 tc eBPF 程序里写进去的值。
关键后果:
- FAKE_TCP listener 不是一个会
accept()stream 的 TCP 服务。 - 如果不安装 RST filter,内核可能会对看起来没有 TCP socket 的包发 RST。
- 只检查协议号和端口的中间设备通常会放行。
- 要求真实 TCP 状态机的中间设备仍可能丢包。
- destination port、magic、session id 和 payload checksum 通过后,允许 NAT44 改写源端口。
章节地图
- 地址和端口语义:underlay 地址选择、NAT44 行为、endpoint listen port、source port 和自动分配。
- 封包格式:通用 FAKE_TCP payload header、外层 IPv4/IPv6 封包布局、checksum 字段和 RFC 风格图。
- L4 UDP:入站 UDP listener、出站 UDP upstream 包装、gateway 限制和 runtime 上报。
- 数据面模式:
auto、纯 eBPF、混合 eBPF、raw socket fallback、RST filter 和后续 dispatcher 工作。
当前限制
- 运行时需要 raw socket 和 tc/eBPF 权限。
- 没有 TCP connection state、重传、排序、拥塞控制或 MSS negotiation。
- 不写 TCP options。
- NAT44 源端口改写可接受。
- 诊断页是控制面评估,不是 active NAT probe。当前 active probe state 为
not_supported。 - 当前 tc eBPF 程序是 per-route 静态程序。后续 dispatcher 可以把 route 记录放入 BPF maps,避免普通配置刷新时重复 attach/detach。
开发方向
当前设计刻意把稳定行为和未来 flow-learning 工作分开。后续演进建议保持这些边界:
- 从 per-route tc filter 演进到每个 underlay interface 一个 ingress dispatcher 和一个 egress dispatcher。
- route-specific match/rewrite state 放入 BPF maps。
- 放宽 source-IP matching 前,先加入经过认证的 tuple learning。
- observed peer tuple 和 probe result 要与静态 reachability check 分开上报。
tcp_port只保留为兼容默认值;runtime snapshot 优先使用显式 listen/source/ peer listen 字段。