快速掌握 SSH 端口转发
使用 SSH 端口转发搭建隧道,助力远程办公。
概述
ssh
是我们平时连接远程服务器必不可少的的工具,实际上,SSH
还同时提供了一个非常有用的功能,这就是端口转发。
将其他 TCP
端口的网络数据通过 SSH
链接来转发,这一过程有时也被叫做 隧道(tunneling)。
转发的类型有 3 种,对应到 3 个选项,分别是:
-L
:Local,即本地端口转发-R
:Romote,即远程端口转发-D
:Dynamic,即动态端口转发
因为动态端口转发形式实际上是一种代理服务,和前面两种差别较大,所以本文暂不讨论。
在平常的工作中,难免遇到两个网络不能互相访问,特别是现在远程工作的情况下,这时候 SSH 端口转发就能帮上忙了。
不过这中间涉及到多个服务器之间的连接,关系很容易绕晕,本文做一个简单的总结,帮助大家快速理解。
本地端口转发
基本命令:
ssh -L [本地IP]:本地端口:目标主机:目标端口 SSH服务器
- 本地指的是 SSH 客户端,即执行这个 ssh 命令的机器
- 本地 IP 省略时,默认绑定到
127.0.0.1
- 指定本地 IP 时,必须是本地已存在的地址
- 目标主机可以是主机名,也可以是 IP
- SSH 服务器是转发方
- 如果目标主机是主机名,要求 SSH 服务器 能够解析
示例:
ssh -L 8000:localhost:8080 remote
解释:
把 remote
上面的 8080
端口,通过本地的 8000
端口访问,这里的 localhost
指的是 remote
本地。
远程端口转发
基本命令:
ssh -R [远程IP]:远程端口:目标主机:目标端口 SSH服务器
- 远程指的是 SSH 服务器
- 远程 IP 省略时,默认绑定到
127.0.0.1
- 要指定远程 IP 需要 SSH 服务器端开启
GatewayPorts
选项 - 目标主机可以是主机名,也可以是 IP
- SSH 客户端是转发方
- 如果目标主机是主机名,要求 SSH 客户端 能够解析
示例:
ssh -R 8000:localhost:8080 remote
解释:
在 remote
上面启动 8000
端口,可以访问到本地的 8080
端口,这里的 localhost
指的是 SSH 客户端 本地。
备注:
出于安全考虑,如果 SSH 服务器 没有开启允许 GatewayPorts
选项,则即使指定了 远程 IP,也仍然只会绑定到 127.0.0.1
.
在 /etc/ssh/sshd_config
配置文件中找到 GatewayPorts
,设置为 yes
,并重启 sshd
服务。
总结
每个机器按照功能来说可以分为几种角色:
- SSH 服务器
- SSH 客户端: 发起 ssh 连接的机器
- 目标:提供 TCP 服务的服务器
- 用户:要访问 TCP 服务的机器
- 转发方:转发 TCP 的机器
在两种不同的端口转发形式下,每个机器有不同的作用,看图更直接点:
- 本地端口,远程转发,用来访问远程的服务
- 远程端口,本地转发,用来暴露本地的服务
注意事项
加了端口转发选项的 SSH 连接也和普通 SSH 连接差不多,如果不想出现命令 shell,可以加如下选项:
- -N:只建立连接,不执行命令
- -f:建立成功后在后台运行
端口转发是基于 SSH 连接的基础上,所以这期间要一直保持 SSH 会话不中断。在 Linux 系统中可以安装 autossh
解决。
Windows 系统下使用的 SSH 客户端(比如 XShell
)一般都有端口转发的配置, 原理都是一样的。
建立连接的时候需要服务器的用户和密码,如果想让服务器只用作跳板隧道使用,可以建立受限用户,这样就可以放心的让别人使用,保证 SSH 服务器的安全。
文章内容虽基础,整理发布不轻松
如果看过有帮助,不妨 点赞 + 关注,谢谢!