【问题标题】:ssh tunnelling chainssh隧道链
【发布时间】:2009-06-18 04:45:49
【问题描述】:

这里是场景

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

我希望的最终结果是我可以通过 WinSCP 访问 localhost:8022,它可以让我访问 server3 的文件。

我正在尝试使用 ssh 隧道,但在我阅读的所有教程和问题中,似乎没有一个适用于这种情况。

我在 Windows 上使用 putty。

任何建议都会很有帮助。谢谢。

【问题讨论】:

    标签: windows ssh tunnel


    【解决方案1】:

    在 OpenSSH 中,我在需要隧道时使用此设置。这让我可以直接输入sftp server3,而不必担心先手动启动server2server1 隧道。

    # ~/.ssh/config # 连接到server2,隧道通过server1 主机服务器2 ProxyCommand ssh server1 nc %h %p # 连接server3,通过server2隧道 主机服务器3 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,并在“连接/代理”配置窗格中相应地设置代理主机名/端口/用户/密码。 plink 和 PuTTY 套件的其余部分(pscppsftp 等)加载保存在 PuTTY 图形配置中的任何内容;希望 WinSCP 也是如此。 (我没用过,所以对它的功能不太熟悉。)

    【讨论】:

    • 当我尝试这样做时,我得到“bash: nc: command not found”——我误解了它是如何工作的吗?我需要把命令和端口放在你有“nc %h %p”的地方吗?
    【解决方案2】:

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

    当您打开 PuTTY 时,您会看到 PuTTY 配置对话框。您需要编辑的两个类别是“会话”和“连接→SSH→隧道”。

    1. 打开 PuTTY 的副本。使用这些设置:

      • 连接到主机

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

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

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

    2. 打开 PuTTY 的副本。使用这些设置:

      • 连接到主机
        • 主机名:localhost
        • 端口:15500
      • 隧道端口
        • 本地模式
        • 源端口:15501
        • 目标:server3:22(安全外壳端口)
    3. 打开 PuTTY 的副本。使用这些设置:

      • 连接到主机
        • 主机名:localhost
        • 端口:15501
      • 隧道端口
        • 本地模式
        • 源端口:15502
        • 目标:server3:22(安全外壳端口)
    4. 使用 WinSCP 连接到端口 15502 上的 localhost。您的连接将通过隧道传输,就像您直接连接到 server3 一样。

    在 cmets 中告诉我这是否适合您。祝你好运!

    【讨论】:

    • 是的,我可以确认这是可行的。我没有将两个以上的 SSH 链接在一起,但大概如果它适用于 2,它可能适用于 3 及以上。
    【解决方案3】:

    此方法类似于您可以在打开的 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 会话。

    【讨论】:

    • 非常好的解决方案。与 windows、putty 和 winscp 完美集成。如果可以的话,我会投票两次。
    【解决方案4】:

    有很好的描述 perl 脚本解决方案here。也请阅读帖子中的 cmets。

    阅读SSH Agent Forwarding 的更多信息(在 perl 脚本帖子 cmets 中引用)。

    【讨论】:

      【解决方案5】:

      答案是从 server3 反向隧道

      【讨论】:

        【解决方案6】:

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

        场景:计算机->server1->server2

        1:设置与 server2 的连接

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

        3:开启SSH隧道并将主机设置为server1

        【讨论】:

          猜你喜欢
          • 2013-04-10
          • 1970-01-01
          • 2020-07-31
          • 1970-01-01
          • 1970-01-01
          • 2019-08-07
          • 2020-05-20
          • 2021-07-18
          • 2016-08-26
          相关资源
          最近更新 更多