SSH 隧道链

SSH 隧道链

我在这里找到了解决方案。http://chrisjordan.ca/post/15052405906/chaining-ssh-tunnels。为什么这个答案是正确的?A、B、C、D、E 之间的连接是否加密?据我所知,只有 localhost 和 A 之间的连接是加密的。

 ssh -NL 6000:B:22 -o TCPKeepAlive=no -o ServerAliveInterval=15 A &
 ssh -NL 6001:C:22 -o TCPKeepAlive=no -o ServerAliveInterval=15 localhost -p 6000 &
 ssh -NL 6002:D:22 -o TCPKeepAlive=no -o ServerAliveInterval=15 localhost -p 6001 &
 ssh -NL 6003:E:22 -o TCPKeepAlive=no -o ServerAliveInterval=15 localhost -p 6002 &
 ssh localhost -p 6003
 Welcome to E!

我想到的解决方案是:

ssh A 
ssh B
...

假设每个服务器都有链中前一个服务器的公钥。

上述两种解决方案有什么区别吗?

答案1

使用 chrisjordan.ca 的解决方案,每个连接都经过加密。这意味着从 A 到 E 的每个数据包都经过 4 次加密和解密。它还受到多层 ssh 隧道开销的影响,这可能会损害性能,超出加密的 CPU 成本。请参阅高性能网络有关通过 ssh 连接发送流量的负面影响的信息。

您从 A 之前的某个主机开始,我们称之为 0。

0-A 流量由第一个 ssh 加密,从而在 ssh 连接上创建一个隧道。此隧道在 A 处退出 ssh,并将任何流量转发给 B,而无需进一步加密(至少不是通过此特定 SSH)。

0-B 流量由第二个 ssh 加密。此 ssh 从 0-A 穿越第一个 ssh 的隧道,退出隧道,然后终止于 B。此 ssh 还会创建第二个隧道。使用该隧道的流量通过 0-B ssh 连接,在 B 退出 ssh,并未经进一步加密转发到 C。

类似地,0-C 流量穿过 0-B 隧道,然后退出,继续前往 C,并在那里终止。它会创建另一条隧道。

类似地,0-D 和最终 0-E 流量都通过逐渐增多的 ssh 隧道转发。

那么这和您建议的方法有什么区别?

1) 你没有多层加密和隧道,所以你的方法应该更快。可能快得多。

2) 另一方面,您的方法要求您信任沿途的每个主机,并信任您在 0 和 E 之间发送的流量。博客解决方案可以防止这种情况发生,因为最内层的 ssh 连接会加密 0 和 E 之间的所有流量。

3)同样,博客解决方案在 0 和 E 之间创建了一个透明的 ssh 连接,因此您可以从端到端执行诸如运行 scp/sftp 之类的操作。

如果您担心性能,但又想保持 0 和 E 之间使用的端到端加密,那么您可以逐跳构建隧道,使用单独的 ssh 连接。类似于(未经测试):

0%  ssh -L6000:localhost:6000 A
A%  ssh -L6000:localhost:6000 B
B%  ssh -L6000:localhost:6000 C
C%  ssh -L6000:E:22 D

然后在一个单独的窗口中...

0% ssh localhost:6000
E%

相关内容