Heim >Backend-Entwicklung >Golang >SSH-Agent, falsche Paketlänge

SSH-Agent, falsche Paketlänge

WBOY
WBOYnach vorne
2024-02-09 14:00:36911Durchsuche

SSH 代理,数据包长度错误

PHP-Editor Xinyi stellt Ihnen heute einen häufigen Netzwerkfehler vor – „SSH-Proxy, Paketlängenfehler“. Bei Verwendung des SSH-Agent-Tools wird manchmal diese Fehlermeldung angezeigt, die dazu führt, dass die Netzwerkverbindung fehlschlägt. Dieser Fehler wird normalerweise dadurch verursacht, dass die Paketlänge falsch eingestellt ist. In diesem Artikel erklären wir die Ursache dieses Fehlers im Detail und bieten einige Lösungen zur Behebung des Problems und stellen sicher, dass Ihre Netzwerkverbindung reibungslos funktioniert.

Frageinhalt

Implementieren des SSH-Proxys in Go, Fehler aufgrund falscher Paketlänge, das sind die Fehler von SSH im Debug-Modus:

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

Code:

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

BEARBEITEN: Code mit relevanten Informationen zum Herstellen der Verbindung und Reproduzieren des Fehlers hinzugefügt.

Meine beste Vermutung ist, dass der SSH-Aushandlungsprozess unterbrochen wurde und die Dinge nicht mehr synchron waren.

Workaround

Der Code liest die erste Zeile vom Client und überprüft den Protokolltyp, sodass der entsprechende Handler aufgerufen wird:

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

Aber der Code kann die gelesenen Bytes nicht an den verbundenen Server weiterleiten. Diese Bytes befinden sich unter protocol 中,并提供给 handlessh. Sobald die Verbindung jedoch hergestellt ist, können diese Bytes nicht mehr an den verbundenen Server gesendet werden. Stattdessen werden nur neue Daten zwischen Client und Server kopiert.

Das bedeutet, dass der Server die erste Zeile nicht vom Client erhält. Daher kann es zu einer Beschwerde über einen Protokollfehler wie invalid ssh id string. kommen, der an den Client weitergeleitet und fälschlicherweise als gültige Daten von der SSH-Verbindung interpretiert wird.

Das obige ist der detaillierte Inhalt vonSSH-Agent, falsche Paketlänge. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen