端口与 NAT 穿透
端口是传输层的"多路复用器",NAT 把它变成了互联网最大的 hack。STUN/TURN/ICE 这一套 NAT 穿透工具的本质是:在外网映射和内网地址之间建立一条可预测的路径。
概述
NAT 穿透是当前互联网架构中最大的妥协——IPv4 地址耗尽迫使数十亿设备共享公网 IP,导致"直接连接"变成了例外。在 NAT 之后,两个设备无法直接通信(除非通过中继或打洞)。STUN 帮助设备发现自己的公网映射、TURN 提供不可穿透时的中继、ICE 自动选择最优路径(直连 > 打洞 > 中继)。Tailscale 将这些技术封装成了用户无感的 mesh VPN。
Ephemeral Ports
TCP/UDP 连接中 client 端自动选的 port, 范围由内核管理:
cat /proc/sys/net/ipv4/ip_local_port_range
耗尽风险: 高并发短连接 (每个连接 consuming 一个 ephemeral port + TIME_WAIT 期间的 60s) → 端口用光 → connect() 返回 EADDRNOTAVAIL
缓解: 增大范围 + tw_reuse
NAT 分类 (RFC 4787)
NAT 的映射行为决定了穿透难度:
NAT filtering 行为 (防火墙侧): 类似 mapping, Endpoint-Independent → 最松; Address+Port-Dependent → 最严。
如果 NAT 是 Endpoint-Independent Mapping + Address-Dependent Filtering (最常见 home router), 则 STUN 有效。如果 Symmetric (大多数移动网络), 则需要 TURN 或端口预测。
STUN (RFC 8489)
TURN (RFC 8656)
STUN 对 Symmetric NAT 无效 — 外部 port 不可预测。TURN 做中继:
ICE (RFC 8445): 候选收集与连接检查
Tailscale 的 NAT 穿透策略
参考
- RFC: 4787, 8489, 8656, 8445, 6887
- tailscale blog: "How NAT traversal works"
Keywords: ephemeral ports, NAT, Full Cone, Symmetric NAT, STUN, TURN, ICE, hole punching, DERP