相信很多人第一次接触“内网穿透”,都是因为这样一个问题:
“我在家写了个网页想让朋友访问,结果他连不上。”
或者更常见的:
“我在学校写了个小游戏服务器,结果公网的同学都进不来。”
于是有人告诉你:“映射个端口就行”,你照做了,但 NAT、局域网、防火墙、ISP 限制……各种问题接踵而来。
结果是:
其实问题的根源很简单:
互联网并不是“所有设备互通”的网络。
在 NAT(网络地址转换)和内网的世界里,你的电脑其实是“被墙在家里的”。
而“内网穿透(NAT Traversal)”,就是用各种巧妙的技术手段,让“墙里的设备”也能被外部世界访问。
要理解内网穿透,先要理解我们常说的“内网”是什么。
类型 | 地址范围 | 能否直接访问公网 | 举例 |
---|---|---|---|
内网 (Private Network) | 10.x.x.x / 172.16.x.x / 192.168.x.x | ❌ 否 | 家用路由、公司局域网 |
外网 (Public Network) | 任意公网 IP | ✅ 是 | 网站服务器、云主机 |
你家电脑的 IP 大概率长这样:192.168.1.103
。
而百度服务器的 IP 是 220.181.38.148
。
区别在于:
这也意味着,如果你要让别人访问你的电脑(例如访问你开的 HTTP 服务器),就必须让请求从公网绕进内网。
这,正是内网穿透要“穿”的那堵墙。
NAT(Network Address Translation)翻译成中文就是“网络地址转换”。
它的本意是节省公网 IP,让多个设备共享一个外网出口。
简单来说:
家里所有设备都通过同一个公网 IP 上网, NAT 设备(也就是路由器)负责“谁发的包谁收回来”。
但是这就引出了一个严重的问题:
也就是说,你访问百度没问题,但百度访问你就完全不行。
NAT 是单向的,它阻止了外部主动发起的连接请求。 于是你的服务(HTTP、游戏服务器、SSH)就被挡在了外面。
想让外部访问到内网设备,无非就三种思路:
于是,“中继服务器(Relay Server)”登场。
在这种方案下,你运行一个内网客户端,它主动连接到公网的中继服务器。 服务器则作为代理,把外部请求转发进来。
[公网用户] <--> [中继服务器] <==TCP隧道==> [你的电脑]
例如:
localhost:8080
的网站;
https://xxxx.ngrok.io
;
这,就是最经典的内网穿透模式。
名称 | 类型 | 是否开源 | 延迟 | 配置难度 | 特点 |
---|---|---|---|---|---|
FRP | TCP/HTTP 隧道 | ✅ 开源 | 中等 | 中 | 功能强、部署灵活 |
Ngrok | HTTP/HTTPS 隧道 | ✅ 开源(老版) | 中等偏低 | 易 | 一键上手 |
ZeroTier | 虚拟局域网 | ✅ 开源 | 低 | 中 | P2P+中继混合 |
Tailscale | 虚拟局域网 | ❌ 商业版 | 极低 | 低 | 自动 NAT 打洞,免配置 |
花生壳 | TCP/HTTP 隧道 | ❌ 商业 | 较高 | 低 | 简单易用但免费版有限制 |
可以看到:
frp(Fast Reverse Proxy)是国人开发的开源内网穿透工具, 它通过 TCP/UDP/HTTP 等多种方式,把内网服务映射到公网。
一句话总结:
“frp 就是你自己的 ngrok。”
[frps] <---公网服务器--->
↑
|
[frpc] <---内网客户端--->
frp 包含两部分:
frps
:运行在公网服务器上的服务端;
frpc
:运行在你本地电脑上的客户端。
两者通过一个端口(默认 7000)建立连接, 然后将外部请求转发给你的本地服务。
服务端(frps.ini):
[common]
bind_port = 7000
vhost_http_port = 8080
客户端(frpc.ini):
[common]
server_addr = your.server.com
server_port = 7000
[web]
type = http
local_port = 8080
custom_domains = demo.yourserver.com
启动后,访问 http://demo.yourserver.com
,
就能访问你本地的 localhost:8080
服务。
中继服务器虽然简单,但有个问题——贵且慢。
于是聪明的工程师想出了更高效的方式:P2P 打洞(Peer-to-Peer NAT Traversal)。
简单示意:
[主机A] -> [信令服务器] <- [主机B]
↘ ↙
<----打洞通信---->
这就是 WebRTC、Tailscale、ZeroTier 背后的“打洞机制”。
这就是为什么:
真正可靠的内网穿透系统,都会“P2P + 中继”双管齐下。
这两个概念经常被混为一谈,但其实完全不同。
项目 | 内网穿透 | VPN |
---|---|---|
目的 | 让外部访问你的内网 | 让你访问外网资源 |
通信方向 | 外部 → 内部 | 内部 → 外部 |
实现方式 | 隧道 + 中继 | 虚拟网卡 + 隧道 |
常用工具 | frp、ngrok、ZeroTier | OpenVPN、WireGuard、Tailscale |
常见用途 | 远程调试、文件访问、私有服务 | 安全上网、企业内网接入 |
一句话总结:
VPN 是“出去”,内网穿透是“进来”。
如今的内网穿透不再局限于单点映射,而是朝着“虚拟局域网”方向发展。
这类方案让世界各地的设备组成一个“逻辑上的同一个网段”。
比如:
10.147.5.2
10.147.5.3
10.147.5.4
虽然它们分布在不同城市、不同运营商, 但它们都能直接互 ping、ssh、访问共享文件。
这就是 ZeroTier、Tailscale、Nebula 的魅力:
“跨越地理边界的内网。”
解决:使用中继式穿透(frp/ngrok),或使用虚拟局域网(ZeroTier)。
解决:尽量选择就近节点;或改用 UDP 隧道。
解决:选择支持自动回退的方案(Tailscale/ZeroTier)。
回到最初的问题:
“为什么我开的服务器别人连不上?”
答案其实很简单:
因为整个互联网并不是对称的。
内网穿透的意义,不仅是“让别人访问你”, 更是让开发者理解:
也许有一天,IPv6 普及、NAT 消失、所有设备都有公网地址, 那时“内网穿透”这个词会被历史淘汰。
但在那之前, 每一个能让本地服务“走出内网”的程序员, 都在和整个互联网的边界对抗。
作者观点:
“内网穿透,不只是技术问题。 它是一种对网络结构的反思—— 在一个封闭的世界里, 我们总会想办法找到那条通向外面的路。”