使用 SSH 建立两跳隧道,最后一跳通过反向 SSH 隧道连接

使用 SSH 建立两跳隧道,最后一跳通过反向 SSH 隧道连接

我想使用 OpenSSH 允许通过两跳进行端口转发,最后一跳通过反向隧道连接。

以下是我当前的设置:

  1. 服务器 B 在端口 10000 上运行 sshd。服务器 C 在端口 20000 上运行 sshd

  2. 客户端 A 通过“普通” SSH 连接到服务器 B

  3. 服务器 C 在端口 30000 上打开到服务器 B 的反向 SSH 隧道

  4. 服务器 B 通过该反向隧道连接到服务器 C

我想要做的:在客户端 A 上打开一个端口,将客户端 A 的连接通过服务器 B 转发到服务器 C(通过服务器 B 和服务器 C 之间建立的反向 SSH 隧道)

以下是我目前正在使用的各个命令:

  1. 客户端 A 通过“普通” SSH 连接到服务器 B:

     ClientAHostName $  ssh -p 10000 User@ServerBHostName
    
  2. 服务器 C 在端口 30000 上打开到服务器 B 的反向 SSH 隧道:

    ServerCHostName $  ssh -p 10000 -N -R 30000:localhost:20000 User@ServerBHostName
    
  3. 服务器 B 通过该反向隧道连接到服务器 C:

    ServerBHostName $  ssh -p 30000 User@localhost
    

我之所以要这样做,是为了能够通过 Web 浏览器(使用转发端口)从客户端 A 控制服务器 C 上的某些服务。由于客户端 A 和服务器 C 的 ISP 的限制,我无法直接从服务器 B(或客户端 A)连接到服务器 C,也无法从服务器 C 连接到客户端 A。

答案1

为了简化操作,我喜欢为每个服务器分配一个端口号或范围。保留您开始时的端口号,B 是 10000,C 是 20000,忘记 30000。

设置:

A$ ssh -p 10000 -N -L 20000:localhost:20000 UserB@B
C$ ssh -p 10000 -N -R 20000:localhost:20000 UserB@B

现在你应该可以做到

A$ ssh -p 20000 UserC@localhost

在 C 上获取 shell,并假设您想要连接到在服务器 C 端口 8080 上运行的 Web 服务器:

A$ ssh -p 20000 -N -L 8080:localhost:8080 UserC@localhost

连接到:

http://localhost:8080/

相关内容