Skip to content

Ngrok是什么

标签
PenTest
渗透测试
ngrok
反向代理
发布时间
3 天前
字数
667 字
阅读时间
4 分钟

Ngrok 是一款反向代理工具,主要作用是将本地运行的服务暴露到公共互联网上(如:内网穿透),实现外网可访问,在网络开发、测试及安全领域应用广泛。

Login Official Web

注册你自己的账号并登录官网后才能看到你的ngrok token

Install

ref: https://dashboard.ngrok.com/get-started/setup/macos 登录后在这个页面可以看到你自己的ngrok token

shell
brew install ngrok

安装完成后检查命令:

ngrok -v
ngrok version 3.21.0

Config Token

shell
# 检查ngrok配置
ngrok config check

默认配置文件ngrok.yml的位置:

  • Linux: ~/.config/ngrok/ngrok.yml
  • MacOS (Darwin): ~/Library/Application Support/ngrok/ngrok.yml
  • Windows: "%HOMEPATH%\AppData\Local\ngrok\ngrok.yml"

如果没有ngrok配置文件或未配置ngrok token,则执行命令:

shell
ngrok config add-authtoken 2......z # your ngrok token

# 执行成功的话会提示
Authtoken saved to configuration file: /Users/seccodecat/Library/Application Support/ngrok/ngrok.yml

# 完成后再检查
ngrok config check

Valid configuration file at /Users/seccodecat/Library/Application Support/ngrok/ngrok.yml

ngrok.yml的内容(可能会随更新发生变化)

yml
version: "3"
agent:
    authtoken: 2.....z    // your ngrok token

Deploy App Oline

首先我本地8000端口启动一个web服务,比如:

cd ~/Development/git_repo/nolebase-template/.vitepress/dist
python3 -m http.server

Serving HTTP on :: port 8000 (http://[::]:8000/) ...

这样能在本地8000端口启动一个静态web

但这个localhost:8000的服务目前只有本地和局域网内用户可以访问,无法通过公网访问。 这时使用ngrok就可以将该服务暴露到公网上。

执行命令:ngrok http http://localhost:8000

此时,你开手机或者其他终端(可以用流量保证离开局域网环境),通过访问URL:https://5d94-175-153-161-223.ngrok-free.app 即可访问本地服务。

如果此时你停掉本地服务,再访问这个随机地址,会看到ngrok的报错页面。

p.s. 个人觉得临时公网开放服务可以用一下,要是要做完整演示,最好还是正常服务器配置。

SDK use guide

为了方便将 ngrok ingress 作为套接字直接嵌入到您的应用程序中,可以使用ngrok的SDK。 支持语言:Go NodeJS Rust Python Java Ruby .Net

Go SDK example

go
package main  
  
import (  
    "context"  
    "fmt"    
    "log"    
    "net/http"  
    "golang.ngrok.com/ngrok"
    "golang.ngrok.com/ngrok/config"
    )  
  
/*  
install lib: go get golang.ngrok.com/ngrok  
run:  
NGROK_AUTHTOKEN=your_ngrok_token go run ngrokdemo.go  
Ingress established at: https://cc51-153-101-64-87.ngrok-free.app  
test:  
curl https://cc51-153-101-64-87.ngrok-free.app  
Hello from ngrok-go ,it works!  
*/  
  
func main() {  
    if err := run(context.Background()); err != nil {  
       log.Fatal(err)  
    }  
}  
  
func run(ctx context.Context) error {  
    listener, err := ngrok.Listen(ctx,  
       config.HTTPEndpoint(),  
       ngrok.WithAuthtokenFromEnv(),  
    )  
    if err != nil {  
       return err  
    }  
  
    log.Println("Ingress established at:", listener.URL())  
  
    return http.Serve(listener, http.HandlerFunc(handler))  
}  
  
func handler(w http.ResponseWriter, r *http.Request) {  
    fmt.Fprintln(w, "Hello from ngrok-go ,it works!")  
}

测试效果:

shell
curl https://cc51-153-101-64-87.ngrok-free.app
Hello from ngrok-go ,it works!