Golang ssh portforwarding:管道错误

时间:2017-08-04 07:01:59

标签: mongodb go ssh graphql portforwarding

我正在尝试使用golang中的ssh port-forwarding连接到两个远程mongodb服务器,我的graphql服务器使用它来进行查询。两个隧道的中间主机是相同的。所以假设中间主机是123.45.678.678,两个远程mongodb服务器是1.23.45.67和1.23.45.78,我创建这样的隧道,

conn, err := ssh.Dial("tcp", 123.45.678.678, config)
if err != nil {
    panic(err)
}

remote1, err := conn.Dial("tcp", "1.23.45.67:27017")
if err != nil {
    panic(err)
}


remote2, err := conn.Dial("tcp", "1.23.45.78:27017")
if err != nil {
    panic(err)
}

local1, err := net.Listen("tcp", "localhost:27018")
if err != nil {
    panic(err)
}

local2, err := net.Listen("tcp", "localhost:27019")
if err != nil {
    panic(err)
}

现在我将流量从local1转发到remote1,将local2转发到remote2,就像这样

go func() {
    for {
        l, err := local1.Accept()
        if err != nil {
            panic(err)
        }
        go func() {
            _, err := io.Copy(l, remote1)
            if err != nil {
                panic(err)
            }
        }()
        go func() {
            _, err := io.Copy(remote1, l)
            if err != nil {
                panic(err)
            }
        }()
    }
}()
go func() {
    for {
        l, err := local2.Accept()
        if err != nil {
            panic(err)
        }
        go func() {
            _, err := io.Copy(l, remote2)
            if err != nil {
                panic(err)
            }
        }()
        go func() {
            _, err := io.Copy(remote2, l)
            if err != nil {
                panic(err)
            }
        }()
    }
}()

我使用mgo.Dial创建两个mongo会话,并在调用此函数时将这两个会话导出到graphql。对于需要两个会话的一些查询(不是所有查询,只有一些复杂的查询),我看到写:破坏管道错误

 panic: readfrom tcp 127.0.0.1:27019->127.0.0.1:53128: write tcp 127.0.0.1:27019->127.0.0.1:53128: write: broken pipe

当我调试这个时,我发现在上面的代码片段中l和remote2之间发生io.copy时会发生这个错误,我想这是因为remote2隧道断开连接。

tcpdump显示中间主机在一段时间之后将结束标志发送到remote2服务器,这导致终止连接。我想知道如何解决这个问题。

0 个答案:

没有答案