ngrok实现内网穿透实践

1,435 阅读6分钟

ngrok实现内网穿透实践

内网穿透是指将内网服务暴露到外网,让外网用户可以访问内网服务。常用的内网穿透工具有 frp、ngrok 和花生壳。本文将对这三种工具进行优缺点分析,并以 ngrok 为中心,详细说明如何在 Windows 上实现内网穿透。

工具对比

1. frp (Fast Reverse Proxy)

frp 是一款开源的、高性能的反向代理应用,支持 TCP、UDP、HTTP 和 HTTPS 协议。

优点:

  • 高性能,支持多种协议。
  • 支持 P2P 模式,减少延迟。

缺点:

  • 需要有公网 IP进行代理转发请求

2. ngrok

ngrok 是一个跨平台的开源反向代理工具,支持将本地服务器暴露到互联网。

优点:

  • 简单易用,配置方便。
  • 支持多种协议,HTTP、TCP 等。
  • 提供免费的公网IP

缺点:

  • 免费版有带宽和速率限制。
  • 公网地址是临时的,免费版无法自定义域名。

3. 花生壳 (Peanut Hull)

花生壳 是国内常用的内网穿透工具,提供简便的图形化界面操作。

优点:

  • 中文界面,使用方便。
  • 支持多种协议,适合国内用户。

缺点:

  • 免费版内网穿透不支持浏览器访问,形同鸡肋

综上,如果自已有公网IP地址,使用frp。如果没用公网IP地址并且希望免费使用内网穿透的,使用ngrok。有付费意向的建议购买云服务器,也无需使用花生壳。接下来就是介绍如何使用ngrok进行内网穿透。

ngrok 内网穿透详细实现步骤

下面以 ngrok 为中心,详细说明如何在 Windows 上实现内网穿透。

1. 注册并下载 Ngrok

2. 安装 Ngrok

  • 将下载的 Ngrok 压缩包解压到一个目录,例如 C:\ngrok

  • 将解压后的目录添加到系统的 PATH 环境变量中,以便在任何地方都可以使用 ngrok 命令。

3. 认证 Ngrok

  1. 获取 Authtoken, 登录 Ngrok 后,在仪表盘中获取你的 Authtoken。

image.png

  1. 在命令行中配置 Authtoken, 打开命令行工具,运行以下命令将 Authtoken 配置到你的 Ngrok:
   ngrok config add-authtoken <your-authtoken>

4. 启动 Ngrok

要将本地 HTTP 服务暴露到公网,例如 8080端口,运行以下命令:

   ngrok http 8080

也可以创建ngrok_local_server.bat,然后双击快捷运行:

@echo off
echo 请输入需要内网穿透的本地端口:
set /p serverport="端口号:"
ngrok http %serverport%
pause

5. 访问你的服务

  • Ngrok 启动后,会在终端显示类似以下的信息:

image.png

  • 其中,https://xxxxx.ngrok-free.app 就是你的公网地址,通过这个地址可以访问你本地的服务。
  • 访问公网IP会提示安全风险提示,点击Visit Site 即可:

image.png

Ngrok实现公网访问内网Windows文件夹

在开发和测试过程中,我们常常需要在不同设备快速共享文件,或者异地访问内网文件。可以通过Python来实现内网文件夹访问,并结合Ngrok将文件暴露到公网。现在介绍如何使用 Ngrok 在 Windows 上实现公网访问内网文件夹。

步骤 1:安装并配置本地 HTTP 文件服务器

为了通过 Ngrok 访问 Windows 文件夹,我们需要先运行一个 HTTP 文件服务器。可以使用 Python 的内置 HTTP 服务器来实现:

  1. 确保已安装 Python。如果没有,请从 Python 官网 下载并安装 Python。

  2. 打开命令提示符 (CMD) 或 PowerShell。

  3. 导航到你想要共享的文件夹,例如:

    cd C:\path\to\your\folder
    
  4. 运行以下命令启动 HTTP 服务器:

    python -m http.server 8081
    

    或者对于 Python 3

    python3 -m http.server 8081
    

这样你的文件夹就可以通过http://localhost:8081 访问了。

  1. 如果想快速运行HTTP服务器,也可以创建start_http_server.bat文件,双击运行。
@echo off
echo 正在获取本机 IP 地址...
for /f "tokens=2 delims=:" %%I in ('ipconfig ^| findstr /R /C:"IPv4"') do set ip=%%I
set ip=%ip: =%
echo 本机 IP 地址为:%ip%
echo 请输入要共享的文件夹路径:
set /p folder="文件夹路径:"
cd /d %folder%
echo 启动 HTTP 服务器在端口 8081 上,请访问地址获取文件: http://%ip%:8081...
python -m http.server 8081
pause

  1. 如果操作系统是MAC系统,可以创建start_http_server.sh文件
echo "正在获取本机 IP 地址..."
ip=$(ipconfig getifaddr en0)
echo "本机 IP 地址为:$ip"

echo "请输入要共享的文件夹路径:"
read folder

echo "启动 HTTP 服务器在端口 8081 上,请访问地址获取文件: http://$ip:8081..."
python3 -m http.server 8081 --directory "$folder"

定位到start_http_server.sh所属文件夹,在当前文件夹打开终端窗口,执行以下命令即可:

sudo ./start_http_server.sh

步骤 2:配置 Ngrok

Ngrok 帐户被限制为同时只能运行一个 Ngrok 代理会话。会报以下错误"Your account is limited to 1 simultaneous ngrok agent sessions" 。

image.png

如果你已经有一个 Ngrok 会话正在运行(如文章前面创建的本地服务),需要先终止它,或者你可以在一个代理会话中运行多个隧道。以下是如何解决这个问题的方法:

创建 Ngrok 配置文件

  1. 打开 ngrok.yml 文件:

    notepad %USERPROFILE%\AppData\Local\ngrok\ngrok.yml
    
  2. ngrok.yml 文件中添加以下内容并保存:

    authtoken: YOUR_AUTH_TOKEN
    tunnels:
      mytunnel1:
        proto: http
        addr: 8080
      mytunnel2:
        proto: http
        addr: 8081
    

    请将 YOUR_AUTH_TOKEN 替换为你的 Ngrok 认证令牌。这里配置了2个隧道分别为mytunnel1mytunnel2,他们的addr对应的是2台本地服务器的端口号。

启动 Ngrok 隧道

  1. 如果存在ngrok会话,关闭当前正在运行的 ngrok 会话。

image.png

  1. 导航到 ngrok.exe 所在的目录,然后运行以下命令启动所有隧道:

    ngrok start --all
    
  2. 启动成功后,能看到2台映射成功的公网IP地址:

image.png

步骤 4:公网访问你的文件夹

  1. 拷贝输出台中的 https://xxxxx.ngrok.free.app 的 URL,这就是你的本地服务在公网上的访问地址。 在浏览器中打开这个 URL,即可访问本地服务和下载文件。

注意事项

  1. 安全
  • 确保暴露的服务是安全的,因为任何人都可以通过公网地址访问你的服务!!!
  • 可以在 Ngrok 仪表盘中配置访问控制和其他安全设置。
  1. 带宽和速率限制
  • 免费版本的 Ngrok 有一定的带宽和速率限制,如果需要更高的性能,可以考虑付费版本。