通过 SSH 端口转发访问开发机内 HTTP 服务
在使用云平台时,我们常常会遇到需要访问云服务器上运行的服务的情况,但这些服务往往只监听了内网地址,无法直接从公网访问。这时,我们可以利用 SSH 端口转发功能,将云服务器内网端口映射到本地电脑,从而实现访问。
端口转发有三种使用方法:动态转发,本地转发,远程转发。下面仅介绍本地转发。
SSH 本地端口转发
本地转发(local forwarding)指的是,创建一个本地端口,将发往该端口的所有通信都通过 SSH 服务器,转发到指定的远程服务器的端口。这种情况下,SSH 服务器只是一个作为跳板的中介,用于连接本地计算机无法直接连接的远程服务器。本地转发是在本地计算机建立的转发规则。
语法如下,其中会指定本地端口(local-port)、SSH 服务器(tunnel-host)、远程服务器(target-host)和远程端口(target-port)。
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>
端口:
步骤:
在开发机中启动服务,并监听本地端口:
确保你的服务在容器开发机内部可以正常访问。例如,你可以将服务监听在
127.0.0.1:8000
地址上。bash# 示例:启动一个简单的 Python Web 服务 python3 -m http.server 8000 --bind 127.0.0.1
在本地电脑上使用 SSH 本地端口映射:
bashssh -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
端口,则命令为:bashssh -N -f -L 5000:127.0.0.1:8000 -p 45560 root@8.140.242.203
测试服务。成功建立 SSH 隧道后,你就可以在本地电脑上通过
http://localhost:<local-port>
访问容器开发机上的服务了。例如,在上面的例子中,你可以在浏览器中访问
http://localhost:5000
来访问运行在容器开发机上的服务。shellcurl http://localhost:5000
NOTE
本地端口转发采用 HTTP 协议,不用转成 SOCKS5 协议。
终止 SSH 端口转发
当你不再需要访问开发机内的服务时,应该终止 SSH 端口转发连接。可通过以下步骤完成:
找到 SSH
bashps aux | grep "ssh -N -f -L"
你会看到类似这样的输出:
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
记下进程 ID(PID),这里是 1234。
终止该进程:
bashkill 1234
替换 1234 为你在第 2 步中看到的实际 PID。
通过这些步骤,你可以安全地关闭 SSH 端口转发连接。
注意事项
- 使用 SSH 端口映射需要你的本地电脑和容器开发机之间网络畅通。
参考资料
- SSH 命令的三种代理功能(-L/-R/-D)
- 阮一峰 SSH 教程:SSH 端口转发