Skip to content

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、没有重传、没有排序,也没有拥塞控制。

目录

当前支持

区域PayloadFAKE_TCP 角色当前状态
L3 WireGuardWireGuard UDPL3 隧道不再支持后端和 Agent 都拒绝
L4 UDP listenerUDP datagram payload接收 FAKE_TCP 后转发 payload 到 UDP upstream支持,仅 RAW UDP
L4 UDP upstreamUDP 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 bytes

TCP 源端口和目标端口只是分类字段。它们不是 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 工作分开。后续演进建议保持这些边界:

  1. 从 per-route tc filter 演进到每个 underlay interface 一个 ingress dispatcher 和一个 egress dispatcher。
  2. route-specific match/rewrite state 放入 BPF maps。
  3. 放宽 source-IP matching 前,先加入经过认证的 tuple learning。
  4. observed peer tuple 和 probe result 要与静态 reachability check 分开上报。
  5. tcp_port 只保留为兼容默认值;runtime snapshot 优先使用显式 listen/source/ peer listen 字段。

NexusNet documentation