设置 ssh 隧道的语法

设置 ssh 隧道的语法

我无法理解设置 ssh 隧道的 ssh 参数。今天我在 Google 上搜索了这两个用于本地转发的命令。

ssh -f -L 2222:myserver.com:22 localhost -N
ssh -f -L 2222:localhost:22 myserver.com -N

两人的结果似乎都一样。

它们的工作方式有什么区别吗?

答案1

localhost是的,当解析myserver.com到不同的地址(不同的机器)时会有差异。

由于您的示例使用的端口22是 SSH 的标准端口,因此我222在回答中将此数字更改为。重点是区分运营商 SSH 连接(22默认为端口)和 SSH 隧道的目标。

两人的结果似乎都一样。

为了让未来的读者清楚:这两个命令都使数据进入机器上监听端口(在原始问题中)localhost:2222的进程。我们在这里讨论的是 TCP 端口。22222myserver.com


1.

ssh -f -L 2222:myserver.com:222 localhost -N

使用此命令

  • 您需要 SSH 访问权限localhost
  • SSH 连接是本地的,因此它提供的任何加密都只是不必要的计算工作;
  • SSH 服务器将数据传递到远程myserver.com:222,就像它进入本地端口一样2222,因此目前没有额外的加密(进入本地端口的数据2222可能事先加密,也可能不加密,这个是独立的);
  • myserver.com认为其端口的连接222来自外部(来自你的本地主机,而不是他们的localhost),所以端口222不能被防火墙阻止

如果您直接连接到myserver.com:222而不是,localhost:2222结果应该是相同的,因为myserver.com不会看出差异。这就是为什么我认为第一个命令几乎没用。(为什么是“几乎”?——我会在最后解释。)


2.

ssh -f -L 2222:localhost:222 myserver.com -N

在这种情况下

  • 您需要 SSH 访问权限myserver.com
  • SSH 连接转到另一台机器,此阶段所有数据均已加密
  • SSH 服务器解密隧道数据并将其传递给自己localhost,即本地同一台机器;
  • myserver.com认为与其端口的连接222来自自身(本地),并且这应该可以通过防火墙因为阻止本地连接并不常见;监听过程甚至可能仅在环回接口上监听。

对我而言,很明显第二条命令是更优越的命令。


第一条命令可能有用的一种情况是:如果另一台(第三台)计算机需要访问myserver.com:222并且没有路由,则连接到2222本地主机(不是它的localhost)的端口可能是一种解决方案。请注意,这需要命令-g选项ssh(请参阅以man ssh了解更多信息)。您可以使用这两个命令中的任何一个来实现此目的,但如果您没有 SSH 访问权限,myserver.com则第二个命令将不起作用。

好吧,我们可以完全从第三台计算机建立隧道。命令如下:

ssh -f -L 2222:myserver.com:222 ssh-server -N
# then connect to their own localhost:2222

显然,这需要 SSH 访问ssh-server(您的localhost)。但让我们假设第三台计算机属于您的朋友,没有 SSH 访问ssh-server。您(具有访问权限)可以使用第一个命令和选项为他们建立隧道-g。然后他们应该会连接到ssh-server:2222

答案2

最终效果是一样的,您最终会得到一个从 端口 到 端口 的隧道2222localhost22它们myserver.com的工作方式略有不同。在第一个示例中,您正在执行ssh localhost并添加一些标志,因此从根本上讲,您正在再次登录localhost。然而,在第二个示例中,您正在ssh myserver.com使用一些标志运行,因此您正在创建与远程主机的连接。

-L采取(这里) 3 个参数,作为隧道一端的本地机器上的端口,作为隧道目标的另一端的主机(建立连接后),最后是隧道远端的端口。

如果您通过隧道连接到localhost并创建隧道到 ,那么myserver.com您就与 建立了连接myserver.com。另一方面,如果您从连接的远端连接到myserver.com并隧道到 ,那么您就与 建立了连接。localhostmyserver.com

因此,最终的效果是相同的,但是您ssh必须验证的主机(为了设置隧道)是不同的。

相关内容