SSH 隧道(端口转发)与 SSH ProxyJump,在这种特定情况下我应该使用哪一个,我 -> JumpSever -> TargetServer

SSH 隧道(端口转发)与 SSH ProxyJump,在这种特定情况下我应该使用哪一个,我 -> JumpSever -> TargetServer

我是 SSH 隧道新手,我已阅读OpenSSH 代理的维基百科一遍又一遍,还是很困惑。

目标是构建一个仅使用 SSH 隧道(端口转发)或 ProxyJump 的双代理(我不太确定应该如何称呼它们)

例如,me 192.168.1.1-->连接到--> the Jump ServerA 1.1.1.1,那么我实际上会到达the Target ServerB 2.2.2.2,如果我使用设置了 socks5 代理ServerA 1.1.1.1,我最终将通过ServerB's IP 2.2.2.2

我知道该怎么处理me >-至-> Server A,但我不知道该如何处理Server A >-至-> Server B,(我的意思是,我拥有这些服务器的所有访问权和 root 权限,但我不知道如何设置。)

我学东西比较慢,如果能提供任何想法我都会非常感激。

(如果您想为该示例发布一个确切的命令或方法,我不会介意。那将会很有帮助)

答案1

基本要求是:

  • ServerB 仅需要从 ServerA 访问。您无需直接连接它。
  • ServerA 需要启用 TCP 隧道。
  • 您需要能够访问 ServerA。

您通过 jumphost (在 中) 建立与 ServerB 的连接.ssh/config

Host ServerB
    ProxyJump ServerA

这假设如果您输入ssh ServerA,您将最终进入 ServerA,如果您在 ServerA 上输入ssh ServerB,您将最终进入 ServerB。例如,名称“ServerB”应该在 ServerA 上可解析,但它并不关心它是否可以在您这边解析。这些可能是主机名或“slug”(昵称)。在后一种情况下,您可以在 中再次关联它们的主机名或 IP 地址.ssh/config

Host ServerA
    HostName ip.add.re.ss

Host ServerB
    ProxyJump ServerA
    HostName host.na.me

您还可以指定用于代理主机的用户名:

Host ServerA
    User proxyuser
    HostName ip.add.re.ss

Host ServerB
    ProxyJump ServerA
    HostName host.na.me

之后,您输入ssh ServerB。OpenSSH 连接到 ServerA 并使用某个随机端口通过此连接转发到 ServerB 的地址,即端口 22。此连接分叉到后台;OpenSSH 立即连接到这个随机转发的端口(到本地主机,但它实际上根据.ssh/known_hosts名称“ServerB”和 HostName 中指定的 IP 地址(如果有)检查其密钥),因此您将直接进入 ServerB。如果您发出“who”,它会说您是从 ServerA 地址连接的。坐在您和 ServerA 之间的任何人都不可能知道您实际上正在与 ServerB 交谈。

您可以使用任何 SSH 命令行选项,这些选项将用于服务器B连接(通过转发端口建立)。例如,如果您使用ssh -D 12345 user@ServerB,它将以代理用户身份连接到 ServerA,并将端口转发到 ServerB:22,然后连接到该端口并以用户身份向 ServerB 进行身份验证,并且它将在端口 12345 上安装 SOCKS5 代理。该 SOCKS5 的出口地址将是 ServerB,例如,如果您使用该代理(例如在浏览器中),远程方将看到您正在从 ServerB 的地址进行连接。

你可以堆叠更多的跳转主机,它也可以工作:

Host ServerB
    ProxyJump ServerA

Host ServerC
    ProxyJump ServerC

并将ssh ServerC首先连接到 ServerA,并通过端口转发到 ServerB:22,然后通过该转发连接到 ServerB,并通过另一个端口转发到 ServerC,然后连接到另一个端口,最终获得 ServerC shell。

请注意,您将被要求输入密码每个连接。这很麻烦。最好设置基于密钥的身份验证并使用ssh-agent

相关内容