ngrok内网穿透:是什么?

内网穿透,简单来说,就是让外部互联网的用户能够访问到你本地计算机内部(通常位于局域网或私有网络中)的服务或应用。正常情况下,由于防火墙、路由器NAT(网络地址转换)等原因,外部网络是无法直接连接到你的本地设备的。

而ngrok正是一款帮助你实现内网穿透的工具。它通过在你的本地计算机和ngrok的云服务器之间建立一条安全的隧道连接,然后将ngrok云服务器分配的公共地址映射到你本地的服务端口上。这样,当外部用户访问ngrok提供的公共地址时,请求就会通过这条隧道转发到你本地运行的服务上。

ngrok的核心功能:

  • 建立从公共互联网到本地服务的安全隧道。
  • 为本地服务生成临时的公共URL(HTTP/HTTPS)或地址(TCP)。
  • 提供一个Web界面来监控隧道流量。

为什么需要ngrok进行内网穿透?

在很多开发和测试场景下,ngrok提供了非常便利的解决方案,解决了直接暴露本地服务到互联网的难题。以下是几个典型的使用场景:

1. 本地WebHook调试:

许多第三方服务(如GitHub、Slack、微信公众号开发、支付接口等)在发生特定事件时,会向你指定的URL发送WebHook请求。如果你正在本地开发和测试接收WebHook的服务,但又没有一个公开可访问的地址,ngrok就能派上用场。它提供一个公共URL,将这些WebHook请求转发到你的本地开发环境,无需部署到线上服务器即可进行调试。

2. 向客户或同事演示本地应用:

你可能在本地完成了一个网站或应用的原型,想快速展示给客户或团队成员看,但又不想或无法立即部署到公共服务器上。使用ngrok,你可以即时生成一个公共可访问的链接,让他们直接查看你本地运行的成果。

3. 在不同设备上测试本地开发的应用:

例如,你在电脑上开发了一个响应式网站,需要用手机或平板电脑测试其在真实设备上的显示效果。如果你的电脑和移动设备不在同一个局域网内(或者跨局域网),或者你就是想模拟外部访问,ngrok提供的公共URL可以让你在任何联网的设备上访问本地网站。

4. 临时远程访问本地服务:

有时你需要从外部访问家里或办公室内部的某个服务,比如SSH、数据库、游戏服务器等。ngrok的TCP隧道功能可以帮助你实现这一点,无需复杂的路由器端口映射设置。

5. API和移动应用开发调试:

当你开发API供移动应用调用时,通常需要将API部署到公共网络上。使用ngrok,你可以让本地运行的API服务通过公共URL暴露出来,供移动应用直接调用测试,极大地提高了开发效率。

在哪里获取和使用ngrok?

下载ngrok:

ngrok的官方网站是获取其客户端软件的唯一官方渠道。

访问 https://ngrok.com/download。网站会自动检测你的操作系统并推荐相应的下载版本(Windows, macOS, Linux)。

ngrok支持的操作系统:

ngrok客户端是一个跨平台的命令行工具,支持目前主流的操作系统:

  • Windows (提供32位和64位版本)
  • macOS (支持不同芯片架构)
  • Linux (支持多种架构)

下载后,通常是一个zip文件,解压后你会得到一个名为 `ngrok` (或 `ngrok.exe` 在Windows上) 的可执行文件。无需安装,直接运行即可。

ngrok的费用是多少?是免费的吗?

ngrok提供免费套餐付费套餐

免费套餐特性:

  • 可以使用HTTP/HTTPS和TCP隧道。
  • 隧道地址是随机生成的(例如:`https://abcdef123456.ngrok.io`),每次启动ngrok时都会改变。
  • 隧道会话有时间限制(通常是几小时,具体时长可能会调整,但足以满足临时测试需求)。
  • 同时只能运行有限数量的隧道(通常是1个)。
  • 流量和请求率可能有限制。
  • 没有自定义域名支持。

付费套餐特性 (Pro, Business等):

