如何设置 SSH 隧道(端口转发)

2023-11-16

SSH 隧道或 SSH 端口转发是一种在客户端和服务器计算机之间创建加密 SSH 连接的方法,通过该连接可以中继服务端口。

SSH 转发对于传输使用未加密协议的服务的网络数据非常有用,例如 VNC 或FTP、访问地理限制的内容或绕过中间防火墙。基本上,您可以转发任何 TCP 端口并通过安全 SSH 连接隧道传输流量。

SSH 端口转发分为三种类型:

  • 本地端口转发。 - 将连接从客户端主机转发到 SSH 服务器主机,然后转发到目标主机端口。
  • 远程端口转发。 - 将端口从服务器主机转发到客户端主机,然后转发到目标主机端口。
  • 动态端口转发。 - 创建允许跨一系列端口进行通信的 SOCKS 代理服务器。

本文介绍如何设置本地、远程和动态加密的 SSH 隧道。

本地端口转发#

本地端口转发允许您将本地(ssh 客户端)计算机上的端口转发到远程(ssh 服务器)计算机上的端口,然后将其转发到目标计算机上的端口。

在此转发类型中,SSH 客户端侦听给定端口,并将到该端口的任何连接通过隧道传输到远程 SSH 服务器上的指定端口,然后远程 SSH 服务器连接到目标计算机上的端口。目标计算机可以是远程 SSH 服务器或任何其他计算机。

本地端口转发主要用于连接到内部网络上的远程服务,例如数据库或VNC服务器。

在 Linux、macOS 和其他 Unix 系统中,要创建本地端口转发,请传递-L的选项ssh client:

ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER

使用的选项如下:

  • [LOCAL_IP:]LOCAL_PORT- 本地计算机的 IP 地址和端口号。什么时候LOCAL_IP省略,ssh 客户端绑定在本地主机上。
  • DESTINATION:DESTINATION_PORT- 目标计算机的 IP 或主机名以及端口。
  • [USER@]SERVER_IP- 远程 SSH 用户和服务器 IP 地址。

您可以使用大于的任何端口号1024 as a LOCAL_PORT。端口数小于1024是特权端口,只能由 root 使用。如果您的 SSH 服务器正在侦听22 以外的端口(默认),使用-p [PORT_NUMBER] option.

目标主机名必须可从 SSH 服务器解析。

假设您的机器上运行着 MySQL 数据库服务器db001.host在内部(专用)网络上的端口 3306 上,可从计算机访问该端口pub001.host,并且您想要使用本地计算机 MySQL 客户端连接到数据库服务器。为此,您可以使用以下命令转发连接:

ssh -L 3336:db001.host:3306 user@pub001.host

运行该命令后,系统将提示您输入远程 SSH 用户密码。输入后,您将登录到远程服务器,并且 SSH 隧道将建立。这也是一个好主意设置基于 SSH 密钥的身份验证并无需输入密码即可连接到服务器。

现在,如果您将本地计算机数据库客户端指向127.0.0.1:3336,连接将被转发到db001.host:3306MySQL 服务器通过pub001.host充当中间服务器的机器。

您可以在单个 ssh 命令中将多个端口转发到多个目标。例如,您的计算机上运行着另一个 MySQL 数据库服务器db002.host,并且您想从本地客户端连接到两台服务器,您可以运行:

ssh -L 3336:db001.host:3306 3337:db002.host:3306 user@pub001.host

要连接到第二个服务器,您可以使用127.0.0.1:3337.

当目的主机与SSH服务器相同时,可以不指定目的主机IP或主机名,而使用localhost.

假设您需要通过 VNC 连接到远程计算机,该计算机运行在同一台服务器上,并且无法从外部访问。您将使用的命令是:

ssh -L 5901:127.0.0.1:5901 -N -f user@remote.host

The -f选项告诉ssh在后台运行的命令和-N不执行远程命令。我们正在使用localhost因为VNC和SSH服务器运行在同一台主机上。

如果您在设置隧道时遇到问题,请检查远程 SSH 服务器配置并确保AllowTcpForwarding未设置为no。默认情况下,允许转发。

远程端口转发#

远程端口转发与本地端口转发相反。它允许您将远程(ssh 服务器)计算机上的端口转发到本地(ssh 客户端)计算机上的端口,然后将其转发到目标计算机上的端口。

