用golang反向SSH

ark*_*hon 5 ssh go

我有一台服务器和一台远程计算机.现在我想通过SSH访问远程计算机,但它可能是在NAT后面.这是我想要反向SSH连接的原因之一.

我们的想法是建立从远程计算机到服务器的连接,并使用此连接通过SSH从服务器与远程计算机进行通信.

使用OpenSSH这很容易.从远程计算机我打开反向SSH隧道:

ssh- R 19999:localhost:22 user@192.168.0.10
Run Code Online (Sandbox Code Playgroud)

现在我可以从服务器端使用它:

ssh localhost -p 19999
Run Code Online (Sandbox Code Playgroud)

我想在远程计算机上使用go应用程序和go SSH库实现相同的行为.服务器仍将使用OpenSSH,因此不应更改.

我知道如何通过SSH连接到计算机,但如何实现相反的部分呢?

func main() {
    config := &ssh.ClientConfig{
        User: "vagrant",
        Auth: []ssh.AuthMethod{
            ssh.Password("vagrant"),
        },
    }

    conn, err := ssh.Dial("tcp", "192.168.0.10:22", config)
    if err != nil {
        panic("Failed to dial: " + err.Error())
    }
}
Run Code Online (Sandbox Code Playgroud)

ark*_*hon 3

我找到了解决方案。OpenSSH 返回终端会话或命令的输出(如果您提供)。此外,它允许您通过开放隧道验证从服务器到客户端的连接。

为了支持这种行为,我需要在远程端的 go 中提供与 ssh 服务器实现的开放连接的侦听器。比我想象的更复杂,但它有效。

我在这里有一个工作示例服务器。我只需要将示例代码中的侦听器交换为客户端连接上的侦听器。