Skip to content

SSH 隧道

SSH 隧道(SSH Tunnel)可以将远程服务映射到本地端口,方便访问实例上运行的 Web 服务。

应用场景

  • 访问实例上的 TensorBoard
  • 访问实例上的 Jupyter Notebook
  • 访问实例上的 Gradio/Streamlit 应用
  • 访问实例上的数据库服务

基本原理

SSH 隧道通过 SSH 连接建立加密通道,将远程端口转发到本地:

本地浏览器 → 本地端口 → SSH 隧道 → 远程端口 → 远程服务

创建 SSH 隧道

获取 SSH 信息

从控制台复制 SSH 命令,提取地址和端口信息:

bash
# SSH 命令格式
ssh root@<> -p <>
# 示例:ssh root@connect.gpuhome.cc -p 12345

基本语法

bash
ssh -L 本地端口:localhost:远程端口 -p <SSH端> root@<>

参数说明:

参数说明
-L 本地端口:localhost:远程端口将远程端口映射到本地端口
-p <SSH端口>SSH 连接端口(从控制台获取)
root@<地址>用户名和服务器地址

示例:转发 TensorBoard

假设 TensorBoard 在实例的 6006 端口运行,将 <端口><地址> 替换为实际信息:

bash
# 将远程 6006 端口映射到本地 6006 端口
ssh -L 6006:localhost:6006 -p <> root@<>
# 示例:ssh -L 6006:localhost:6006 -p 12345 root@connect.gpuhome.cc

然后在本地浏览器访问 http://localhost:6006

示例:转发 Jupyter

bash
# 将远程 8888 端口映射到本地 8888 端口
ssh -L 8888:localhost:8888 -p <> root@<>
# 示例:ssh -L 8888:localhost:8888 -p 12345 root@connect.gpuhome.cc

示例:转发多个端口

bash
ssh -L 6006:localhost:6006 -L 8888:localhost:8888 -p <> root@<>
# 示例:ssh -L 6006:localhost:6006 -L 8888:localhost:8888 -p 12345 root@connect.gpuhome.cc

后台运行隧道

使用 -f 和 -N 参数

bash
# -f: 后台运行
# -N: 不执行远程命令
ssh -f -N -L 6006:localhost:6006 -p <> root@<>
# 示例:ssh -f -N -L 6006:localhost:6006 -p 12345 root@connect.gpuhome.cc

查看隧道进程

bash
ps aux | grep ssh

关闭隧道

bash
# 找到进程 ID 后终止
kill <PID>

VSCode 中使用隧道

VSCode Remote-SSH 插件支持自动端口转发:

  1. 连接到远程实例
  2. 在实例上启动服务(如 TensorBoard)
  3. VSCode 会自动检测并提示转发端口
  4. 点击「在浏览器中打开」即可访问

手动配置端口转发

  1. F1 打开命令面板
  2. 输入 Forward a Port
  3. 输入要转发的端口号

常用服务端口

服务默认端口
TensorBoard6006
Jupyter Notebook8888
JupyterLab8888
Gradio7860
Streamlit8501
Flask5000
FastAPI8000

SSH 配置文件

可以在 ~/.ssh/config 中预配置隧道(将 <地址><端口> 替换为实际信息):

Host rivermind
    HostName <地址>
    Port <端口>
    User root
    LocalForward 6006 localhost:6006
    LocalForward 8888 localhost:8888

配置后直接连接即可自动建立隧道:

bash
ssh rivermind

常见问题

端口被占用

bash
# 查看端口占用
lsof -i :6006

# 使用其他本地端口(替换 <端口> 和 <地址> 为实际信息)
ssh -L 16006:localhost:6006 -p <> root@<>
# 然后访问 http://localhost:16006

连接断开隧道失效

使用 autossh 自动重连:

bash
# 安装 autossh
# macOS
brew install autossh

# Ubuntu
apt install autossh

# 使用 autossh 建立隧道(替换 <端口> 和 <地址> 为实际信息)
autossh -M 0 -f -N -L 6006:localhost:6006 -p <> root@<>

无法访问服务

  1. 确认服务在实例上正常运行
  2. 确认服务监听正确的端口
  3. 确认服务绑定到 0.0.0.0localhost
  4. 检查 SSH 隧道是否正常建立

服务绑定地址问题

某些服务默认只绑定 127.0.0.1,需要修改为 0.0.0.0

python
# TensorBoard
tensorboard --logdir=./logs --bind_all

# Gradio
demo.launch(server_name="0.0.0.0")

# Streamlit
streamlit run app.py --server.address 0.0.0.0

智算无疆 川流不息