在此转发类型中,SSH 服务器侦听给定端口,并将到该端口的任何连接通过隧道传输到本地 SSH 客户端上的指定端口,然后本地 SSH 客户端连接到目标计算机上的端口。目标计算机可以是本地计算机或任何其他计算机。

在Linux、macOS和其他Unix系统中创建远程端口转发,通过-R的选项ssh client:

ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER

使用的选项如下:

  • [REMOTE:]REMOTE_PORT- 远程 SSH 服务器上的 IP 和端口号。一个空的REMOTE意味着远程 SSH 服务器将绑定在所有接口上。
  • DESTINATION:DESTINATION_PORT- 目标计算机的 IP 或主机名以及端口。
  • [USER@]SERVER_IP- 远程 SSH 用户和服务器 IP 地址。

远程端口转发主要用于向外部人员提供对内部服务的访问。

假设您正在本地计算机上开发 Web 应用程序,并且想要向其他开发人员显示预览。您没有公共 IP,因此其他开发人员无法通过 Internet 访问该应用程序。

如果您有权访问远程 SSH 服务器,则可以按如下方式设置远程端口转发:

ssh -R 8080:127.0.0.1:3000 -N -f user@remote.host

上面的命令将使 ssh 服务器监听端口8080,并将所有流量从该端口隧道传输到端口上的本地计算机3000.

现在您的开发人员同事可以输入the_ssh_server_ip:8080在他/她的浏览器中预览您出色的应用程序。

如果您在设置远程端口转发时遇到问题,请确保GatewayPorts被设定为yes在远程 SSH 服务器配置中。

动态端口转发#

动态端口转发允许您在本地(ssh 客户端)计算机上创建套接字,该计算机充当 SOCKS 代理服务器。当客户端连接到此端口时,连接将转发到远程(ssh 服务器)计算机,然后将其转发到目标计算机上的动态端口。

这样,所有使用 SOCKS 代理的应用程序都将连接到 SSH 服务器,并且服务器会将所有流量转发到其实际目的地。

在Linux、macOS和其他Unix系统中创建动态端口转发(SOCKS)通过-D的选项ssh client:

ssh -D [LOCAL_IP:]LOCAL_PORT [USER@]SSH_SERVER

使用的选项如下:

  • [LOCAL_IP:]LOCAL_PORT- 本地计算机的 IP 地址和端口号。什么时候LOCAL_IP省略,ssh 客户端绑定在本地主机上。
  • [USER@]SERVER_IP- 远程 SSH 用户和服务器 IP 地址。

动态端口转发的一个典型示例是通过 SSH 服务器传输 Web 浏览器流量。

以下命令将在端口上创建 SOCKS 隧道9090:

ssh -D 9090 -N -f user@remote.host

建立隧道后,您可以配置应用程序以使用它。本文解释如何配置 Firefox 和 Google Chrome 浏览器以使用 SOCKS 代理。

必须为您想要对流量进行隧道传输的每个应用程序单独配置端口转发。

在 Windows 中设置 SSH 隧道#

Windows 用户可以使用 PuTTY SSH 客户端创建 SSH 隧道。您可以下载 PuTTYhere .

  1. 启动 Putty 并在框中输入 SSH 服务器 IP 地址Host name (or IP address) field.

  2. 在下面Connection菜单,展开SSH并选择Tunnels。检查Local用于设置本地的单选按钮,Remote用于远程,以及Dynamic用于动态端口转发。

    • 设置本地转发时,在“本地转发端口”中输入Source Port场和在Destination输入目标主机和IP,例如localhost:5901.
    • 对于远程端口转发,请在“远程SSH服务器转发端口”中输入Source Port场和在Destination输入目标主机和IP,例如localhost:3000.
    • 如果设置动态转发,则仅在本地 SOCKS 端口中输入Source Port field.
  3. 单击Add按钮,如下图所示。

  4. 返回到Session页面保存设置,这样您就不需要每次都输入它们。在中输入会话名称Saved Session字段并单击Save button.

  5. 选择保存的会话并通过单击登录到远程服务器Open button.

    将显示一个新窗口,询问您的用户名和密码。输入用户名和密码后,您将登录到服务器,并且 SSH 隧道将启动。

    配置公钥认证允许您无需输入密码即可连接到服务器。

结论#

