SSH隧道连接串联

17

场景如下:

我正在尝试获取对server3的scp访问,但只有对server1的公共ssh访问权限。要连接到server3,我必须先ssh到server1,再ssh到server2,然后再ssh到server3。

我的希望是,我可以WinSCP到localhost:8022,并获得对server3的文件访问权限。

我正在尝试使用ssh隧道,但在我阅读的所有教程和问题中,似乎都不适用于此情况。

我在Windows上使用putty。

任何建议都将非常有用。谢谢。

6个回答

20
在OpenSSH中,当我需要隧道时,我使用以下设置。 这使我能够直接键入 sftp server3 ,而无需担心手动启动 server2server1 隧道。
# ~/.ssh/config
# 连接到server2,隧道通过server1 Host server2 ProxyCommand ssh server1 nc %h %p # 连接到server3,隧道通过server2 Host server3 ProxyCommand ssh server2 nc %h %p
为了更完整,我通常使用 ssh -oCiphers=arcfour128,arcfour256,arcfour,blowfish-cbc -oControlMaster=no -oForwardX11=no -oForwardAgent=no -oPermitLocalCommand=no -oClearAllForwardings=yes server1 nc %h %p 作为 ProxyCommand
  • 被隧道的ssh连接已经加密,因此在外层不必使用较重的 aes/3desarcfourblowfish 更快。
  • -o**** 的其余设置是出于谨慎起见,以便即使添加具有非常奇怪设置的 Host server1 段落到 ssh_config 中,也不会出现问题。
类似地,您可以配置PuTTY使用代理命令 plink -P %proxyport -pw %pass %user@%proxyhost nc %host %port,并相应地在Connection/Proxy配置面板中设置代理主机名/端口/用户/密码。 plink 和 PuTTY 套件的其余部分(pscppsftp 等)加载保存在PuTTY图形配置中的任何内容;希望WinSCP也是这样。(我不使用它,所以对其功能不太熟悉。)

当我尝试这样做时,会出现“bash: nc: command not found”的错误提示 - 我是否误解了它的工作原理?我需要将命令和端口放在你的“nc%h%p”所在的位置吗? - Zak

10
  • 第一个想到的解决方案是将每个服务器隧道连接到本地端口。由于SSH使用22号端口,我们可以使用每个SSH连接来将本地端口隧道连接到下一个服务器的22号端口。

  • 打开PuTTY后,会出现PuTTY配置对话框。你需要编辑的两个类别是“Session”和“Connection→SSH→Tunnels”。

  • 打开一份PuTTY的副本,使用以下设置:

    • 连接到主机

      • 主机名:server1
      • 端口:22
    • 隧道连接

      • 本地模式
      • 源端口:15500
      • 目标: server2:22 (安全外壳协议端口)

        PuTTY Configuration window before pressing Add PuTTY Configuration window after pressing Add

    现在,每次您在本地计算机上连接到15500端口时,您的连接都被隧道连接到server2的22号端口。

  • 打开一份PuTTY的副本,使用以下设置:

    • 连接到主机
      • 主机名:localhost
      • 端口:15500
    • 隧道连接
      • 本地模式
      • 源端口:15501
      • 目标:server3:22(安全外壳协议端口)
  • 打开一份PuTTY的副本,使用以下设置:

    • 连接到主机
      • 主机名:localhost
      • 端口:15501
    • 隧道连接
      • 本地模式
      • 源端口:15502
      • 目的地:server3:22(安全外壳端口)
  • 使用WinSCP连接到localhost15502端口。您的连接将被隧道化,就像直接连接到server3一样。

  • 请在评论中告诉我这是否对您有效。祝你好运!


    6

    这种方法类似于在open ssh配置文件中使用proxycommand的方式。

    使用此方法的先决条件是所有中间(代理)主机都必须使用公钥身份验证来使用Pageant,否则您将只会看到一个闪烁的光标而无其他反应。要了解有关Pageant、PuTTYgen和公钥的更多信息,请参见:
    http://the.earth.li/~sgtatham/putty/0.62/htmldoc/Chapter8.html#pubkey
    http://the.earth.li/~sgtatham/putty/0.62/htmldoc/Chapter9.html#pageant

    我们有四台机器可以按以下顺序访问
    PuttyPC -> server01 -> server02 -> server03

    对于server01,我们有一个已保存的Putty会话:
    主窗口:user1@server01 // 端口22 // SSH
    将此会话另存为server01

    对于server02,我们有一个已保存的Putty会话:
    主窗口:user2@server02 // 端口22 // SSH
    代理配置窗口:类型local // 代理命令plink -load server01 -nc %host:%port
    将此会话另存为server02

    对于server03,我们有一个已保存的Putty会话:
    主窗口:user3@pc3 // 端口22 // SSH
    代理配置窗格:类型local // 代理命令plink -load server02 -nc %host:%port
    将此会话另存为server03

    这意味着server03的保存会话将调用server02的保存会话,而server02的保存会话将调用server01的会话。


    0

    如果您只需要越过一个服务器,我发现直接在WinSCP中进行设置更容易。

    场景:计算机->服务器1->服务器2

    1:设置与服务器2的连接

    2:单击高级->连接->隧道

    3:启用SSH隧道并将主机设置为服务器1


    0

    这里有一个非常详细的 Perl 脚本解决方案(链接)。也请务必阅读帖子下面的评论。

    了解更多关于SSH 代理转发的知识(在 Perl 脚本帖子评论中提到)。


    0

    答案是从server3进行反向隧道


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接