我无法理解设置 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 端口。222
22
myserver.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
最终效果是一样的,您最终会得到一个从 端口 到 端口 的隧道2222
,localhost
但22
它们myserver.com
的工作方式略有不同。在第一个示例中,您正在执行ssh localhost
并添加一些标志,因此从根本上讲,您正在再次登录localhost
。然而,在第二个示例中,您正在ssh myserver.com
使用一些标志运行,因此您正在创建与远程主机的连接。
-L
采取(这里) 3 个参数,作为隧道一端的本地机器上的端口,作为隧道目标的另一端的主机(建立连接后),最后是隧道远端的端口。
如果您通过隧道连接到localhost
并创建隧道到 ,那么myserver.com
您就与 建立了连接myserver.com
。另一方面,如果您从连接的远端连接到myserver.com
并隧道到 ,那么您就与 建立了连接。localhost
myserver.com
因此,最终的效果是相同的,但是您ssh
必须验证的主机(为了设置隧道)是不同的。