使用golang反向SSH

I have a server and a remote computer. Now I want to access the remote computer via SSH but it is possible that it is behind a NAT. That's one of the reasons I want a reverse SSH connection.

The idea is to establish a connection from the remote computer to the server and use this connection to communicate via SSH from the server to the remote computer.

With OpenSSH this is quite easy. From the remote computer I open the reverse SSH tunnel:

ssh- R 19999:localhost:22 user@192.168.0.10

Now I can use this from the server side with:

ssh localhost -p 19999

I want to achieve the same behavior with a go application and the go SSH library on the remote computer. The server will still use OpenSSH so it should not be changed.

I know how to connect to a computer via SSH from go but how can the reverse part be achieved?

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

2个回答



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

为支持此行为,我需要在远程端向ssh服务器实现提供开放连接的侦听器。 然后,我想到了更复杂的方法,但是它可以工作。</ p>

我有一个工作示例服务器此处。 我只需要在示例代码中将侦听器交换为客户端连接上的侦听器。</ p>
</ div>

展开原文

原文

I found a solution. OpenSSH returns a terminal session or the output of a command if you supply one. Furthermore it allows you to authenticate the connection from the server to the client over the open tunnel.

To support this behavior I needed to supply the listener of the open connection to a ssh server implementet in go on the remote side. More complicated then I thought but it works.

I got a working example server here. I just need to exchange the listener in the example code for a listener on the client connection.

drgm51600
drgm51600 嘿,我尝试了您的server_complex.go,它不起作用,我收到了错误消息:2016/11/21 16:56:04来自193.40.242.84:53374(SSH-2.0-Go)的新ssh连接2016/11/21 16:56:04收到带外请求:&{Type:tcpip-forward WantReply:true有效负载:[0 0 0 7 48 46 48 46 48 46 48 0 0 85 241] ch:<nil> mux:0x105675c0 }
接近 4 年之前 回复



您使用 Client.Listen </ code> (或 Client.ListenTCP </ code> )来设置服务器上的转发端口。</ p>

然后,您可以接受来自返回的侦听器的连接 就像其他网络侦听器一样。 </ p>
</ div>

展开原文

原文

You use Client.Listen (or Client.ListenTCP) to setup the forwarding port on the server.

You can then accept connections from the returned listener just as you would any other network listener.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