我们向您展示了如何设置 SSH 隧道并通过安全 SSH 连接转发流量。为了便于使用,您可以在您的应用程序中定义 SSH 隧道SSH 配置文件或创建一个Bash 别名这将设置 SSH 隧道。

如果您遇到问题或有反馈,请在下面发表评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何设置 SSH 隧道(端口转发) 的相关文章

  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • JSF - 实施受限页面过滤器

    我正在关注 BalusC 的回答JSF 2 0 如何获取在浏览器地址栏中输入的 URL https stackoverflow com questions 4105263 jsf 2 0 how to get the url that is
  • Java Web Start 的证书已过期

    JWS 对代码签名证书过期有何反应 根据我的观察 它似乎忽略了 CA 签名证书的到期日期 但我想找到一些确凿的证据 例如官方文档 来证实这一点 如果签名的 jar 被赋予时间戳 来自时间戳权威 那么即使在证书过期之后签名仍然有效 假设时间戳
  • 通过 HTTPS 的隧道

    在我的工作场所 流量拦截器 防火墙变得越来越糟糕 我无法通过端口 22 连接到我的家用计算机 并且缺乏 ssh 访问权限让我感到难过 我以前可以通过将 SSH 移动到端口 5050 来使用它 但我认为最近的一些过滤器现在将此流量视为 IM
  • 通过 ssh 发送命令并读取输出结果

    我有代码通过 ssh 连接到远程服务器并向其发送 2 个或更多命令 例如 cd export home ops bin和 viewlinkload time 20131205 19 但我没有看到命令执行 也没有收到结果 我需要获取服务器返回
  • 建立了无需 SSL 即可进行安全注册和身份验证的 javascript 解决方案

    有没有无需 SSL 即可实现安全用户注册和身份验证的解决方案 安全 我的意思是免受被动窃听 不是来自中间人 http en wikipedia org wiki Man in the middle attack 我知道只有带有签名证书的 S
  • 验证数据库匹配中的 $_GET id 是否足够安全?

    我的网站上有 2 个页面 一个是 index php 索引页面列出了数据库中存在的所有帖子 另一个页面是 post php 当单击索引页面上的特定帖子时 帖子页面显示单个帖子 现在我用来列出 index php 上所有帖子的代码是 post
  • 收到“/:未找到事件。”使用 PyCharm 远程调试器时

    当我使用 PyCharm 通过 ssh 进行远程调试时tcsh shell 服务器 很多时候它停止工作 并显示 未找到事件 更具体地说 我在 pycharm 调试控制台中遇到以下内容 ssh username hostserver 22 p
  • 在防火墙后面使用 GitHub,无需 SSH 访问

    我真的很想使用 GitHub 但我的公司一切都被锁定了 现在 我只能通过HTTP协议使用Tortoise SVN 我可以以同样的方式使用 GitHub 吗 如果是这样 怎么办 我认为你一直能够克隆github https github co
  • 算法 HmacPBESHA256 不可用

    因此 我编写了一些代码来获取 PEM 通过 bouncycastle 将其添加到 PKCS 密钥库 然后使用 java crypto 将 PKCS 密钥库值导入到 JKS 密钥库中 我发誓昨天我在执行这些步骤后成功通过了单元测试 但是今天早
  • 海报风格的电子邮件验证

    我正在考虑创建一个类似于Posterous的服务 用户可以在其中发布到固定地址 例如 电子邮件受保护 cdn cgi l email protection然后帖子的身份验证将基于发件人地址和标头签名的某种组合 Posterous 似乎正在做
  • 使用 pscp 命令时出现“未找到命令”

    我正在使用 PuTTY pscp 将项目文件夹传输到 AWS 实例 我可以使用 ppk 公钥文件进行连接并且ssh命令成功打开并登录 这里我使用命令来传输文件夹 pscp r i C path to my keys converted pe
  • GridGain - 通过 Grid.startNodes API 使用 SSH 以编程方式打开节点

    我正在使用 Grid startNodes java util Collection java util Map boolean int int 如此处定义 http gridgain com api javadoc org gridgai
  • 如何更改锁屏自定义文本(所有者信息)?

    我写了程序代码 String message This is test Settings System putString context getContentResolver Settings Secure LOCK PATTERN EN
  • 如何禁止 celery 中的 pickle 序列化

    Celery 默认使用 pickle 作为任务的序列化方法 如中所述FAQ http ask github com celery faq html isn t using pickle a security concern 这代表一个安全漏
  • 匿名、身份验证、模拟和委派之间有什么区别,为什么委派需要 Kerberos?

    当我们的客户安装我们的软件时 他们通常选择 拆分安装 其中服务在一个机器上运行 数据库在另一个机器上 这些服务可能与其他服务通信 或者数据库可能包含需要与另一个数据库通信的存储过程 这将我们带入了 Kerberos 和 SetSPN 的黑暗
  • 如果数据库可访问,加盐和散列有什么意义?

    我刚刚学习了散列的概念 嘿 不要忘记盐 并使用盐来确保密码安全 散列它是一种单向加密 实际上不是加密而是散列 因此无法对其进行逆向工程 加盐是在散列之前在密码上添加随机创建的值的前缀或附加值 因为散列 只是散列 的问题是 一些天才提供了字典
  • 当机器人攻击时! [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Hapijs 在一个连接上同时使用 Http 和 Https

    New to Hapijs http hapijs com 并尝试使用它来创建一个应用程序 该应用程序对所有请求使用 HTTPS 并将 HTTP 重定向到安全连接 问题是应用程序进入 HTTPS 模式没有问题 但如果我将 URL 更改为 H
  • 关于使用Python启动SSH隧道的问题

    我在从用 Python 编写的 HTTP RPC 服务器启动 SSH 隧道时遇到了麻烦 基于Python的BaseHTTPServer 有一个用Python编写的简单的HTTP RPC服务器 作为其中一项服务的一部分 我想启动从 RPC 服

随机推荐

  • 如何在 Debian 10/9 上安装 Mono

    Mono 项目由微软赞助 它是 Microsoft NET Framework 的开源跨平台实现 Mono 支持大多数具有 32 位和 64 位架构的现代操作系统 本教程帮助您逐步在 Debian 10 和 Debian 9 系统上安装 M
  • 如何在 Ubuntu 18.04 和 16.04 上设置 Squid 代理服务器

    Squid 是类 Unix 操作系统中最流行的代理服务器 它还用于网页过滤 Squid 还可用作 HTTP HTTPS 和 FTP 协议的缓存代理服务器 本文将帮助您在 Ubuntu 18 10 18 04 LTS 16 04 LTS 和
  • 如何在 Linux 中删除超过 30 天的文件

    定期从服务器中清除旧的未使用文件是最佳实践 例如 如果我们每天 每小时在服务器上运行文件或数据库备份 那么服务器上将会产生很多垃圾 所以要定期清洁 为此 您可以从备份目录中找到旧文件并清理它们 本文向您介绍如何查找和删除超过 30 天的文件
  • 如何使用 Google Chrome 无头功能

    Google Chrome 最新版本发布 新增实用功能无头镀铬 无头 Chrome 对于浏览器自动化很有用 您可以使用命令行和编程语言捕获任何网页的屏幕截图 而无需启动 Chrome GUI 它还支持打印网页DOM并创建网页的pdf 本教程
  • Laravel:从 Apache 中的 URL 中删除“public/index.php”

    当您创建新的 Laravel 项目时 默认配置要求您在 URL 中包含 public index php 以访问您的应用程序 这可能很麻烦 并且会让您的 URL 看起来笨拙且不专业 幸运的是 这个问题有一个简单的解决方案 在本教程中 我们将
  • 如何在 Fedora 上安装 Java 11/8

    Java 是一种流行的应用程序 系统软件和 Web 应用程序编程语言 Oracle Java 8 和 Java 11 需要订阅才能下载和使用 因此 我们使用 OpenJDK 在 Fedora Linux 系统上安装 Java 本教程将帮助您
  • Apt Upgrade 与 Apt Dist-upgrade:主要区别

    The 高级打包工具 APT 是一个强大的包管理系统 用于 Debian Ubuntu 及其衍生版本 它简化了在基于 Linux 的系统上安装 升级和删除软件的过程 在各种APT命令中 易于升级 and apt dist upgrade 在
  • 如何在 MySQL 中创建新用户并授予权限

    MySQL是一个关系数据库管理系统 用于以表和记录的形式存储数据 您可以使用 SQL 语句或编程语言插入 修改或检索数据 它允许我们创建新用户并授予对数据库表的权限 最好的做法是始终对所有数据库使用单独的用户 这将确保应用程序无法访问其他应
  • 如何克隆 Git 存储库中的所有远程分支

    Git 是开发人员的必备工具 可实现高效的代码版本控制 管理和协作 Git 的核心功能之一是将远程存储库克隆到本地计算机的能力 虽然基本的 git clone 命令仅克隆默认分支 但有时您可能需要克隆 Git 存储库中的所有远程分支 在本文
  • 如何为 PHP 安排 Cron 作业:分步指南

    Cron 是基于 Unix 的操作系统中的任务调度程序 它用于安排命令或脚本在固定时间 日期或间隔定期运行 此功能对于自动化系统维护或管理任务特别有用 Cron 的一个常见用例是自动执行用 PHP 一种流行的服务器端脚本语言 编写的脚本 本
  • 20 个常见的 Linux 面试问题及解答

    Linux 是世界上最流行的操作系统之一 广泛应用于从 Web 服务器到移动设备的各种应用中 因此 对具有 Linux 专业知识的开发人员和系统管理员的需求很高 无论您是经验丰富的 Linux 专业人士还是初学者 深入了解常见的 Linux
  • 如何在 Debian 9 上安装 Node.js 和 npm

    Node js 是一个基于 Chrome 的 JavaScript 引擎构建的开源跨平台 JavaScript 运行时环境 允许服务器端执行 JavaScript 代码 它主要用于构建服务器端应用程序 但作为全栈和前端解决方案也非常流行 n
  • 如何在 Ubuntu 18.04 上安装 GCC 编译器

    GNU 编译器集合 GCC 是 C C Objective C Fortran Ada Go D 编程语言 许多开源项目 包括 GNU 工具和 Linux 内核 都是用 GCC 编译的 本教程介绍了在 Ubuntu 18 04 上安装 GC
  • 如何在 Ubuntu 20.04 上安装 CouchDB

    Apache CouchDB 是由 Apache 软件基金会开发的免费开源 NoSQL 数据库 它可以用作单节点或集群数据库 CouchDB 服务器将其数据存储在命名数据库中 其中包含具有以下内容的文档JSON结构 每个文档由许多字段和附件
  • 如何在 Ubuntu 18.04 上安装 Spotify

    Spotify是一种数字音乐流媒体服务 可让您即时访问数百万首歌曲 从经典老歌到最新热门歌曲 在本教程中 我们将向您展示如何在 Ubuntu 18 04 桌面上安装 Spotify 相同的步骤适用于 Ubuntu 16 04 和任何基于 U
  • 在 Debian 9 上使用 Let's Encrypt 保护 Apache

    Let s Encrypt 是由互联网安全研究小组 ISRG 创建的证书颁发机构 它通过完全自动化的流程提供免费的 SSL 证书 旨在消除手动证书创建 验证 安装和续订 Let s Encrypt 颁发的证书自颁发之日起 90 天内有效 并
  • 如何在 Ubuntu 18.04 上安装 Tor 浏览器

    Tor 浏览器通过 Tor 网络路由您的网络流量 使其私密且匿名 当您使用 Tor 浏览器时 您正在查看的网站的连接会被加密并免受网络监视和流量分析 使用 Tor 浏览器有一些缺点 通过 Tor 浏览网络比常规互联网连接慢 并且一些主要网站
  • 如何在 CentOS 7 上安装 MongoDB

    MongoDB 是一个免费的开源文档数据库 它被归类为 NoSQL 数据库 与 MySQL 和 PostgreSQL 等传统的基于表的 SQL 数据库不同 在 MongoDB 中 数据存储在灵活的 类似 JSON 的文档中 其中字段可能因文
  • ​如何升级到Ubuntu 20.04

    Ubuntu 20 04 LTS Focal Fossa 于2020年4月23日发布 支持五年 它附带了大量新软件包和主要软件升级 包括最新版本的 OpenJDK GCC Python Ruby 和 PHP 该版本基于 Linux 5 4
  • 如何设置 SSH 隧道(端口转发)

    SSH 隧道或 SSH 端口转发是一种在客户端和服务器计算机之间创建加密 SSH 连接的方法 通过该连接可以中继服务端口 SSH 转发对于传输使用未加密协议的服务的网络数据非常有用 例如 VNC 或FTP 访问地理限制的内容或绕过中间防火墙