通过 SSH 代理的 SSH Shell

通过 SSH 代理的 SSH Shell

是的,我知道我在标题中写了“SSH shell”。

TL;DR:第一段、带有链接的段落和带有错误消息的段落是最重要的。

我家里有我的 Raspberry Pi,我可以通过互联网访问它,但只能通过 IPv6。我目前所在的位置没有 IPv6。

我可以通过首先登录到同时具有 IPv4 和 IPv6 的服务器,然后从那里登录到我的 pi 来执行命令。但是,我在其上使用 SSH 的目的不仅仅是在其上执行命令:

  • git
  • 备份(Deja Dup)
  • 访问文件 (SFTP)
  • VNC(我通过 SSH 建立隧道,然后可以通过 VNC 连接到本地主机)

这些按重要性降序排列。我想访问我的 git 存储库。

更多细节:

  • 我不能简单地让我的 Pi 通过 IPv4 进行访问。它后面的调制解调器有一个 IPv4 地址和一个 IPv6 子网,但我必须使用我没有选择运行我无法更改的软件的硬件。该软件不仅有缺陷而且我什至无法查看它,而且它不允许 IPv4 端口转发所有内容。
  • 我不控制同时具有 IPv4 和 IPv6 的服务器。我只有一个普通用户帐户,并且无法(例如)安装新软件(如果需要超过标准用户权限)。

谷歌搜索提出的解决方案这个相当有前途的页面,它实际上适用于 git。我为我正在使用的存储库设置了新的遥控器,只需将 pi 的域名替换为localhost:3333.

但它看起来比这更有希望。它看起来像是上述所有问题的解决方案。它开始起作用了!

SFTP 可以工作,但我无法真正确定通过 Deja Dup 进行的备份是否有效,因为我的连接速度太慢,但它还没有失败,并且某些东西导致了网络流量,所以这很好并且很有前途。

但为什么我不能直接ssh localhost:3333连接到我的笔记本电脑来在我的 pi 上安装 shell?该命令会产生以下错误消息:

ssh: Could not resolve hostname localhost:3333: Name or service not known

我主要感兴趣的是为什么我不能按照我期望的方式获得 shell。

答案1

您可能需要查看sshProxyCommand配置,它可以使工作更加无缝,并且适用于 shell、SFTP、隧道以及您可能希望通过 ssh 代理的任何其他内容。

假设您有以下三个主机:

  • workstation.example.com- 这是您正在操作的机器
  • proxy.example.com- 这是您路由 SSH 流量的机器
  • endpoint.example.com- 这是您希望流量最终到达的地方

~/.ssh/configon 中workstation,添加以下内容:

Host endpoint
    User EndpointUser # set this to the username on the destination host
    HostName endpoint.example.com
    ProxyCommand ssh [email protected] nc %h %p 2> /dev/null

proxy主机上,确保nc已安装 (netcat)。

然后,在 上workstation,您可以ssh endpointsftp endpoint并且您将通过代理主机透明地代理到该计算机。

答案2

有几部分可以​​用不同的方式拼凑在一起,具体取决于最适合您的方式。每件都是可选的,并且有变体。

我将使用以下术语:

  • “desktop” => 您坐在前面的机器(在您的示例中,是具有 ipv4 的机器)。
  • “jump host” => 中间的机器,你必须经过的那台机器(在你的例子中,使用 ipv4 和 ipv6)
  • “target” => 你真正想要使用的最终机器(在你的例子中,是 Pi)。

    1. 考虑使用 ssh 密钥而不是密码。这将为您节省大量输入密码的时间。看https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2
    2. 确保您可以使用“ssh Jumphostname”或“ssh Jumpuser@jumphostname”直接 ssh 到跳转主机 - 如果您需要连接任何其他选项(端口号等),请在 ~/.ssh/config 中添加一个条目这个跳跃主机。
    3. 向目标的 ~/.ssh/config 添加一个条目,并使用子句“ProxyJump Jumphostname”或“ProxyJump Jumpuser@jumphostname”。
    4. 如果您有时直接访问目标,有时通过跳转主机(例如“桌面”是您有时在家中使用,有时在工作中使用的笔记本电脑),则可以为目标和/或跳转主机指定不同的名称(例如“主机”) Jump-pi' 或 'Host Jump-proxy'),并在 'hostname' 子句中指定目标的真实主机名或 IP。
    5. 您现在应该能够直接从桌面通过 ssh 连接到 pi。在幕后,ssh 将创建从桌面到跳转主机的连接,然后通过第一个连接直接从桌面启动另一个连接到目标。
    6. 您可以将端口转发添加到 ssh 命令(或将其添加到 ssh 配置中)。例如,如果您希望您的 pi 能够在桌面上访问 ssh,请在 pi 上选择一个要侦听的端口(我将选择 2222),然后运行以下命令:“ssh -R2222:localhost:22 piusername @pi” - 这表示,在 ssh 连接后,任何到端口 2222(在 pi 上)的传入连接都应通过隧道转发回您的桌面,然后桌面应连接到“localhost 端口 22”。然后,在 pi 上,您可以“ssh -p 2222desktopuser@localhost”。您可以对任何其他单个端口执行相同的操作(前提是您可以为正在使用的程序指定主机名和端口)。
    7. 如果您想要通用网络,可以运行 Dynamic Socks。 ssh 内置了这个功能,但它只能在 OTHER 方向上工作。要允许连接返回(从 Pi 到您的桌面),您的桌面上需要有一个 Dynamic Socks 服务器。然后设置从 Pi 到 Dynamic Socks 服务器的 tcp 连接(按照步骤 6),然后在 Pi 上运行 Dynamic Socks 客户端(某些应用程序内置了 Dynamic Socks,例如 wget,或者您可以使用类似 'tsocks ')。
    8. 如果这还不够通用,请通过 ssh 运行 PPP。这将为您的桌面和 Pi 上提供另一个“网卡”,然后它们可以直接相互通信。您可以通过此界面设置路由(请注意,如果您失去与 Pi 的连接,您将无法远程修复它)。

相关内容