如何安全地访问服务器端口:SSH 端口转发教程
当你在服务器上运行一个网络服务(如 TensorBoard、Jupyter Notebook、数据库或一个 Web 应用)时,通常它只在服务器的 localhost 上监听,或者出于安全考虑,你不想将其端口直接暴露在公网上。
SSH 端口转发(也称为 SSH 隧道)是一种非常安全和方便的技术。它能通过一个加密的 SSH 连接,在你自己的电脑和服务器之间建立一条“私密隧道”,将服务器上的某个端口“映射”到你本地电脑上。
优点:
极致安全:所有数据都通过 SSH 加密传输,无需在服务器上开放额外的防火墙端口。操作简单:一条命令即可建立连接。应用广泛:适用于任何基于 TCP 的网络服务。
准备工作
在开始之前,请确保你拥有以下信息:
服务器的 IP 地址:例如 36.213.71.201服务器的 SSH 端口号:如果是默认的 22 则无需特别指定,如果是其他端口比如 30734,则需要指定。服务器的登录用户名:例如 root服务器的登录密码或密钥目标服务的端口号:你想要在服务器上访问的那个服务的端口,例如 TensorBoard 的 6006。
命令详解
SSH 端口转发的核心命令结构如下:
ssh -L [本地端口]:[目标地址]:[目标端口] [用户名]@[服务器IP] -p [服务器SSH端口]
我们来分解一下这个命令的含义:
-L:是 Local 的缩写,表示这是一条本地端口转发规则。[本地端口]:你希望在自己电脑上打开的端口。通常为了方便记忆,我们会让它和目标端口保持一致。例如 6006。[目标地址]:从服务器的角度来看,服务监听的地址。99% 的情况下,这里都应该填写 localhost 或 127.0.0.1。因为服务通常只对服务器本机开放。[目标端口]:服务器上那个正在运行的服务的端口号。例如 6006。[用户名]@[服务器IP]:你用于 SSH 登录的凭据。-p [服务器SSH端口]:(可选) 如果你的服务器 SSH 端口不是默认的 22,才需要用这个参数来指定。
一句话解释整个命令:“通过 SSH 连接到服务器,并把我本地电脑的 [本地端口] 收到的所有请求,安全地转发给服务器上的 [目标地址]:[目标端口]。”
实战演练:访问 TensorBoard
以访问 TensorBoard的场景为例,目标是访问运行在服务器上 6006 端口的 TensorBoard 服务。
1. 打开本地终端
在你自己的 Windows、macOS 或 Linux 电脑上,打开一个命令行终端(例如 Windows Terminal, PowerShell, Terminal App)。
2. 执行连接命令
根据你的信息,输入以下命令并回车:
# 命令格式: ssh -L [本地端口]:localhost:[服务器上的服务端口] [用户名]@[服务器IP] -p [服务器的SSH端口]
ssh -L 6006:localhost:6006 root@36.213.71.201 -p 30734
系统会提示你输入服务器的密码。
3. 保持连接
输入密码后,你会成功登录到服务器,看到类似 (base) root@...:~# 的命令行提示符。
至关重要的一步:保持这个终端窗口不要关闭! 只要这个窗口开着,隧道就是联通的。你可以将它最小化,但不能关闭。
4. 在本地浏览器中访问服务
现在,打开你电脑上的任意浏览器(Chrome, Edge, Firefox等),在地址栏输入:
http://localhost:6006
回车后,你就应该能看到服务器上 TensorBoard 的界面了,就像它运行在你自己的电脑上一样。
如何关闭隧道
当你不再需要访问时,只需要:
切换回刚才那个保持连接的终端窗口。按下 Ctrl + C,或者直接关闭该窗口。
这样 SSH 连接就会断开,端口转发隧道也会随之关闭。此时,你在浏览器中刷新 http://localhost:6006 将会无法访问。
常见问题
执行 SSH 命令时就提示 Connection refused?
这说明你的 SSH 连接信息(IP、用户名或 -p 指定的 SSH 端口)有误,或者服务器的防火墙/安全组没有放行你的 SSH 端口。这与端口转发本身无关,是基础的 SSH 连接问题。
隧道建立成功,但在浏览器里访问 localhost:6006 提示 Connection refused?
这说明你的隧道是通的,但服务器上的 6006 端口没有服务在监听。请登录服务器检查你的 TensorBoard 服务是否真的已经成功启动了。