付费套餐提供更高级的功能,适合需要稳定服务、更高性能或团队协作的用户:

  • 固定的ngrok子域名或支持自定义域名。
  • 无会话时间限制(隧道持续运行直到你停止它)。
  • 可以同时运行更多的隧道。
  • 更高的流量和请求率限制。
  • 提供更强的安全功能,如IP白名单、OAuth等。
  • 提供更详细的流量统计和日志。

费用方面,付费套餐根据提供的功能和服务水平不同,有不同的月费或年费计划,具体价格请参考ngrok官方网站的 pricing 页面。对于个人开发者进行临时测试和演示,免费套餐通常已经足够使用。

如何开始使用ngrok?详细步骤

使用ngrok非常简单,主要分为三个步骤:下载、认证和运行。

步骤1:下载ngrok客户端

前往ngrok官网 https://ngrok.com/download,下载适合你操作系统的版本。

下载完成后,找到下载的文件(例如 `ngrok-v3-stable-windows-amd64.zip`),解压到一个你方便找到的文件夹里。你会看到一个 `ngrok` (或 `ngrok.exe`) 可执行文件。

步骤2:注册账号并配置认证令牌 (Auth Token)

虽然免费使用某些功能不需要注册,但注册并绑定Auth Token可以解锁更多功能并避免一些限制。建议注册一个免费账号。

  1. 访问ngrok官网 https://ngrok.com,点击右上角的 “Sign Up” 注册一个账号。可以使用GitHub或Google账号快速注册,或者使用邮箱注册。
  2. 注册并登录后,你会进入ngrok的Dashboard(仪表盘)。
  3. 在Dashboard的 “Your Authtoken” 页面,你会看到你的认证令牌,以及一条如何在命令行中配置它的命令。命令格式通常是:

    ngrok authtoken YourAuthTokenValue

    请复制你的实际Auth Token替换 `YourAuthTokenValue`。

  4. 打开终端或命令提示符 (Command Prompt / PowerShell),切换到ngrok可执行文件所在的目录。
  5. 运行刚才复制的命令。例如:

    ./ngrok authtoken abcd_efghIjkLmnOpqrStuVwxYz12345678 (macOS/Linux)

    ngrok authtoken abcd_efghIjkLmnOpqrStuVwxYz12345678 (Windows)

    运行成功后,ngrok会在你的用户主目录下创建一个配置文件(例如 `.ngrok2/ngrok.yml`),保存你的Auth Token,以后运行ngrok就不需要再次输入这个命令了。

步骤3:运行ngrok隧道

切换回ngrok可执行文件所在的目录,然后根据你要穿透的服务类型运行相应的命令。最常用的两种是HTTP/HTTPS和TCP。

如何穿透本地的Web服务 (HTTP/HTTPS)?

如果你本地运行了一个Web服务器(如Node.js、Python Flask/Django、Java Tomcat/Spring Boot、PHP Apache/Nginx等),并且它正在监听某个端口(例如3000、8080、5000等),你可以使用 `ngrok http` 命令来穿透它。

命令格式:

ngrok http [端口号]

例如:你的Web服务运行在本地的3000端口,打开终端,切换到ngrok目录,运行:

./ngrok http 3000 (macOS/Linux)

ngrok http 3000 (Windows)

如何穿透本地的TCP服务 (例如SSH、数据库、游戏服务器)?

对于非HTTP/HTTPS协议的服务,如SSH (默认端口22)、RDP (默认端口3389)、数据库 (如MySQL 3306, PostgreSQL 5432)、或者其他自定义的TCP服务,可以使用 `ngrok tcp` 命令。

命令格式:

ngrok tcp [端口号]

例如:你要穿透本地的SSH服务(假设运行在默认的22端口),运行:

./ngrok tcp 22 (macOS/Linux)

ngrok tcp 22 (Windows)

如何查看穿透后的公共地址?

当你成功运行 `ngrok http` 或 `ngrok tcp` 命令后,ngrok客户端会在终端显示连接状态和生成的公共地址。

HTTP/HTTPS隧道输出示例:


ngrok

