NAT 内网穿透
上次折腾完家里网络,配置各种应用耍了好久,最近在小伙伴交流时,聊到了内网穿透的问题,因为之前家里一直有公网 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 协议,方便应用层的开发。