Maison > développement back-end > Golang > le corps du texte

Agent SSH, longueur de paquet incorrecte

WBOY
Libérer: 2024-02-09 14:00:36
avant
864 Les gens l'ont consulté

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
Copier après la connexion

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)
    }
}
Copier après la connexion

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)
    }
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!