我在这里找到了解决方案。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%