Session Status online
Version x.y.z
Region us/eu/au/ap/... (ngrok服务器区域)
Web Interface http://127.0.0.1:4040 (本地监控页面)
Forwarding http://abcdef123456.ngrok.io -> http://localhost:3000 (HTTP地址)
Forwarding https://abcdef123456.ngrok.io -> http://localhost:3000 (HTTPS地址)

Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00

这里的 http://abcdef123456.ngrok.iohttps://abcdef123456.ngrok.io 就是ngrok为你的本地服务生成的公共访问地址。外部用户访问这些地址时,请求会被转发到你本地的3000端口。请注意,免费用户的地址 `abcdef123456` 部分是随机生成的。

TCP隧道输出示例:


ngrok

Session Status online
Version x.y.z
Region us/eu/au/ap/...
Web Interface http://127.0.0.1:4040
Forwarding tcp://0.tcp.ngrok.io:12345 -> localhost:22 (TCP地址)

Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00

这里的 tcp://0.tcp.ngrok.io:12345 就是TCP隧道的公共地址。它包含一个主机名 (0.tcp.ngrok.io) 和一个端口号 (12345,这个端口号是ngrok随机分配的)。外部用户需要使用这个主机名和端口号来连接你的本地22端口的SSH服务。例如,使用SSH客户端连接时,命令可能是:

ssh -p 12345 [email protected]

本地监控页面:

注意输出中的 “Web Interface” 地址(通常是 `http://127.0.0.1:4040`)。这是ngrok提供的一个本地Web界面,你可以在浏览器中访问它来查看通过ngrok隧道的所有HTTP/HTTPS请求的详细信息,这对于调试非常有用。

如何设置自定义域名 (付费功能)?

免费用户无法设置自定义域名,每次启动ngrok都会获得一个随机子域名。如果你需要固定的地址或自己的域名,需要升级到付费套餐。

升级到付费套餐后,你可以在ngrok Dashboard中配置Reserved Domains或Custom Domains。

  1. 在ngrok Dashboard中保留一个ngrok子域名或添加你自己的域名。
  2. 按照Dashboard的指示配置DNS记录(如果是自定义域名,需要设置CNAME记录指向ngrok的服务器)。
  3. 在本地运行ngrok时,使用 `-hostname` 或 `-domain` 参数指定你配置好的域名:

    ngrok http 80 -hostname your-reserved-domain.ngrok.io

    ngrok http 80 -domain your-custom-domain.com

这样,外部用户就可以通过你固定的或自定义的域名访问你的本地服务了。

使用ngrok的注意事项

ngrok虽然方便,但在使用时也需要注意以下几点:

安全性:

通过ngrok暴露本地服务到互联网,意味着任何人理论上都可以访问它。切勿通过ngrok暴露带有敏感数据或管理界面的本地服务,除非你已经采取了适当的安全措施,比如设置访问密码 (ngrok支持基本认证,付费功能) 或IP白名单。对于非必要的服务,用完后及时关闭ngrok隧道。

免费套餐的限制:

  • 隧道地址是随机的,每次启动都会变,不适合长期或固定地址的需求。
  • 隧道有会话时长限制,可能会在你使用过程中断开连接。
  • 流量和连接数可能有限制,在高负载下可能会不稳定。

本地服务必须运行:

ngrok只是一个转发工具,它本身不提供服务。你需要确保你要穿透的本地服务(如Web服务器、SSH服务)已经在你的本地机器上正确运行并监听指定的端口。

性能:

流量需要经过ngrok的云服务器中转,这可能会引入一定的延迟。对于性能要求极高的应用,这不是一个永久解决方案,但对于开发和测试来说通常是可以接受的。

总结

ngrok是一个强大且易用的内网穿透工具,特别适合开发者、测试人员和需要临时暴露本地服务到互联网的用户。通过简单的命令行操作,你就可以快速将本地的Web服务、API、SSH等暴露给外部访问,极大地提高了开发测试的效率。虽然免费套餐存在一些限制,但对于临时性的需求已经足够应对。了解并合理使用ngrok,将是提高你开发工作效率的有力帮手。


ngrok内网穿透教程