银鞍照白马, 飒沓如流星

NAT 内网穿透

    network

  1. NAT 类型
    1. 锥形 NAT
    2. 对称型 NAT (Symmetric NAT)
    3. 打洞
  2. 实现

上次折腾完家里网络,配置各种应用耍了好久,最近在小伙伴交流时,聊到了内网穿透的问题,因为之前家里一直有公网 IP,而且自己一直也有 VPS,所以一直没有关注这个问题,正好来学习一下,补充补充知识。

NAT 类型

之前只在家里游戏机上感知到过 NAT 类型,但是没有深入了解过,通过资料查询,终于搞明白了大家常说的 NAT3、NAT4 是什么意思。
基础概念及 NAT 为什么会出现就不再继续赘述了,只记录下 NAT 类型的划分。
NAT 大类分为:锥形和对称型。划分根本就是源 IP:PORT 不变的情况下,NAT 转换后的 PORT 是否固定。固定既为锥形,不固定既为对称型。

锥形 NAT

锥形 NAT 又分位:完全锥形(Full cone NAT)、受限锥形(Restricted cone NAT)、端口受限锥形(Port restricted cone NAT)。
我的理解是这些划分更像是防火墙安全级别限制,受限锥形和端口受限锥形都是在接受报文时检查源 IP:PORT 是否曾被内网机器请求过对应的 IP 或 IP+PORT,如果不在则丢弃报文,完全锥形则不检查,直接转发报文。
示例图

对称型 NAT (Symmetric NAT)

对称 NAT,会同时根据内网设备出方向报文的源 IP、源端口号、目的 IP、目的端口号四个信息来建立 NAT 表项。如果报文的目的 IP、目的端口号发生了变化,映射到的外部端口号也会发生改变。

打洞

根据上面分类,可以看出,对称型 NAT 是不容易进行内网穿透的,但端口是有限的(65535),所以当只有一端是对称型 NAT 时,可以通过打洞的方式进行内网穿透。
下面参考 tailscale 文章,介绍下在对称型 NAT 下的打洞方式。how-nat-traversal-works

在生日悖论的基础上,可以通过端口猜测的方式,来进行打洞。

Number of random probes Chance of success
174 50%
256 64%
1024 98%
2048 99.9%

如图,单边 1024 次探测,可以达到 98% 的成功率,如果双边同时探测 256 次 也可以达到相同的成功率。所以在单侧对称型 NAT 的情况下,还是非常有可能打通的。
但如果双端都是对称型 NAT,成功率会骤降(一侧 256 次,一侧 2048 次,20 秒成功率也只有 0.01%)。

实现

一通学习之后,为什么不自己来实现一个 NAT 穿透工具呢,帮自己来一个不需要借助三方服务器就可以进行文件传输的小工具。于是就有了这个项目:tunnel
已经初步实现了公司和家里的内网穿透,但只能简单通过 UDP 实现简单数据传输,下一步准备上层使用 QUIC 协议,方便应用层的开发。

page PV:  ・  site PV:  ・  site UV: