内网穿透技术 -- NAT ngrok 花生壳

前言
笔者上大学时,毕业设计是研究 P2P 网络的,涉及到跨局域网通信的需求,开始接触了 NAT,当时也是一知半解。如今,即使不关注 P2P 的概念,在日常使用即时通信工具或者 Web 开发中的 WebRTC 技术时,本质上都需要用到 P2P 通信,这离不开内网穿透技术。今天写一篇文章对相关技术进行整理。


一、内网穿透的背景:IP 地址不够用

IPv4 地址仅有约 43 亿个(2³²),无法满足快速发展的互联网设备联网需求。虽然 IPv6 被设计为终极解决方案,但在 IPv6 全面普及之前,业界需要一种渡方案。于是,网络地址转换(Network Address Translation, NAT)应运而生,并迅速成为家庭路由器、企业防火墙乃至移动运营商网络中的标准组件。NAT 通过允许多个内网设备共享一个公网 IP 地址,缓解了 IPv4 地址快速耗尽的压力。
然而,这种"共享"机制也带来了一个根本性问题:内网设备对外不可见。当你的个人电脑或开发服务器位于 NAT 之后时,外部网络无法主动发起连接------这正是"内网穿透"技术要解决的核心难题。


二、NAT:解决了内网访问外网的问题

NAT 最初的设计目标:让私有网络中的设备能够访问公网资源,同时节省公网 IP 地址。通过修改 IP 数据包的源/目的地址和端口号来实现地址复用。
典型的网络结构如下:

  • 路由器拥有一个公网 IP(如 203.0.113.45)
  • 内网设备使用私有 IP(如 192.168.1.2、192.168.1.3)当内网设备 A(192.168.1.2:50000)访问公网服务器 B(93.184.216.34:80)时,路由器会将数据包的源地址替换为自己的公网 IP 和一个临时端口(如 203.0.113.45:62001)。
    这样,从服务器 B 的视角看,请求来自公网 IP 203.0.113.45,而非内网 IP。响应数据包返回到路由器后,NAT 表会根据端口映射关系将其转发回原始内网设备。
    而如果其他 IP 向这个临时端口发送数据,则会被 NAT 丢弃,应为在映射表中没有记录这个"其他 IP"。
    这一机制完美实现了"内网→外网"的单向通信,却无意中切断了"外网→内网"的反向路径。

三、NAT 原理:地址映射与状态维护

NAT 的核心在于维护一张动态的映射表,记录内网 IP:端口与公网 IP:端口的对应关系。根据映射策略的不同,NAT 主要分为2种类型:

锥型 NAT

锥型 包括全锥型、限制锥型和端口限制锥型等变体。它们的共同特点是:同一个内网 IP:端口组合,在访问任意外部地址时,始终映射到同一个公网 IP:端口
区别仅在于对外部入站流量的放行策略------从允许任意主机访问,到仅允许曾通信过的外部 IP 或 IP:端口访问,安全限制逐级增强。
总体而言,锥型 NAT 在穿透场景下行为可预测,是 UDP 打洞等 P2P 技术能够成功的基础。

对称型 NAT
  • 映射规则 :按「协议 + 内网 IP:Port + 外部目标 IP:Port」为维度生成强绑定的独立映射表项,表项记录协议 + 内网 IP:Port + 路由器公网 IP:Port + 唯一外部目标 IP:Port;不同内网 IP:Port 访问同一外部目标,或同一内网 IP:Port 访问不同外部目标,均会分配不同公网端口;
  • 放行规则 :仅允许对应外部目标 IP:Port 的同协议流量,发往其专属的公网端口,才能被转发到对应内网 IP:Port;
  • 特点 :最严格的 NAT 类型,外部主机几乎无法预测内网设备的公网端口,极大增加了 NAT 穿透难度。
    NAT 设备通常还会设置超时机制(如 TCP 连接空闲 30 分钟、UDP 流 5 分钟),超时后映射条目会被清除,以释放端口资源。

四、单向性并非 NAT 的初衷,而是历史演进的结果

NAT 的单向通信(内网访问公网)特性并非其原始设计目标。早期的 NAT 实现支持双向通信------例如通过静态端口映射(Static Port Forwarding)手动配置规则,将公网 IP 的某个端口永久映射到内网某台设备的特定端口。
然而,随着网络安全意识的提升,人们逐渐发现:NAT 天然具备防火墙功能。由于外部无法主动探测内网设备,恶意攻击者难以直接扫描或入侵内网主机。这种"默认拒绝"的安全模型意外地成为 NAT 被广泛接受的重要原因。
于是,厂商开始强化 NAT 的"隔离"特性,默认关闭所有未授权的入站连接。单向性从"可选能力"转变为"默认行为",甚至被宣传为一项安全优势。虽提升了安全性,却也彻底阻断了 P2P 通信、远程服务部署等应用场景。
为何 NAT 迅速普及?

  • 成本低廉 :无需申请公网 IP,普通用户通过一个公网 IP 即可让多台设备上网。
  • 部署简单 :集成于家用路由器。
  • 附带安全效益 :内网设备默认不可被外网访问,形成"隐式防火墙"。
    到 2000 年代初,NAT 已成为全球绝大多数家庭和中小企业网络的标配。

五、UDP vs TCP:穿透难度的本质差异

在尝试实现双向内网穿透时,UDP 协议比 TCP 更容易成功,原因在于两者的状态管理机制不同。

UDP 打洞

UDP 是无连接协议,NAT 设备通常基于"最近通信的对端"来决定是否放行返回包。利用这一特性,两个位于不同 NAT 后的客户端可通过一个公共信令服务器协调打洞:

  1. 客户端 A 和 B 分别向服务器 S 注册,S 记录各自的公网 IP:端口(PubA、PubB);
  2. S 通知 A 和 B 彼此的公网地址;
  3. A 立即向 PubB 发送 UDP 包,B 同时向 PubA 发送;
  4. 尽管首次包可能被丢弃,但 NAT 会在本地创建临时映射;
  5. 后续包即可直接穿越 NAT,建立 P2P 连接。
    此方法在锥型 NAT(非对称型)下成功率较高,但在对称型 NAT 中因端口不可预测而失效。
TCP 打洞的困境

TCP 是面向连接的协议,建立连接需完成三次握手(SYN → SYN-ACK → ACK)。问题在于:

  • 外部主机向内网设备的公网 IP:端口发送 SYN 时,NAT 因无对应映射而丢弃该包;
  • 内网设备无法提前"预热"映射,因为 TCP 连接必须由一方主动发起;
  • 即使双方同时向外发送 SYN(Simultaneous Open),也要求精确的时间同步(毫秒级)和 NAT 行为配合,实践中极难实现。
    因此,TCP 内网穿透几乎无法依赖纯打洞技术,必须借助中继或代理。

六、混合解决方案

面对 TCP 协议在 NAT 环境下的穿透困境,业界发展出了多种实用的解决方案。其中最常见的就是混合模式。
混合结合:系统首先尝试通过 UDP 或 TCP 打洞建立直连,以获得低延迟、高带宽的点对点通信;一旦探测到 NAT 类型不支持(如对称型 NAT)或打洞失败,则自动无缝切换至中继服务器中转数据。该策略在保障连接成功率的同时,尽可能优化性能,广泛应用于 WebRTC、即时通讯和实时音视频场景。


七、内网服务器解决方案

前面提到的场景都是 P2P 通信的场景,另一个场景是在自己的局域网中(或者无固定IP的机器上)部署一个服务器,希望在公网访问这个服务。此时由于请求从公网发起,所以需要用到基于中继的穿透。

基于中继的穿透

所有流量经由公网服务器中转。优点是 100% 可靠,缺点是带宽受限于服务器、延迟增加,且需要对流量进行付费。典型代表包括:

  • ngrok(海外) :开源工具,用户在局域网运行客户端连接 ngrok 云端,建立一个持久的TCP链接。云端分配一个公网 URL(如 abc.ngrok.io),所有对该 URL 的请求被持久的TCP链接转发至局域网服务。
  • frp / ZeroTier :开源替代方案,支持自建中继服务器。
以 ngrok 为例:反向代理隧道原理
  1. 用户在内网启动 ngrok http 8080;
  2. ngrok 客户端与 ngrok 服务器建立长连接(通常基于 TLS 加密的 WebSocket 或自定义协议);
  3. 服务器分配一个唯一子域名(如 xyz.ngrok-free.app);
  4. 当公网用户访问该域名时:
    1. 请求到达 ngrok 服务器;
    2. 服务器通过已有长连接将 HTTP 请求转发给内网客户端;
    3. 客户端将请求代理给本地 127.0.0.1:8080;
  5. 响应沿原路返回。
    整个过程对终端用户透明,仿佛服务直接部署在公网。关键在于:连接由内网主动发起,绕过了 NAT 的入站限制。
国内方案:花生壳的演进

花生壳(Oray)早期依赖 UPnP 或手动端口映射,后来转向类似 ngrok 的云隧道模式。其优势在于:

  • 针对中国网络环境优化(如多运营商 BGP 线路);
  • 提供域名绑定、HTTPS 证书等增值服务;
  • 支持硬件集成(如路由器内置花生壳插件)。
相关推荐
“αβ”3 天前
IP协议内容补充
服务器·网络·网络协议·tcp/ip·智能路由器·nat·ip协议
小明_GLC3 天前
用户登录验证Demo
内网穿透·前端界面
袁煦丞 cpolar内网穿透实验室5 天前
Blackbox Exporter告别用户投诉!从外部揪出服务断连问题: cpolar 内网穿透实验室第 701 个成功挑战
运维·服务器·远程工作·内网穿透·cpolar
袁煦丞 cpolar内网穿透实验室14 天前
mysql_exporter+cpolar远程监控 MySQL 不卡壳!cpolar 内网穿透实验室第 712 个成功挑战
服务器·数据库·mysql·远程工作·内网穿透·cpolar
凉云生烟15 天前
cpolar助力Grafana告别局域网束缚!让数据监控触手可及
服务器·网络·信息可视化·gitlab·内网穿透
专家大圣16 天前
Tomcat+cpolar 让 Java Web 应用跨越局域网随时随地可访问
java·前端·网络·tomcat·内网穿透·cpolar
袁煦丞 cpolar内网穿透实验室17 天前
告别付费 OCR!PaddleOCR-VL 秒识别手写、公式。cpolar内网穿透实验室第 756 个成功挑战
ocr·远程工作·内网穿透·cpolar·办公搭档
梁辰兴20 天前
计算机网络基础:网络地址转换
网络·计算机网络·计算机·nat·计算机网络基础·梁辰兴·网络地址转换协议
首飞爱玩机器人21 天前
使用FRP搭建内网穿透工具
内网穿透