使用一个公共SSH服务器设置从A到C的直接SSH连接,不使用公共IP


3

我有这些SSH服务器/客户端:

A - 没有公共IP

B - 公共知识产权

C - 没有公共IP

我知道,我可以建立从A到C的SSH连接,如下所示:

1)将C钩到B.从C做起:

ssh -R 10100:localhost:22 B_IP

2)使用B钩子设置从A到C的端口转发,以便能够在机器A上使用ssh-agent:

ssh -L 5000:localhost:10100 B_IP

3)现在我可以使用我的ssh键从A直接“访问”C:

ssh -p 5000 localhost

......我的观点是:

我可以以某种方式建立从A到C的新“纯”连接,这样在机器B出现故障后,我可以继续工作吗?

我认为这应该是可能的,因为这两台计算机都意识到,他们已经共享一个连接,或者我错了?

感谢您的时间和想法:)

Answers:


2
  • 通常的方法是建立于A的或C的路由器“NAT端口转发”。(它是如何完成取决于路由器,但到处都有指令。)一旦你这样做,你可以连接到C路由器的公共地址+“转发”端口,连接将进入C.

    (注意:NAT端口转发和SSH端口转发类似但不同的东西,如锤子和螺丝刀。不要混淆它们。)

  • 如果您没有对任一路由器的管理访问权限,您可以尝试使用UPnP或NAT-PMP来设置端口转发规则,就像许多游戏和P2P程序一样。为此,使用upnpcnatpmpc命令。

  • 如果上述方法都不起作用,则需要某种形式的NAT穿孔。(另见TCPICMP打孔文章。)

    不幸的是,虽然它在各种特定程序中被广泛使用,但似乎没有很多用于TCP的通用工具,尽管chownat可能有用


好吧,第一个解决方案对我来说已经很明显,但我的路由器上没有公共IP ...关于第二个解决方案 - 我现在要尝试一下,所以我会报告回来 - 但是我我想向我透露一些东西 - 是否有可能使用UPnP或NAT-PMP从A到C进行通信而没有我可以访问的任何公共服务器?...老实说第三种解决方案似乎对我最有吸引力,所以我我等不及试试了:)
jirislav 2015年

1

除非您可以在路由器上进行某种端口转发,否则这可能是不可能的 - 但在这种情况下,您根本不需要计算机C.

问题在于,在您的示例中,您不是直接从A - > C,数据包仍然遍历B.

如果您有另一台带有公共地址的计算机,您可以在星形地形中设置VPN设置,并使用VPN之间的路由创建一个虚拟网络,其中任何一个公共主机都可以倒下,并且事情可以继续工作。我用OpenVPN完成了这个 - 有一些问题 - 一个重要的是禁用反向路径过滤。


如果两个主机都可以合作(例如,通过使用STUN,或者可能使用鲜为人知的TCP功能),那么技术上是可行的。
grawity 2015年

@grawity - 我最初考虑过这个问题,但是这仍然需要连接到需要端口转发的其他设备的外部地址。(我怀疑你知道STUN是一种从NAT后面暴露公共IP地址的方式)。问题是,当IP地址在NAT和非NAT之间发生变化时,我看不到SSH客户端如何继续允许连接,因为这会带来安全风险[即MITM可以更轻松地接管连接] ,当然TCP会话也必须死掉。这就是我提出基于VPN的解决方案的原因...续
davidgo 2015年

这就是我假设一个基于VPN的解决方案的原因 - 它抽象了IP地址并允许在虚拟连接上进行路由 - 但除非你能够在路由器上固定或运行VPN,否则你仍然会遇到VPN端点如何看到对方的问题。可能允许VPN端点“浮动”而不检查实际的底层IP地址,但是你仍然需要让pinholing工作以检测中途的会话,我认为没办法这样做。
davidgo 2015年

是的,我把SIP的NAT遍历功能误认为是STUN的一部分。
grawity 2015年

好吧,谢谢你的好解决方法,但仍然 - 假设我想在A和C之间建立连接,即使我的所有公共服务器都可用了 - 你的解决方案看起来不符合我这个条件
jirislav
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.