Heim >Backend-Entwicklung >Golang >SSH-Agent, falsche Paketlänge
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.
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.
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!