使用golang进行反向SSH连接

5
我有一台服务器和一台远程计算机。现在我想通过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())
    }
}
2个回答

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

嘿,我试了一下你的server_complex.go,但是它不起作用,我得到了这个错误:2016/11/21 16:56:04 new ssh connection from 193.40.242.84:53374 (SSH-2.0-Go) 2016/11/21 16:56:04 recieved out-of-band request: &{Type:tcpip-forward WantReply:true Payload:[0 0 0 7 48 46 48 46 48 46 48 0 0 85 241] ch:<nil> mux:0x105675c0} - Anton

2

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接