一、前言:为什么会有内网穿透?
在我们的日常开发与部署场景中,经常会遇到这样的情况:
- 我们的电脑(或服务器)在局域网中,使用的 IP 地址通常是
192.168.x.x
、10.x.x.x
、172.16.x.x
等内网地址。 - 公网(如阿里云、腾讯云等云服务器)使用的是可被全世界访问的公网 IP。
当我们希望让互联网上的用户访问到我们在本地(内网)搭建的服务(例如 Django、Node.js、Spring Boot 等),如果没有公网 IP,直接使用 192.168.x.x
这类内网地址是无法在外网访问到的。其根本原因在于:
- 私有地址(内网 IP)不会在公网的路由中进行传播。
- 路由器(或运营商)通常会做 NAT(网络地址转换),把本地多台设备的内网 IP 映射到路由器的一个或几个公网 IP 上,外部无法直接“反向”找到你局域网里的那台设备。
为了解决这一问题,常见的做法有两种:
1. 部署到云服务器上
最直接的方式是将服务部署到云服务器上(如阿里云、华为云、腾讯云等),因为云服务器拥有公网 IP,这样外网就可以直接通过公网 IP 访问到你的服务了。
- 优点:访问速度通常更稳定,适合生产环境;公网带宽由云服务商提供;部署方式相对可控。
- 缺点:需要租用云服务器,产生一定的费用;需要进行额外的运维部署工作。
2. 使用内网穿透技术
如果我们希望本地电脑仍然是开发、运行服务的主力机器,又或者只是临时需要让他人访问本地服务(例如展示 Demo、共享文件等),而又不想或无法购买云服务器时,就可以借助“内网穿透”技术来解决。
- 通过内网穿透服务提供的客户端与服务器端,可以将内网地址映射到一个公网可访问的域名或地址上,从而实现对内网服务的外网访问。
- 常见的内网穿透工具包括:Ngrok、FRP、NATAPP 等。
二、网络示意图
下面是本篇文章中引用的示意图(请参考你所提供的图片),结构大致如下:
┌─────────────────────────────────────┐
│ 本地环境(内网) │
│ ┌─────────────┐ ┌─────────────┐
│ │ Django │ │ 浏览器 │
│ │ IP:192.168.0.103 │ │ │
│ └─────────────┘ └─────────────┘
│ 电 脑 │
└─────────────────────────────────────┘
│
(内网路由器)
│
┌─────────┐
│ 路由器 │
│ IP │
└─────────┘
│
┌──────────────┐
│ 内网/外网 │
└──────────────┘
│
┌─────────────────────┐
│ 公网服务器(ECS/OSS) │
└─────────────────────┘
从图中可以看出:
- 本地电脑(内网)只有内网 IP(如
192.168.0.103
),无法直接被外网访问。 - 路由器会将内网 IP 统一“翻译”到路由器本身的外网 IP,但外网用户也仅能访问到路由器,并不知道具体的内网设备。
- 公网服务器拥有外网 IP(如阿里云服务器、OSS 等),可以被全球访问。
三、两种常见的访问方式
1. 部署到云服务器上
如果我们需要长期、稳定地对外提供服务,最简单的方式就是购买云服务器(如阿里云 ECS),并在上面部署我们的项目。部署步骤通常包括:
- 在云服务器上安装运行环境(Python、Django、Nginx、MySQL 等)。
- 将本地开发完成的项目上传到云服务器。
- 在云服务器上启动服务,并确保安全组和防火墙已开放对应的端口(如 80、443、8000 等)。
- 通过云服务器的公网 IP 或域名进行访问。
这种方式能很好地解决外网访问的问题,但缺点是需要一定的服务器费用,同时也需要维护云端环境。
2. 内网穿透
内网穿透的核心思路是:
- 借助第三方拥有公网 IP 的服务器,来中转外网请求与本地服务之间的通信。
- 当你在本地运行穿透客户端后,本地客户端会主动与第三方服务器建立连接,外网请求再通过第三方服务器转发到你的本地服务。
常用的内网穿透工具
- Ngrok
- 早期比较流行的内网穿透工具,提供免费和付费版本。
- 配置相对简单,但官方服务器在国外,速度可能不够理想。
- FRP
- 开源、免费,配置灵活,可自建服务端,常用于团队或企业内部穿透。
- 配置稍微复杂,但在国内社区中比较活跃,有很多教程可供参考。
- NATAPP
- 国内的一家服务商,提供内网穿透服务,有免费和付费隧道。
- 操作简单,国内速度较快,但免费隧道有一定限制。
内网穿透的使用示例(以 FRP 为例)
- 在公网服务器上部署 FRP 服务端
- 准备一台云服务器(拥有公网 IP)。
- 下载并配置 FRP 服务端(
frps
),在frps.ini
中设置监听端口等参数。 - 启动 FRP 服务端。
- 在本地部署 FRP 客户端
- 下载并配置 FRP 客户端(
frpc
),在frpc.ini
中配置好:- 公网服务器 IP(你的云服务器 IP)。
- 需要穿透的本地服务端口(例如 Django 默认的 8000 端口)。
- 分配的域名或自定义域名。
- 下载并配置 FRP 客户端(
- 启动 FRP 客户端
- 本地客户端与远程服务器建立连接。
- 当外网用户通过域名或公网服务器的端口访问时,就会被转发到你的本地 Django 服务上。
这样,就无需将你的项目直接部署到云服务器上,而是通过内网穿透,让别人也能访问到你本地运行的项目。
四、总结
内网穿透解决了内网环境下无法直接暴露给外网访问的问题,为开发测试、临时共享等场景带来了极大的方便。它并不是唯一的解决方案,很多时候如果有稳定的云服务器,直接在云服务器上部署服务也是一个更可靠的选择。
- 如果你的项目需要长期稳定对外提供服务:建议购买云服务器进行部署。
- 如果只是临时或测试用途:可使用 Ngrok、FRP、NATAPP 等内网穿透工具来快速让他人访问到你的本地服务。
最后,结合上方示意图,可以看出无论是部署到云服务器上,还是使用内网穿透,核心都是让外部访问能够绕过内网地址的限制,直接访问到本地服务或部署在公网服务器上的服务。