我有一台服务器和一台远程计算机。现在我想通过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())
}
}
答案 0 :(得分:3)
我找到了解决方案。如果提供一个命令,OpenSSH将返回一个终端会话或命令输出。此外,它允许您通过开放隧道验证从服务器到客户端的连接。
为了支持这种行为,我需要向远程端的ssh服务器实现提供开放连接的监听器。比我想的更复杂但是有效。
我有一个工作示例服务器here。我只需要在示例代码中为客户端连接上的侦听器交换侦听器。
答案 1 :(得分:2)
您使用Client.Listen
(或Client.ListenTCP
)设置服务器上的转发端口。
然后,您可以像接收任何其他网络侦听器一样接受来自返回侦听器的连接。