如何使用反向 SSH 隧道与多个跳转服务器

如何使用反向 SSH 隧道与多个跳转服务器

在下面的示例架构中我将如何使用 SSH 隧道?

场景:我已物理登录到 Windows PC Local,并希望使用端口 3389 远程桌面进入 Windows PC Remote。Windows PC Local 和网络 A Linux 服务器之间有防火墙,只允许我从本地 PC 通过 SSH 连接到网络 A 上的 Linux 服务器。是否可以在网络 A Linux 服务器上建立一条通往 Windows PC Remote 的反向隧道?我认为必须建立 3 条或更多隧道并将其链接在一起才能实现此目的,但我不知道如何做或是否可行。

Windows PC Local    Linux Server   .-,(  ),-.         can ssh                     Linux Server    Windows PC Remote
     __| _             __| _    .-(          )-.----------------->    .-,(  ),-.       __| _         __  _|        
    [__]|=|-----------[__]|=|---(  Network A   )                   .-(          )-.   [__]|=|-------[__]|=|        
    /::/|_|           /::/|_|   '-(         ).-'                   (    Network B  )--/::/|_|       /::/|_|        
                                   '-.( ).-'   <-----------------   '-(        ).-'                                
                                                      can't ssh        '-.( ).-'                                   

答案1

您实际上可以通过两个 Linux 服务器之间的单个 SSH 隧道来实现这一点,更具体地说,从网络 A 上的隧道到网络 B 上的隧道(可以使用 SSH 的方向)。

假设你想通过远程桌面进入远程 Windows 计算机(网络 B 侧的计算机),那么你需要一个直接的SSH 隧道。

(如果您想通过在网络 A 中的 Linux 服务器上发起的 SSH 连接将网络 A 中的机器上的服务公开到网络 B 中的机器,则可以使用反向 SSH 隧道。)

为了理解如何设置,让我们为所涉及的机器和接口分配一些 IP 地址和名称。否则,很难理解哪些确切的地址和名称应该放在哪里。

我们将这些地址用于本地网络:

Windows PC Local               Linux Server           .-,(  ),-.   
 __| _                            __| _            .-(          )-.
[__]|=|--------------------------[__]|=|-----------(  Network A   )
/::/|_|                          /::/|_|           '-(         ).-'
    192.168.10.7      192.168.10.4    301.2.3.4       '-.( ).-'    
    workstation7        linrouter4    a.example.com                

然后是远程网络的地址:

                         Linux Server               Windows PC Remote
   .-,(  ),-.                 __| _                            __  _|
.-(          )-.             [__]|=|--------------------------[__]|=|
(    Network B  )------------/::/|_|                          /::/|_|
 '-(        ).-'     321.9.8.7    172.24.10.99     172.24.10.76      
    '-.( ).-'    b.example.net    gateway1.lan     remote76.lan      

仅可视化两个 Linux 服务器之间的互连:

Linux Server         .-,(  ),-.     can ssh                             Linux Server
 __| _            .-(          )-.------------>    .-,(  ),-.                 __| _ 
[__]|=|-----------(  Network A   )              .-(          )-.             [__]|=|
/::/|_|           '-(         ).-'              (    Network B  )------------/::/|_|
     301.2.3.4       '-.( ).-'   <------------   '-(        ).-'     321.9.8.7      
     a.example.com                  can't ssh       '-.( ).-'    b.example.net      

因此,为了创建一个允许您连接到远程 Windows 机器的 SSH 隧道,您需要:

linrouter4$ ssh-L 192.168.10.4:3389:remote76.lan:3389 [电子邮件保护]

建立 SSH 连接后,workstation7您可以从 Windows 机器上打开到默认端口的 RDP 连接,您将获得到远程主机上linrouter4Windows 机器的转发连接。remote76.lan

隧道使用-L标志配置为 SSH,最多可容纳 4 个以冒号分隔的地址或端口。

第一对表示在网络上接收连接的地址和端口当地的主机。IP 地址必须是在当地的当然是主机,否则主机将无法接收该地址的连接...我们linrouter4在本地网络中使用地址,以便本地网络中的其他机器能够访问该隧道。

下一个项目是本地端口。我们使用默认端口 3389,因此我们的 RDP 客户端可以连接到默认端口。如果您正在配置多个 SSH 隧道或使用该端口在该计算机上运行其他服务,则可能需要选择备用端口,在这种情况下,您必须重新配置 RDP 客户端以连接到非标准端口。对于这个简单的示例,我们通过使用默认端口来绕过该端口。

最后一对地址和端口是当连接到达另一端的隧道时我们的目标主机 ( ) 应该连接的地址和端口。请注意,名称解析将在目标主机上进行,因此即使本地计算机无法解析该名称,gateway1.lan我们也可以使用名称。remote76.lanlinrouter4

最后,我们有远程端口,它再次是默认值 3389。

然后我们使用常规参数连接到远程主机,使用其外部地址( )并根据需要b.example.net指定用户名( )。还可以传递身份验证或其他设置所需的任何其他参数。myuser

-L标志也可以只采用 3 个项目而不是 4 个,在这种情况下会跳过本地地址。例如,-L 3389:remote76.lan:3389。但这只会在本地主机 (127.0.0.1) 上公开它,这意味着它linrouter4本身可以通过隧道打开连接,但不能打开连接到该机器的其他主机。(换句话说,我们需要完整的规范。)

最后,请注意,我们对远程主机使用了主机名,但我们也可以使用 IP。对于本地主机也一样,我们可以使用名称而不是 IP,假设机器会将名称解析为内部 IP。

也可以:

  • -L 192.168.10.4:3389:172.24.10.76:3389
  • -L linrouter4:3389:remote76.lan:3389

此外,您可以'*'在本地端使用让该主机接受连接任何接口:-L '*:3389:remote76.lan:3389'。(请注意,使用时需要使用引号,*因为 shell 可以将其解释为元字符。)使用*并不理想,因为这意味着来自网络 A(互联网?)的访问可能能够使用 SSH 隧道到达远程网络中的受保护主机。使用显式内部专用地址肯定是一种更安全的配置(即使您可能会将该隧道暴露给所有的内部网络,除非您明确设置防火墙以仅允许特定主机。)

相关内容