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_port | transport profile 里的兼容默认端口。 |
listen_port | 本端有效入站 FAKE_TCP 目标端口。 |
source_port | 本端有效出站 FAKE_TCP 源端口。 |
peer_listen_port | 对端有效 FAKE_TCP listen port。 |
bind_device | tc 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 = 期望看到的对端源地址选择顺序:
underlay_mode=manual时优先使用手动选择的 local underlay address。- 否则优先使用所选接口上报的 detected interface address。
- 再使用其他 underlay-capable detected interface address。
- 再使用 node manual addresses 和上报 public addresses。
- local 和 peer 必须匹配同一个 IP family;IPv4 和 IPv6 都可用时优先 IPv4。
- 如果最终 local 与 peer family 不一致,拒绝配置。
- 如果 FAKE_TCP
listen_address或source_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。