我是 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
。