通过 AICoder 访问智算云平台内网推理服务
在智算云平台上,AIStudio 推理服务(通常是 API 服务)目前仅提供内网环境访问地址,无法方便地直接从外部网络访问。在开发测试过程中,我们可以利用智算云平台提供的另一个开发工具 —— AICoder。AICoder 可以作为代理,让我们访问这些内网的 API 服务。本文将介绍如何获取 AICoder 的 SSH 连接信息,以及两种使用 SSH 访问内网 API 服务的方法:动态端口转发(-D)和本地端口转发(-L)。
获取 AICoder 的 SSH 远程连接信息
首先,我们需要获取 AICoder 实例的 SSH 连接信息。
登录智算云平台,在顶部导航栏打开 AICoder Shell。
在窗口右上角点击密钥按钮,获取 SSH 连接命令。你需要从中获取 SSH 跳板机地址、用户名和 AICoder 实例 ID。
例如,用户 Jane Doe 的 SSH 连接命令可能是:
ssh -J ssh-jumper.cloud.infini-ai.com root@aic-c8lkg5b88mieqw6b
例如,用户 Jane Doe 需要从 SSH 连接命令获取以下信息:
- SSH 登录用户名和 AICoder 实例 ID:
root@aic-c8lkg5b88mieqw6b
。root
为默认 SSH 登录用户名(部分旧版实例展示为非 root 普通用户名,请重启)。AICoder ID 需要替换为实际值。 - SSH 跳板机地址:
ssh-jumper.cloud.infini-ai.com
。跳板机是固定的,无需修改。
NOTE
在继续之前,请确保你可以成功通过 SSH 远程登录 AICoder 实例。如需帮助,请参考教程使用 AICoder Shell。
方法一:使用 SSH 动态端口转发(-D)
SSH 动态端口转发创建一个 SOCKS 代理,允许你通过 SSH 连接访问远程网络中的多个服务。
ssh -D 8080 -N -f -J ssh-jumper.cloud.infini-ai.com root@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:
curl --proxy socks5h://127.0.0.1:8080 http://if-c5rtarcgs3im4msk-service:80
或者,你可以在使用 curl 之前设置环境变量:
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 推理服务。
ssh -L 8080:if-c7rtarcgs5im6msk-service:80 -N -f -J ssh-jumper.cloud.infini-ai.com root@aic-c8lkg5b88mieqw6b
命令说明:
-L 8080:if-c7rtarcgs5im6msk-service:80
:将本地 8080 端口转发到远程服务的 80 端口(指定需要代理的 AIStudio 推理服务地址)-N
:不执行远程命令,仅用于转发-f
:在后台运行 SSH-J
:指定跳板机,请使用固定地址:ssh-jumper.cloud.infini-ai.com
测试代理连接:
例如,使用 curl 通过本地端口访问 API:
curl http://localhost:8080
关闭 SSH 连接
当你完成工作后,可以使用以下命令关闭 SSH 连接:
pkill -f "ssh -L 8080"
或者对于动态端口转发:
pkill -f "ssh -D 8080"
两种方法的比较
动态端口转发(-D):
- 优点:灵活性高,可访问多个服务
- 缺点:需要配置应用程序使用 SOCKS 代理,可能需要额外的主机名解析设置
本地端口转发(-L):
- 优点:配置简单,直接访问本地端口即可
- 缺点:每个服务需要单独配置转发规则
对于 HTTP GUI 服务:
- 动态端口转发需要配置浏览器使用 SOCKS 代理
- 本地端口转发可直接在浏览器中访问本地端口
选择哪种方法取决于你的具体需求和使用场景。如果需要访问多个服务,动态端口转发更为合适;如果只需访问单个服务,本地端口转发可能更加便捷。无论选择哪种方法,记得在完成工作后使用 pkill
命令关闭 SSH 连接,以确保安全性。
使用其他工具测试代理连接
除了 curl,你还可以使用其他工具来测试代理连接。以下是一些常见工具的使用方法:
Python Requests 库
使用 Python 的 requests
库和 socks
库来配置 SOCKS5 代理:
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 代理:
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 代理访问服务:
wget --execute="use_proxy = on" --execute="socks_proxy = socks5h://localhost:8080" http://if-c5rtarcgs3im4msk-service:80
使用环境变量
某些工具可以通过环境变量配置代理。设置 ALL_PROXY
环境变量:
export ALL_PROXY=socks5h://localhost:8080
设置后,许多支持代理的工具将自动使用这个配置。
注意事项
确保使用
socks5h
而不是socks5
,以确保主机名在远程解析,避免出现 "Could not resolve host" 错误。对于不同的工具,可能需要特定的配置来确保 DNS 查询通过 SOCKS5 代理进行。请查阅相应工具的文档以获取详细信息。
在使用这些工具时,请确保你已经按照前面的步骤设置了 SSH 动态端口转发或本地端口转发。
通过使用这些不同的工具,你可以更全面地测试和利用通过 SSH 建立的代理连接,以访问内网 API 服务。选择最适合你开发环境和需求的工具,以提高工作效率。