什么是内网穿透?NAT 环境下如何让外网访问内网服务?
简化版
内网穿透指让处在 NAT/防火墙后面、没有公网 IP 的内网服务,能被外网访问到。问题的根源是 NAT:家里/公司的设备用的是私有 IP(192.168.x.x),公网无法主动连进来(NAT 只允许「内网先出去、再让对应的回包进来」)。解决核心思路是**「让内网主动向外建立连接,再借这条连接把外部请求反向送进来」——因为内网出方向是通的。最常见的做法是用一台有公网 IP 的中转服务器**:内网机器主动连上它并保持长连接,外网用户访问中转服务器,服务器再通过那条长连接把请求转发给内网机器(这就是 frp、ngrok 等工具的原理,属于反向代理/反向隧道)。另一类做法是 NAT 打洞(P2P),让两个内网节点借助信令服务器直接建立连接,不走中转。
详细版
一、为什么外网连不进内网:NAT 的限制
家庭/公司网络里,设备用私有 IP,通过路由器 NAT 共享一个公网 IP 上网。NAT 的规则决定了:
- 内网 → 外网:内网设备主动发起连接,NAT 建立映射,回包能正确送回。出方向畅通。
- 外网 → 内网:外网想主动连内网某设备,NAT 表里没有对应映射,不知道该转发给哪台内网机,直接丢弃。加上没有公网 IP、有防火墙,外网无法主动连进来。
所以内网服务(家里的 NAS、公司内网的 Web、本地开发的服务)默认外网访问不到。
二、核心思路:反过来,让内网主动出去
既然「外网主动进」不行、「内网主动出」可以,那就利用内网的出方向连接:
① 找一台有公网IP的中转服务器(云服务器)
② 内网机器【主动】连上中转服务器,建立并保持一条长连接(隧道)
③ 外网用户访问中转服务器的某端口
④ 中转服务器通过那条【已建立的长连接】,把请求反向转发给内网机器
⑤ 内网机器处理后,沿原路返回响应
关键点:连接是内网先主动发起的(出方向,NAT 允许),之后这条连接双向可用,外部流量搭着它反向进入内网。这就是 frp、ngrok、花生壳 等内网穿透工具的本质——反向代理 / 反向隧道。
三、两大流派
| 方式 | 原理 | 代表 |
|---|---|---|
| 中转(反向隧道) | 内网连公网中转服务器,外部流量经服务器转发进来 | frp、ngrok、花生壳 |
| P2P 打洞(NAT 穿越) | 两个内网节点借信令服务器协调,直接建立点对点连接,不走中转 | STUN/ICE、部分 P2P 工具 |
中转方式稳定通用(只要能出网就行),但流量都过服务器、有带宽成本;P2P 打洞省中转带宽、延迟低,但成功率受 NAT 类型影响,对称型 NAT 常打洞失败,需要回退到中转(TURN)。
完整版教学
一、先把问题定义清楚:NAT 造成的「进不来」
内网穿透要解决的核心矛盾,来自 NAT(网络地址转换)。
绝大多数设备没有公网 IP,而是用私有地址(192.168.x.x / 10.x.x.x),通过路由器的 NAT 共享公网 IP 上网。NAT 的工作方式是**「记账式转发」**:
- 内网某机
192.168.1.5:12345访问外网8.8.8.8:80,NAT 在表里记一条映射(把私有地址端口换成公网地址端口),外网回包根据这条映射能找回内网机。 - 但外网主动发来的、表里没有对应映射的包,NAT 不知道该给谁,直接丢弃。
结论:NAT 后面的内网服务,外网无法主动连接。再叠加防火墙、运营商不给公网 IP(大内网/CGNAT),情况更甚。内网穿透就是想办法突破这个「进不来」。
二、突破口:出方向是通的
虽然「外网主动进」被 NAT 挡死,但内网主动往外连是完全畅通的(你能上网就说明出方向没问题)。内网穿透的所有方案,本质都是利用这条「内网能主动出去」的通道,把外部访问「引」进来。
一条 TCP 连接一旦建立,就是双向的——无论谁先发起。所以只要让内网先主动建立一条到公网的连接,之后就能借这条连接双向传数据,把外部请求送进内网。
三、方案一:中转服务器 + 反向隧道(最主流)
这是 frp、ngrok 等工具的做法,需要一台有公网 IP 的服务器当中转:
(有公网IP)
外网用户 ─────► 中转服务器 ◄════════ 内网机器(无公网IP)
▲ 主动建立的长连接(隧道)
│
① 内网机器【主动】连中转服务器,注册「我要暴露内网的 web:80」,保持长连接
② 中转服务器在自己的公网端口(如 :8080)监听
③ 外网用户访问 中转服务器:8080
④ 中转服务器把请求通过①的长连接,转发给内网机器
⑤ 内网机器访问本地 web:80,拿到响应,沿隧道回传给中转服务器
⑥ 中转服务器返回给外网用户
以 frp 为例:
- frps(服务端) 跑在公网服务器上。
- frpc(客户端) 跑在内网机器上,主动连 frps,声明要把本地哪个端口暴露出去。
- 外网访问 frps 的对应端口,流量经隧道转发到内网服务。
优点:只要内网能出网就能用,通用、稳定,不挑 NAT 类型。 缺点:所有流量都过中转服务器,占用它的带宽、有成本、延迟略高,中转服务器是瓶颈和单点。
四、方案二:NAT 打洞(P2P,不走中转流量)
如果两个都在内网的节点想直接通信(如 P2P 文件传输、视频通话),走中转太浪费带宽。NAT 打洞(NAT Traversal / Hole Punching) 让它们借助一个信令/协调服务器交换彼此的公网映射信息,然后尝试直接建立点对点连接:
- 双方各自向公网的 STUN 服务器发包,探知「自己经过 NAT 后对外呈现的公网 IP:端口」。
- 通过信令服务器把这个「公网映射」告诉对方。
- 双方同时向对方的公网映射地址发包,制造出 NAT 映射,从而「打通一个洞」,实现直连。
优点:连接建立后流量不经中转,省带宽、低延迟。 缺点:成功率取决于 NAT 类型——锥形 NAT 容易打通,对称型 NAT 很难(每个目标用不同的映射端口,预测不了)。打洞失败时通常回退到中转(TURN 服务器)。这套「STUN 探测 + 打洞 + TURN 兜底」的框架就是 ICE(WebRTC 用的正是它)。
五、几种常见工具/形态
- frp:自建中转,功能强(TCP/UDP/HTTP/HTTPS、P2P 等),开发者常用。
- ngrok:托管式,一条命令把本地服务映射到公网临时域名,适合演示、调试 webhook。
- 花生壳 / DDNS + 端口映射:如果有公网 IP(哪怕是动态的),可以用路由器端口映射(NAT 转发)+ 动态 DNS,让外网直接连到你的公网 IP 再转发进内网——这是「有公网 IP」时的正统做法,不需要中转服务器。
- VPN 方案:用 WireGuard/Tailscale 等组一个虚拟局域网,让外网设备「加入」内网,也是一种内网访问手段(Tailscale 内置了 NAT 穿透)。
六、内网穿透 vs 端口映射 vs VPN
- 端口映射(NAT 转发):前提是你有公网 IP,在路由器上把公网端口转发到内网某机。没有公网 IP 就用不了。
- 内网穿透(反向隧道):没有公网 IP 也能用,靠内网主动连公网中转服务器。这是它和端口映射的关键区别。
- VPN:把远程设备接入内网虚拟局域网,更偏「安全地把自己变成内网一员」,而内网穿透更偏「把某个内网服务暴露给公网」。三者目标相关但侧重不同。
七、安全提醒
内网穿透把内网服务暴露到公网,等于开了一扇门,务必注意:
- 加认证(frp 的 token、访问密码),别裸奔。
- 尽量走加密(HTTPS / 加密隧道),别明文暴露。
- 最小暴露:只暴露需要的端口/服务,别把整个内网都开出去。
- 内网服务本身也要有基本防护,别以为「藏在内网」就不用加固。
八、常见误区与追问
| 考点 | 正确口径 |
|---|---|
| 内网穿透 | 让公网客户端访问 NAT/防火墙后的内网服务 |
| 常见方式 | 反向隧道、中继转发、P2P 打洞 |
| 关键风险 | 暴露面、鉴权、流量审计、服务加固 |
internal service -> outbound tunnel -> public relay
public client -> relay domain:port
relay forwards traffic through established tunnel to internal service
内网穿透的关键是由内网主动建立出站连接,再让公网流量沿这条通道回来。
- 误区:内网穿透等同于 VPN。 VPN 通常接入网络,内网穿透更常暴露某个服务或端口。
- 误区:能访问就说明安全。 暴露内网服务必须做认证、最小权限、访问控制和日志审计。
- 误区:P2P 打洞一定成功。 对称 NAT、严格防火墙和运营商网络都可能导致直连失败,需要中继。
- 追问:为什么用反向连接? 内网机器通常不能被公网主动连接,但可以主动连公网中继。
- 追问:内网穿透有哪些风险? 绕过边界防护、弱口令服务暴露、隧道凭证泄露和横向移动。
- 追问:生产如何收敛风险? 限制来源、强认证、短期凭证、细粒度授权、TLS、审计和按需开启。
九、加强记忆
内网穿透 = 让 NAT/无公网 IP 后面的内网服务被外网访问。根源是 NAT 只允许「内网先出、回包才进」,外网无法主动连入。突破口是出方向畅通:主流方案用一台公网中转服务器,内网主动连上并保持长连接,外部请求经服务器沿这条隧道反向转发进内网(frp、ngrok,本质反向代理)——通用稳定但占中转带宽;P2P 打洞(STUN 探测公网映射 + 双方同时发包打洞,失败回退 TURN,即 ICE 框架)省带宽、低延迟但对称 NAT 常失败。注意区分:有公网 IP 用端口映射,没公网 IP 才需要内网穿透。暴露服务务必加认证 + 加密 + 最小暴露。核心一句:外网进不来,就让内网主动出去建隧道,再把流量反向引进来。