什么是ssh端口转发,ssh本地和远程端口转发有什么区别

use*_*717 250 ssh forwarding

我对 ssh 端口转发以及 ssh 本地和远程端口转发之间的区别感到困惑。你能详细解释一下并举例说明吗?谢谢!

eri*_*rik 642

我画了一些草图

从本地开始的 ssh 隧道


从远程开始的 ssh 隧道

介绍

  1. 当地的: -L Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.

    ssh -L sourcePort:forwardToHost:onPort connectToHost意思是:用 ssh 连接到connectToHost,并将所有连接尝试转发到机器上称为的本地 sourcePort端口onPort,该端口forwardToHost可以从connectToHost机器访问。

  2. 偏僻的: -R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.

    ssh -R sourcePort:forwardToHost:onPort connectToHost表示:使用 ssh 连接到connectToHost,并将所有连接尝试转发到名为 的机器上的远程 sourcePort端口onPort,该端口forwardToHost可以从您的本地机器访问。

例子

示例 1

ssh -L 80:localhost:80 SUPERSERVER
Run Code Online (Sandbox Code Playgroud)

您指定将与本地端口 80 建立的连接转发到 SUPERSERVER 上的端口 80。这意味着如果有人使用网络浏览器连接到您的计算机,他会收到运行在 SUPERSERVER 上的网络服务器的响应。您在本地机器上没有运行网络服务器。

示例 2

ssh -R 80:localhost:80 tinyserver
Run Code Online (Sandbox Code Playgroud)

您指定将与 tinyserver 的端口 80 建立的连接转发到本地计算机上的端口 80。这意味着如果有人使用网络浏览器连接到小而慢的服务器,他会得到运行在您本地机器上的网络服务器的响应。tinyserver 没有足够的磁盘空间供大型网站使用,因此没有运行网络服务器。但是连接到 tinyserver 的人是这么认为的。

更多例子

其他事情可能是:这台强大的机器有五个网络服务器在五个不同的端口上运行。如果用户使用他的网络浏览器连接到端口 80 上的五个 tinyservers 之一,请求将被重定向到运行在强大机器上的相应网络服务器。那将是

ssh -R 80:localhost:30180 tinyserver1
ssh -R 80:localhost:30280 tinyserver2
etc.
Run Code Online (Sandbox Code Playgroud)

或者也许您的机器只是强大服务器和小型服务器之间的连接。然后就是(对于拥有自己的网络服务器的微型服务器之一):

ssh -R 80:SUPERSERVER:30180 tinyserver1
ssh -R 80:SUPERSERVER:30280 tinyserver2
etc
Run Code Online (Sandbox Code Playgroud)

  • 优秀!这些草图比我刚读过的 10 多篇博文更能传达信息,而且速度要快得多。 (85认同)
  • 请求被发送到您的端口 80。您的 ssh 正在侦听该端口并获取数据(请求)并通过您的 ssh 连接秘密地将其移动到 SUPERSERVER 的 sshd。SUPERSERVER sshd 将此数据(请求)重新发送到 localhost(即 SUPERSERVER,因为 localhost 指的是本地机器)的 80 端口。然后一路回来。也许我应该添加一张图。 (3认同)
  • 因此,当有人位于禁止访问 bbc.co.uk 的防火墙后面时,他们可以创建一个_remote_端口转发来绕过此限制,对吗?这是一个很好的答案,但我觉得可以通过陈述它试图解决的问题来改进它 (2认同)
  • 因此,调用 `SUPERSERVER$ ssh -R 80:SUPERSERVER:30180 tinyserver` 实际上等于调用 `tinyserver$ ssh -L 80:localhost:30180 SUPERSERVER` 我的意思是它实现了相同的效果 - 所有到 `tinyserver:80` 的连接将被转发到`SUPERSERVER:30180`,对吧? (2认同)
  • @RobinNemeth:是的,如果从远程或本地机器启动,本地和远程转发实现相同。但是您的第一个命令可能更简单,因为如果您从 SUPERSERVER 启动它,您可以只引用它的 localhost(SUPERSERVER 的 localhost)。即`SUPERSERVER$ ssh -R 80:localhost:30180 tinyserver`(我的第三张图片)。 (2认同)
  • “-D”呢? (2认同)
  • 我发现这些图形很难理解。但下面的文字解释很棒。 (2认同)
  • @ThomasHirsch 如果你查看图像和日期的描述,你会发现有人重新设计了我的图形 - 颜色更差,更矩形,但不太美观和直观。而且质量低得多(png 光栅图形而不是 svg 矢量图形)。而且,不幸的是,图像中的措辞更糟糕,因此您不知道执行命令的**您的主机**是哪个。看到这里真是可惜了。世界上没有找到这个 stackexchange 问题的可怜人。请参阅此处的其他尝试:https://commons.wikimedia.org/wiki/Category:SSH (2认同)

X T*_*ian 23

本地端口转发

ssh 创建一个额外的本地端口,它将转发到远程系统上的一个端口。

例子

ssh -L 8080:127.0.0.1:80 user@webserver
Run Code Online (Sandbox Code Playgroud)

然后在本地使用 URL 的浏览器中 http://localhost:8080/

它将连接到本地机器的端口 8080,该端口 ssh 将转发到远程 ssh,然后它会向127.0.0.1:80. 注意127.0.0.1实际上是远程服务器的本地主机,但它可能是远程机器网络上可用的主机/IP。

远程转发

要求 ssh 在远程机器上创建一个侦听端口,它将转发(反向)到本地 ssh 以继续转发。

ssh -R 10123:127.0.0.1:123 user@webserver
Run Code Online (Sandbox Code Playgroud)

因此,在 ssh 连接到 webserver 之后,远程 ssh 在端口 10123 上创建和 lsitens。连接到 10123 的 webserver 上的进程,ssh 将接收它并将其发送回本地机器的 ssh,后者将其发送到 127.0.01 :123 端口。