pgrok - Poor man's ngrok - 通过SSH远程端口转发的多租户HTTP反向隧道解决方案

Created at: 2023-03-08 20:43:55
Language: Go
License: MIT

pgrok - 穷人的 ngrok

源图

什么?

pgrok 是一种多租户 HTTP 反向隧道解决方案,通过从 SSH 协议进行远程端口转发。

这适用于需要将本地开发环境公开给公共 Internet 的小型团队,并且你需要自带域名和 SSO 提供程序。

它为每个用户提供稳定的子域,并通过 OIDC 协议由你的 SSO 进行门控。

可以将其视为 ngrok 的 65 美元/用户/月企业层的基本替代方案。想将其置于生产系统后面会破坏你的 SLA。

对于个人和生产系统,只需购买ngrok,它仍然是我的最爱。

为什么?

稳定的子域和SSO是两件太昂贵的事情。

为什么不从 awesome 隧道中选择一个呢?放宽视野。不是每个人都是了解服务器操作的开发人员。对于担任社区经理、销售和项目经理的人来说,在本地启动一些东西可能已经是一个延伸,要求他们了解如何设置和修复服务器问题是浪费团队的生产力。

复制、粘贴和运行是每个人的最佳用户体验。

如何?

在开始之前,请确保你具备以下各项:

  1. 域名(例如,这将在本节中用作示例)。
    pgrok.dev
  2. 具有公共 IP 地址的服务器(专用服务器,VPS)(例如 )。
    111.33.5.14
  3. 一个SSO提供程序(例如Google,Okta,Keycloak),允许你创建OIDC客户端。
  4. PostgreSQL服务器(bit.io,Cloud SQL,自托管)。

注意

Web 和代理服务器的 HTTPS 不是必需的,但建议尽可能使用。本节中的示例都使用 HTTP。

设置服务器 (
pgrokd
)

  1. 为你的域名添加以下 DNS 记录:
    1. A
      记录到
      pgrok.dev
      111.33.5.14
    2. A
      记录到
      *.pgrok.dev
      111.33.5.14
  2. 创建一个文件:
    pgrokd.yml
    external_url: "http://pgrok.dev"
    web:
      port: 3320
    proxy:
      port: 3000
      scheme: "http"
      domain: "pgrok.dev"
    sshd:
      port: 2222
    
    database:
      host: "localhost"
      port: 5432
      user: "REDACTED"
      password: "REDACTED"
      database: "pgrokd"
    
    identity_provider:
      type: "oidc"
      display_name: "Google"
      issuer: "https://accounts.google.com"
      client_id: "REDACTED"
      client_secret: "REDACTED"
      field_mapping:
        identifier: "email"
        display_name: "name"
        email: "email"
    #  # The required domain name, "field_mapping.email" is required to set for this to work.
    #  required_domain: "example.com"
  3. “版本”页面下载最新版本的存档。
    pgrokd
  4. 在后台启动(systemd,屏幕,nohup)。
    pgrokd
    1. 默认情况下,期望 在工作目录中可用。使用 flag 为配置文件指定不同的路径。
      pgrokd
      pgrokd.yml
      --config
  5. 更改网络安全策略(如果适用),以允许从(任何位置)向端口 2222 发送入站请求。
    0.0.0.0/0
  6. 在你的服务器上下载并安装 Caddy 2,并使用以下 Caddyfile 配置:
    http://pgrok.dev {
        reverse_proxy * localhost:3320
    }
    
    http://*.pgrok.dev {
        reverse_proxy * localhost:3000
    }
    
  7. 在 SSO 中创建一个新的 OIDC 客户端,重定向 URI 为 。
    http://pgrok.dev/-/oidc/callback

设置客户端 (
pgrok
)

  1. 转到 http://pgrok.dev,使用 SSO 进行身份验证以获取令牌和 URL(例如 )。
    http://unknwon.pgrok.dev
  2. 下载最新版本的:
    pgrok
    1. 对于自制软件:
      brew install pgrok/tap/pgrok
    2. 对于其他人,请从“版本”页面下载存档。
  3. 使用以下命令初始化文件(假设要将请求转发到 ):
    pgrok.yml
    http://localhost:3000
    pgrok init --remote-addr pgrok.dev:2222 --forward-addr http://localhost:3000 --token {YOUR_TOKEN}
    默认情况下,配置文件在主目录 () 下创建。使用 flag 为配置文件指定不同的路径。
    ~/.pgrok/pgrok.yml
    --config
  4. 通过执行 or 命令启动客户端。
    pgrok
    pgrok http
    1. 默认情况下,期望在主目录 () 下可用。使用 flag 为配置文件指定不同的路径。
      pgrok
      pgrok.yml
      ~/.pgrok/pgrok.yml
      --config
    2. 使用该标志打开调试日志记录。
      --debug
    3. 成功启动后,你应该会看到如下所示的日志:
      YYYY-MM-DD 12:34:56 INFO Tunneling connection established remote=pgrok.dev:2222
  5. 现在访问网址。

覆盖配置选项

以下配置选项可以通过 CLI 标志覆盖:

  • --remote-addr
    ->
    remote_addr
  • --forward-addr
    ->
    forward_addr
  • --token
    ->
    token

作为特例,的第一个参数可用于指定转发地址,例如

pgrok http

pgrok http 8080

动态前锋

除了传统的请求转发到单个地址外,还可以配置具有动态转发规则。

pgrok

例如,如果本地前端在 上运行,但某些 gRPC 终结点需要直接在 与后端通信:

http://localhost:3000
http://localhost:8080

dynamic_forwards: |
  /api http://localhost:8080
  /hook http://localhost:8080

然后,所有以路径为前缀的请求都将转发到 (),其余所有请求都将转发到 ()。

/api
/hook
http://localhost:8080
forward_addr
http://localhost:3000

Vanilla SSH

由于标准 SSH 协议用于隧道,因此你很可能只使用原版 SSH 客户端。

  1. 转到 http://pgrok.dev,使用 SSO 进行身份验证以获取令牌和 URL(例如 )。
    http://unknwon.pgrok.dev
  2. 通过执行以下命令启动客户端:
    ssh -N -R 0::3000 pgrok.dev -p 2222
    1. 输入令牌作为密码。
    2. 使用该标志打开调试日志记录。
      -v
    3. 成功启动后,你应该会看到如下所示的日志:
      Allocated port 22487 for remote forward to :3000
      
  3. 现在访问网址。

给我解释一下

普格罗克网络图

赞助商

捐赠

许可证

该项目在 MIT 许可下。有关完整的许可证文本,请参阅许可证文件。