NAT 及其穿透
NAT
对称 NAT = 普通 NAT
非对称 NAT = 锥形 NAT
其实锥形 NAT(非对称)是更简单的架构,也就是我们常常设想的那样
路由器将自己的一个端口,和内部 PC 的一个端口绑定
之后,外部可以通过路由器的该端口,直接访问到 PC
对称式 NAT
则上述的映射关系,会取决于内部 PC 访问的外部地址
PC 访问 A 网站,会经过路由器 1 端口,访问 B,则经过路由器 2 端口
映射关系动态变化
这使得 P2P 十分困难
检查你的网路 NAT 情况:
https://www.whatsmynat.com/ (这网站功能还挺全,包括 UPnP)
**通用即插即用 (UPnP) **允许应用程序自动配置网络设置(例如端口转发),从而简化在线游戏。
其实具体分为:
- NAT0 :Public 公网 IP
- NAT1 :完全圆锥形 NAT(Full cone)动态家宽可以达到最优的状态,外网设备可以主动发信息给 NAT1 网络内的设备。
- NAT2 :受限圆锥形 NAT (Address-Restricted cone)只有内网设备(地址:任意端口)主动发过信息给外网设备,外网设备才能主动连接 NAT2 的该设备的地址(地址:任意端口)
- NAT3 :端口受限圆锥形 NAT(Port-Restricted Cone )只有内网设备(地址:指定端口)主动发过信息给外网设备,外网设备才能主动连接 NAT3 的该设备的地址(地址:指定端口),限制为通信过的端口
- NAT4 :对称 NAT(Symmetric)
以上两个概念指,单个 NAT 设备(路由器)的行为模式。而不是你处在的 NAT 的层级
STUN
STUN(Session Traversal Utilities for NAT)的中文意思是“NAT 会话穿越实用工具”。它是一个轻量级的网络协议。
- 第一步:发现映射地址
- 客户端向 STUN 服务器发送一个请求:“你好,请告诉我你看到的我的地址是什么?”
- STUN 服务器收到请求后,会从数据包的 IP 头里提取客户端的源 IP 地址和源端口,然后将这个信息封装在一个响应里发回给客户端。
- 客户端由此得知了自己的公网映射地址
IP1:Port1。
- 第二步:判断 NAT 类型(关键步骤)
- 客户端会向 STUN 服务器发送另一个请求,但这个请求会要求 STUN 服务器通过一个不同的 IP 地址或端口来回复它。
- STUN 服务器会照做,从另一个地址
IP2:Port2回复客户端。 - 客户端比较两次回复的地址:
- 如果
IP1:Port1和IP2:Port2完全相同,说明无论客户端和谁通信,NAT 都分配同一个公网端口。这意味着是锥形 NAT。 - 如果
IP1:Port1和IP2:Port2不同,说明客户端与不同的目标通信时,NAT 分配了不同的公网端口。这意味着是对称式 NAT。
- 如果
FRP
Fast Reverse Proxy:快速反向代理
由于 NAT 的存在,外部服务器无法直接访问内部 PC
架构:
一台部署在公网的 FRP 服务器
你自己内网 PC 安装 FRP 服务端
目标:从公司访问家里电脑(IP 为 192.168.1.100)的 SSH 服务(端口 22)。
建立控制隧道:
- 你家里的 FRP 客户端主动发起连接,连接到你在公网云服务器上部署的 FRP 服务端(例如,服务端 IP 是
1.1.1.1,监听端口是7000)。 - 由于这个连接是从内网向外发起的,它完美地符合 NAT 设备的放行规则,NAT 会为其创建一个临时的映射。至此,一条稳定的、由内网客户端维护的控制隧道建立起来了。
- 你家里的 FRP 客户端主动发起连接,连接到你在公网云服务器上部署的 FRP 服务端(例如,服务端 IP 是
公网访问与流量中转:
- 当你想访问家中 SSH 时,你不再直接连接
192.168.1.100:22(这是不可能的),而是连接** FRP 服务端**的某个特定端口(例如,在服务端配置中,将端口6000映射给客户端的 SSH 服务)。 - 你的连接请求:
ssh -p 6000 user@1.1.1.1。 - FRP 服务端在端口
6000上收到这个请求。 - 服务端通过已建立的控制隧道,立即通知 FRP 客户端:“有用户想要访问 SSH 服务了!”
- FRP 客户端于是在家中的电脑上启动一个本地连接,连接到
192.168.1.100:22。 - 最终,服务端和客户端协作,将你的 SSH 请求数据通过隧道转发到内网的 SSH 服务,并将响应数据原路返回给你。对你来说,感觉就像是直接在使用公网服务器上的一个服务一样。
- 当你想访问家中 SSH 时,你不再直接连接
其实 FRP 就相当于一个在公网的代理服务器而已
本质上不是 P2P,而是一个中转
受到公网服务器水管大小的约束