Maison >développement back-end >Golang >Agent SSH, longueur de paquet incorrecte

Agent SSH, longueur de paquet incorrecte

WBOY
WBOYavant
2024-02-09 14:00:36911parcourir

SSH 代理,数据包长度错误

L'éditeur PHP Xinyi vous présente aujourd'hui une erreur réseau courante - "Proxy SSH, erreur de longueur de paquet". Lorsque vous utilisez l'outil agent SSH, vous rencontrez parfois ce message d'erreur, provoquant l'échec de la connexion réseau. Cette erreur est généralement causée par une longueur de paquet mal définie. Dans cet article, nous expliquerons en détail la cause de cette erreur et proposerons quelques solutions pour résoudre ce problème et garantir le bon fonctionnement de votre connexion réseau.

Contenu de la question

Implémentation du proxy ssh en go, erreur due à une mauvaise longueur de paquet, voici les erreurs de ssh en mode débogage :

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

EDIT : ajout de code avec des informations pertinentes sur la façon d'initier la connexion et de reproduire l'erreur.

Ma meilleure hypothèse est que le processus de négociation ssh a été interrompu et que les choses se sont désynchronisées.

Solution de contournement

Le code lit la première ligne du client et vérifie le type de protocole afin que le gestionnaire approprié soit appelé :

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

Mais le code ne peut pas transmettre les octets lus au serveur connecté. Ces octets sont situés en protocol 中,并提供给 handlessh. Mais une fois la connexion établie, il ne peut pas envoyer ces octets au serveur connecté. Au lieu de cela, il copie uniquement les nouvelles données entre le client et le serveur.

Cela signifie que le serveur ne reçoit pas la première ligne du client. Par conséquent, il peut se plaindre d'une erreur de protocole telle que invalid ssh id string. qui est transmise au client et interprétée à tort comme des données valides de la connexion ssh.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer