卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34887本站已运行393

SSH 代理,数据包长度错误

ssh 代理,数据包长度错误

php小编新一今天为大家介绍一种常见的网络错误——“SSH 代理,数据包长度错误”。在使用SSH代理工具时,有时候会遇到这个错误提示,而造成网络连接失败。该错误通常是因为数据包长度设置不正确所致。在本文中,我们将详细解释这个错误的原因,并提供一些解决方法来解决这个问题,确保您的网络连接畅通无阻。

问题内容

在 go 中实现 ssh 代理,由于数据包长度错误而出错,这些是 ssh 在调试模式下的错误:

debug1: ssh2_msg_kexinit sent
bad packet length 1231976033.
ssh_dispatch_run_fatal: connection to ::1 port 8080: message authentication code incorrect

代码:

func handleSSH(conn net.Conn, r *bufio.Reader, protocol string) {

    target, err := url.Parse("ssh://localhost:3333")
    if err != nil {
        fmt.Println("Error parsing target", err)
        conn.Close()
        return
    }

    targetConn, err := net.Dial("tcp", target.Host)
    if err != nil {
        fmt.Println("error dialing SSH target:", err)
        conn.Close()
        return
    }

    defer targetConn.Close()

    var wg sync.WaitGroup
    wg.Add(2)
    go func() {
        _, err := io.Copy(targetConn, conn)
        if err != nil {
            fmt.Println("error copying data to target:", err)
        }
        wg.Done()
    }()

    go func() {
        _, err := io.Copy(conn, targetConn)
        if err != nil {
            fmt.Println("error copying data from target:", err)
        }
        wg.Done()
    }()

    wg.Wait()
    conn.Close()
}

// EDIT

func connection(conn net.Conn) {

    r := bufio.NewReader(conn)
    protocol, err := r.ReadString('n')
    if err != nil {
        fmt.Println("Error reading first line", err)
        conn.Close()
        return
    }

if protocol[0:3] == "SSH" {
        handleSSH(conn, r, protocol)
    }
}

func main() {
   ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        panic(err)
    }
    defer ln.Close()

    for {
        conn, err := ln.Accept()
        if err != nil {
            panic(err)
        }
        go connection(conn)
    }
}

编辑:添加了有关如何启动连接并重现错误的相关信息的代码。

我最好的猜测是 ssh 协商过程被中断,并且事情不同步。

解决方法

代码从客户端读取第一行并检查协议类型,以便调用适当的处理程序:

protocol, err := r.ReadString('n')
...
if protocol[0:3] == "SSH" {
        handleSSH(conn, r, protocol)
    }
}

但是代码无法将已读取的字节转发到连接的服务器。这些字节位于 protocol 中,并提供给 handlessh。但是一旦建立连接,它就无法将这些字节发送到连接的服务器。相反,它仅在客户端和服务器之间复制新数据。

这意味着服务器没有从客户端获取第一行。因此,它可能会抱怨诸如 invalid ssh id string. 之类的协议错误,该错误被转发到客户端并被误解为来自 ssh 连接的有效数据。

卓越飞翔博客
上一篇: golang中如何声明多个接口约束?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