GenStudio 全新上架 ComfyUI 工作流托管服务GenStudio 全新上架 ComfyUI 工作流托管服务 ,已适配主流 ckpt 模型与节点了解更多
Skip to content
回到全部文章

通过 AICoder 访问智算云平台内网推理服务

在智算云平台上,AIStudio 推理服务(通常是 API 服务)目前仅提供内网环境访问地址,无法方便地直接从外部网络访问。在开发测试过程中,我们可以利用智算云平台提供的另一个开发工具 —— AICoder。AICoder 可以作为代理,让我们访问这些内网的 API 服务。本文将介绍如何获取 AICoder 的 SSH 连接信息,以及两种使用 SSH 访问内网 API 服务的方法:动态端口转发(-D)和本地端口转发(-L)。

获取 AICoder 的 SSH 远程连接信息

首先,我们需要获取 AICoder 实例的 SSH 连接信息。

  1. 登录智算云平台,在顶部导航栏打开 AICoder Shell。

  2. 在窗口右上角点击密钥按钮,获取 SSH 连接命令。你需要从中获取 SSH 跳板机地址、用户名和 AICoder 实例 ID。

    alt text

例如,用户 Jane Doe 的 SSH 连接命令可能是:

bash
ssh -J ssh-jumper.cloud.infini-ai.com janedoe@aic-c8lkg5b88mieqw6b

例如,用户 Jane Doe 需要从 SSH 连接命令获取以下信息:

  • 用户 Jane Doe 的用户名和 AICoder 实例 ID:janedoe@aic-c8lkg5b88mieqw6b。你需要替换为自己的信息。
  • SSH 跳板机地址:ssh-jumper.cloud.infini-ai.com。跳板机是固定的,无需修改。

NOTE

在继续之前,请确保你可以成功通过 SSH 远程登录 AICoder 实例。如需帮助,请参考教程使用 AICoder Shell

方法一:使用 SSH 动态端口转发(-D)

SSH 动态端口转发创建一个 SOCKS 代理,允许你通过 SSH 连接访问远程网络中的多个服务。

bash
ssh -D 8080 -N -f -J ssh-jumper.cloud.infini-ai.com janedoe@aic-c8lkg5b88mieqw6b

命令说明:

  • -D 8080:在本地创建一个 SOCKS 代理,监听 8080 端口
  • -N:不执行远程命令,仅用于转发
  • -f:在后台运行 SSH
  • -J:指定跳板机,请使用固定地址:ssh-jumper.cloud.infini-ai.com

测试代理连接:

例如,AIStudio 推理服务的内网地址为 http://if-c5rtarcgs3im4msk-service:80。使用 curl 通过 SOCKS 代理访问 API:

bash
curl --proxy socks5h://127.0.0.1:8080 http://if-c5rtarcgs3im4msk-service:80

或者,你可以在使用 curl 之前设置环境变量:

bash
export http_proxy=socks5h://127.0.0.1:8080
export https_proxy=socks5h://127.0.0.1:8080
curl http://if-c5rtarcgs3im4msk-service:80

WARNING

在使用 SSH -D 方式时,使用 socks5h 而不是 socks5 可以确保主机名在远程解析,避免出现 "Could not resolve host" 错误。

方法二:使用 SSH 本地端口转发(-L)

SSH 本地端口转发将本地端口映射到远程服务器上的特定端口。与上面的方案不同,我们将设置代理的命令中直接指定需要 AICoder 代理访问的 AIStudio 推理服务。

bash
ssh -L 8080:if-c7rtarcgs5im6msk-service:80 -N -f -J ssh-jumper.cloud.infini-ai.com janedoe@aic-c8lkg5b88mieqw6b

命令说明:

  • -L 8080:if-c7rtarcgs5im6msk-service:80:将本地 8080 端口转发到远程服务的 80 端口(指定需要代理的 AIStudio 推理服务地址)
  • -N:不执行远程命令,仅用于转发
  • -f:在后台运行 SSH
  • -J:指定跳板机,请使用固定地址:ssh-jumper.cloud.infini-ai.com

测试代理连接:

例如,使用 curl 通过本地端口访问 API:

bash
curl http://localhost:8080

关闭 SSH 连接

当你完成工作后,可以使用以下命令关闭 SSH 连接:

bash
pkill -f "ssh -L 8080"

或者对于动态端口转发:

bash
pkill -f "ssh -D 8080"

两种方法的比较

  1. 动态端口转发(-D):

    • 优点:灵活性高,可访问多个服务
    • 缺点:需要配置应用程序使用 SOCKS 代理,可能需要额外的主机名解析设置
  2. 本地端口转发(-L):

    • 优点:配置简单,直接访问本地端口即可
    • 缺点:每个服务需要单独配置转发规则

对于 HTTP GUI 服务:

  • 动态端口转发需要配置浏览器使用 SOCKS 代理
  • 本地端口转发可直接在浏览器中访问本地端口

选择哪种方法取决于你的具体需求和使用场景。如果需要访问多个服务,动态端口转发更为合适;如果只需访问单个服务,本地端口转发可能更加便捷。无论选择哪种方法,记得在完成工作后使用 pkill 命令关闭 SSH 连接,以确保安全性。

使用其他工具测试代理连接

除了 curl,你还可以使用其他工具来测试代理连接。以下是一些常见工具的使用方法:

Python Requests 库

使用 Python 的 requests 库和 socks 库来配置 SOCKS5 代理:

python
import requests
import socks
import socket

# 设置 SOCKS5 代理
socks.set_default_proxy(socks.SOCKS5, "localhost", 8080)
socket.socket = socks.socksocket

# 发送请求
response = requests.get("http://if-c5rtarcgs3im4msk-service:80")
print(response.text)

Node.js 的 Axios 库

使用 Node.js 的 axios 库和 socks-proxy-agent 库配置 SOCKS5 代理:

javascript
const axios = require('axios');
const SocksProxyAgent = require('socks-proxy-agent');

// 创建 SOCKS5 代理代理实例
const agent = new SocksProxyAgent('socks5h://localhost:8080');

// 发送请求
axios.get('http://if-c5rtarcgs3im4msk-service:80', { httpAgent: agent })
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });

Wget

使用 wget 通过 SOCKS5 代理访问服务:

sh
wget --execute="use_proxy = on" --execute="socks_proxy = socks5h://localhost:8080" http://if-c5rtarcgs3im4msk-service:80

使用环境变量

某些工具可以通过环境变量配置代理。设置 ALL_PROXY 环境变量:

sh
export ALL_PROXY=socks5h://localhost:8080

设置后,许多支持代理的工具将自动使用这个配置。

注意事项

  1. 确保使用 socks5h 而不是 socks5,以确保主机名在远程解析,避免出现 "Could not resolve host" 错误。

  2. 对于不同的工具,可能需要特定的配置来确保 DNS 查询通过 SOCKS5 代理进行。请查阅相应工具的文档以获取详细信息。

  3. 在使用这些工具时,请确保你已经按照前面的步骤设置了 SSH 动态端口转发或本地端口转发。

通过使用这些不同的工具,你可以更全面地测试和利用通过 SSH 建立的代理连接,以访问内网 API 服务。选择最适合你开发环境和需求的工具,以提高工作效率。