用golang反向SSH

时间:2015-10-09 14:15:11

标签: ssh go

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

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

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

ssh- R 19999:localhost:22 user@192.168.0.10

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

ssh localhost -p 19999

我希望在远程计算机上使用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())
    }
}

2 个答案:

答案 0 :(得分:3)

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

为了支持这种行为,我需要向远程端的ssh服务器实现提供开放连接的监听器。比我想的更复杂但是有效。

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

答案 1 :(得分:2)

您使用Client.Listen(或Client.ListenTCP)设置服务器上的转发端口。

然后,您可以像接收任何其他网络侦听器一样接受来自返回侦听器的连接。