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 插件支持自动端口转发:
- 连接到远程实例
- 在实例上启动服务(如 TensorBoard)
- VSCode 会自动检测并提示转发端口
- 点击「在浏览器中打开」即可访问
手动配置端口转发
- 按
F1打开命令面板 - 输入
Forward a Port - 输入要转发的端口号
常用服务端口
| 服务 | 默认端口 |
|---|---|
| TensorBoard | 6006 |
| Jupyter Notebook | 8888 |
| JupyterLab | 8888 |
| Gradio | 7860 |
| Streamlit | 8501 |
| Flask | 5000 |
| FastAPI | 8000 |
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@<地址>无法访问服务
- 确认服务在实例上正常运行
- 确认服务监听正确的端口
- 确认服务绑定到
0.0.0.0或localhost - 检查 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