2024-11-21 一站式 AI 平台生日大派对!2024-11-21 一站式 AI 平台生日大派对! 无问芯穹特别推出多项超值福利!立即参与
Skip to content
回到全部文章

通过 SSH 端口转发访问开发机内 HTTP 服务

在使用云平台时,我们常常会遇到需要访问云服务器上运行的服务的情况,但这些服务往往只监听了内网地址,无法直接从公网访问。这时,我们可以利用 SSH 端口转发功能,将云服务器内网端口映射到本地电脑,从而实现访问。

端口转发有三种使用方法:动态转发,本地转发,远程转发。下面仅介绍本地转发。

SSH 本地端口转发

本地转发(local forwarding)指的是,创建一个本地端口,将发往该端口的所有通信都通过 SSH 服务器,转发到指定的远程服务器的端口。这种情况下,SSH 服务器只是一个作为跳板的中介,用于连接本地计算机无法直接连接的远程服务器。本地转发是在本地计算机建立的转发规则。

语法如下,其中会指定本地端口(local-port)、SSH 服务器(tunnel-host)、远程服务器(target-host)和远程端口(target-port)。

bash
ssh -N -f -L local-port:target-host:target-port username@tunnel-host

上面命令中,有三个配置参数。

-L:转发本地端口。

-N:不发送任何命令,只用来建立连接。没有这个参数,会在 SSH 服务器打开一个 Shell。

-f:将 SSH 连接放到后台。没有这个参数,暂时不用 SSH 连接时,终端会失去响应。

举例来说,目标服务 target-host 是您在开发机内部运行的一个 HTTP 服务,希望可以从公网的某台设备上访问。由于开发机本身提供 SSH 公网访问服务,即可作为 SSH 服务器 tunnel-host(跳板机)。也就是说,我们可以利用 SSH 本地端口转发,实现从公网访问开发机内部的服务。

这种方式不依赖中心服务器,直接实现从公网某个终端设备访问容器内部的服务。

使用 SSH 本地端口转发

适用场景: 适合用于演示、测试等临时性场景,例如,你想从自己的电脑上向其他人演示运行在容器开发机上的服务。

假设您在智算云平台有一台开发机,IP 地址为 <tunnel-host>,用户名为 <username>,SSH 端口为 <ssh-port>

开发机上运行着您的目标服务,监听在 <target-port>(一般为 127.0.0.1)的 <target-port> 端口。

我们可以进行以下实验,使用 SSH 本地端口转发将该服务映射到本地电脑的 <local-port> 端口:

步骤:

  1. 在开发机中启动服务,并监听本地端口:

    确保你的服务在容器开发机内部可以正常访问。例如,你可以将服务监听在 127.0.0.1:8000 地址上。

    bash
    # 示例:启动一个简单的 Python Web 服务
    python3 -m http.server 8000 --bind 127.0.0.1
  2. 在本地电脑上使用 SSH 本地端口映射:

    bash
    ssh -N -f -L <local-port>:127.0.0.1:<target-port> -p <ssh-port> <username>@<tunnel-host>

    命令中的占位符需要替换为实际值:

    • <local-port>:在本地设备上访问目标服务时使用的端口号,例如 5000
    • <target-port>:开发机内部 HTTP 服务监听的端口号,例如 8000
    • <ssh-port>:开发机的 SSH 登录端口号。由于智算云平台的开发机不支持使用默认 22 端口,请前往平台查看 SSH 端口号。
    • <username>:开发机用户名。
    • <tunnel-host>:开发机的 IP 地址或域名。

    例如,假设你的开发机地址为 8.140.242.203,用户名为 username,SSH 端口为 45560,服务监听在 127.0.0.1:8000,你想将服务映射到本地电脑的 5000 端口,则命令为:

    bash
    ssh -N -f -L 5000:127.0.0.1:8000 -p 45560 root@8.140.242.203
  3. 测试服务。成功建立 SSH 隧道后,你就可以在本地电脑上通过 http://localhost:<local-port> 访问容器开发机上的服务了。

    例如,在上面的例子中,你可以在浏览器中访问 http://localhost:5000 来访问运行在容器开发机上的服务。

    shell
    curl http://localhost:5000

    NOTE

    本地端口转发采用 HTTP 协议,不用转成 SOCKS5 协议。

终止 SSH 端口转发

当你不再需要访问开发机内的服务时,应该终止 SSH 端口转发连接。可通过以下步骤完成:

  1. 找到 SSH

    bash
    ps aux | grep "ssh -N -f -L"
  2. 你会看到类似这样的输出:

    user    1234  0.0  0.0  42532   784 ?        Ss   10:00   0:00 ssh -N -f -L 5009:127.0.0.1:8089 -p 43500 root@219.135.228.245
  3. 记下进程 ID(PID),这里是 1234。

  4. 终止该进程:

    bash
    kill 1234

    替换 1234 为你在第 2 步中看到的实际 PID。

通过这些步骤,你可以安全地关闭 SSH 端口转发连接。

注意事项

  • 使用 SSH 端口映射需要你的本地电脑和容器开发机之间网络畅通。

参考资料