【问题标题】:Reverse SSH with golang使用 golang 反向 SSH
【发布时间】:2016-01-07 12:54:39
【问题描述】:

我有一台服务器和一台远程计算机。现在我想通过 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 从 go 连接到计算机,但是如何实现反向部分?

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())
    }
}

【问题讨论】:

    标签: ssh go


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      为了支持这种行为,我需要将打开连接的侦听器提供给远程端的 ssh 服务器实现。比我想象的要复杂,但它确实有效。

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

      【讨论】:

      • 嘿,我试过你的 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 收到带外请求:&{Type:tcpip-forward WantReply:true Payload:[0 0 0 7 48 46 48 46 48 46 48 0 0 85 241] ch: mux:0x105675c0}
      猜你喜欢
      • 2021-09-16
      • 2014-09-06
      • 2012-06-06
      • 2015-03-09
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      相关资源
      最近更新 更多