[英]Reverse SSH with golang
我有一台服务器和一台远程计算机。 现在,我想通过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通过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())
}
}
我找到了解决方案。 如果提供,OpenSSH将返回终端会话或命令的输出。 此外,它还允许您通过开放隧道验证从服务器到客户端的连接。
为了支持此行为,我需要在远程端向ssh服务器实现提供开放连接的侦听器。 当时我想起来更复杂,但是行得通。
我在这里有一个工作示例服务器。 我只需要在示例代码中将侦听器交换为客户端连接上的侦听器。
您使用Client.Listen
(或Client.ListenTCP
)在服务器上设置转发端口。
然后,您可以像接受任何其他网络侦听器一样接受来自返回的侦听器的连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.