快速掌握 SSH 端口转发

使用 SSH 端口转发搭建隧道,助力远程办公。

概述

ssh 是我们平时连接远程服务器必不可少的的工具,实际上,SSH 还同时提供了一个非常有用的功能,这就是端口转发。

将其他 TCP 端口的网络数据通过 SSH 链接来转发,这一过程有时也被叫做 隧道(tunneling)

转发的类型有 3 种,对应到 3 个选项,分别是:

  • -L:Local,即本地端口转发
  • -R:Romote,即远程端口转发
  • -D:Dynamic,即动态端口转发

因为动态端口转发形式实际上是一种代理服务,和前面两种差别较大,所以本文暂不讨论。

在平常的工作中,难免遇到两个网络不能互相访问,特别是现在远程工作的情况下,这时候 SSH 端口转发就能帮上忙了。

不过这中间涉及到多个服务器之间的连接,关系很容易绕晕,本文做一个简单的总结,帮助大家快速理解。

本地端口转发

基本命令:

ssh -L [本地IP]:本地端口:目标主机:目标端口 SSH服务器
  1. 本地指的是 SSH 客户端,即执行这个 ssh 命令的机器
  2. 本地 IP 省略时,默认绑定到 127.0.0.1
  3. 指定本地 IP 时,必须是本地已存在的地址
  4. 目标主机可以是主机名,也可以是 IP
  5. SSH 服务器是转发方
  6. 如果目标主机是主机名,要求 SSH 服务器 能够解析

示例:

ssh -L 8000:localhost:8080 remote

解释:

remote 上面的 8080 端口,通过本地的 8000 端口访问,这里的 localhost 指的是 remote 本地。

SSH本地端口转发

远程端口转发

基本命令:

ssh -R [远程IP]:远程端口:目标主机:目标端口 SSH服务器
  1. 远程指的是 SSH 服务器
  2. 远程 IP 省略时,默认绑定到 127.0.0.1
  3. 要指定远程 IP 需要 SSH 服务器端开启 GatewayPorts 选项
  4. 目标主机可以是主机名,也可以是 IP
  5. SSH 客户端是转发方
  6. 如果目标主机是主机名,要求 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 客户端: 发起 ssh 连接的机器
  • 目标:提供 TCP 服务的服务器
  • 用户:要访问 TCP 服务的机器
  • 转发方:转发 TCP 的机器

在两种不同的端口转发形式下,每个机器有不同的作用,看图更直接点:

  • 本地端口,远程转发,用来访问远程的服务

SSH本地端口2

  • 远程端口,本地转发,用来暴露本地的服务

SSH远程端口2

注意事项

加了端口转发选项的 SSH 连接也和普通 SSH 连接差不多,如果不想出现命令 shell,可以加如下选项:

  • -N:只建立连接,不执行命令
  • -f:建立成功后在后台运行

端口转发是基于 SSH 连接的基础上,所以这期间要一直保持 SSH 会话不中断。在 Linux 系统中可以安装 autossh 解决。

Windows 系统下使用的 SSH 客户端(比如 XShell)一般都有端口转发的配置, 原理都是一样的。

xshell-ssh转发

建立连接的时候需要服务器的用户和密码,如果想让服务器只用作跳板隧道使用,可以建立受限用户,这样就可以放心的让别人使用,保证 SSH 服务器的安全。


文章内容虽基础,整理发布不轻松

如果看过有帮助,不妨 点赞 + 关注,谢谢!

Davy
Davy
学习📚 技术👨‍💻 投资📈

一些心得体会,希望能对你有所帮助🚀。