首頁 >後端開發 >Golang >SSH 代理,封包長度錯誤

SSH 代理,封包長度錯誤

WBOY
WBOY轉載
2024-02-09 14:00:36911瀏覽

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 連接的有效資料。

以上是SSH 代理,封包長度錯誤的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除