使用 golang 反向 SSH

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


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


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


ssh- R 19999:localhost:22 user@192.168.0.10

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


ssh localhost -p 19999

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


我知道如何从 go 通过 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())

    }

}


MM们
浏览 235回答 2
2回答

侃侃无极

我找到了解决方案。OpenSSH 返回一个终端会话或命令的输出(如果您提供)。此外,它允许您通过开放隧道验证从服务器到客户端的连接。为了支持这种行为,我需要将打开连接的侦听器提供给远程端 go 中的 ssh 服务器实现。比我想的更复杂,但它有效。我在这里有一个工作示例服务器。我只需要将示例代码中的侦听器交换为客户端连接上的侦听器。

catspeake

您使用Client.Listen(或Client.ListenTCP) 在服务器上设置转发端口。然后,您可以像接受任何其他网络侦听器一样接受来自返回的侦听器的连接。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go