Skip to content

FAKE_TCP 地址和端口语义

状态:Current

最后核对:2026-05-30

FAKE_TCP 地址和端口字段描述的是封包分类和 raw packet 构造,不是内核 TCP socket 所有权。

目录

术语

术语含义
Tunnel overlay address隧道接口里的地址,不能当 FAKE_TCP underlay 使用。
Local underlay address本机接口地址,作为默认 FAKE_TCP 源地址。
Reachable underlay address其他节点应该拨到的地址,可以是公网接口、公网 NAT、EIP 或手动地址。
source_address本端发包时写入外层 IP 的 FAKE_TCP 源 IP,默认是解析后的 local underlay。
listen_address本端入站包期望命中的 FAKE_TCP 目标 IP,用于分类,不是 TCP listen(2)
remote_endpoint出站 FAKE_TCP 发送目标,解析 DNS 和补端口前的 peer target。
expected_remote_source入站包期望看到的对端源 IP,NAT 场景下通常是对端公网 NAT 地址。
tcp_porttransport profile 里的兼容默认端口。
listen_port本端有效入站 FAKE_TCP 目标端口。
source_port本端有效出站 FAKE_TCP 源端口。
peer_listen_port对端有效 FAKE_TCP listen port。
bind_devicetc eBPF attach 的 underlay interface hint。eth0:1 这类 alias 会规范化成 eth0
session_id从 network id 或 service key 派生的 32-bit session discriminator,不是加密认证。

Address 解析

后端在推送 L3TunnelConfig 前,为每个 endpoint 生成 FAKE_TCP tuple。

text
local_bind             = 本端 source/bind underlay address
remote_target          = 对端 reachable target address
expected_remote_source = 期望看到的对端源地址

选择顺序:

  1. underlay_mode=manual 时优先使用手动选择的 local underlay address。
  2. 否则优先使用所选接口上报的 detected interface address。
  3. 再使用其他 underlay-capable detected interface address。
  4. 再使用 node manual addresses 和上报 public addresses。
  5. local 和 peer 必须匹配同一个 IP family;IPv4 和 IPv6 都可用时优先 IPv4。
  6. 如果最终 local 与 peer family 不一致,拒绝配置。
  7. 如果 FAKE_TCP listen_addresssource_address 等于 tunnel overlay address, 拒绝配置。

本端 source IP 是 Agent 能合法写到 underlay 的地址。对端 reachable address 是其他节点应当拨到的地址。在 NAT 和云边界部署里,这两个概念经常不同。

NAT44 源地址语义

NAT44 场景里,本地 VM 可能从私有接口地址发包,但对端看到公网 NAT 地址:

text
NAT 前:
  src = 10.0.1.10:53158
  dst = 198.51.100.20:443

NAT 后:
  src = 203.0.113.10:31844
  dst = 198.51.100.20:443

本地 source IP 仍然必须是 Agent 能合法写入的接口地址。公网地址属于 NAT、负载 均衡器或云边界。

接收路径在以下字段通过后允许 NAT44 改写源端口:

  • source IP 匹配 expected_remote_source
  • destination port 匹配本端 listen_port
  • magic 是 NNFTCP01
  • session id 匹配 tunnel 或 route;
  • payload length 和 checksum 有效。

当前数据面不会自动学习 source-IP 改写。如果对端在 NAT 后面,它被观察到的公网 源地址必须由后端地址选择表示为 expected_remote_source

L4 端口语义

L4 UDP over FAKE_TCP 使用 TCP-looking 源端口和目标端口做封包分类,但 payload 仍然是一个 UDP datagram。

Inbound listener:

  • UdpRule.fake_tcp.listen_port 是 TCP-looking destination port。
  • Agent 会为所选 flow 安装 RST filter。
  • 没有 TCP socket 在这个端口 accept stream。
  • 同一个 address:port 上重复的 UDP FAKE_TCP RAW listener 会折叠成一条 route, 因为目前还没有早期 route discriminator。

Outbound upstream:

  • UdpRule.upstream_fake_tcp=true 表示下一跳 UDP datagram payload 会包装成 FAKE_TCP。
  • upstream endpoint port 会成为 TCP-looking destination port。
  • source port selection 是出站封包构造细节,不是内核 TCP bind。

NexusNet documentation