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

Comment puis-je implémenter la redirection de port SSH dans Go ?

Barbara Streisand
Libérer: 2024-11-05 02:12:02
original
790 Les gens l'ont consulté

How can I implement SSH port forwarding in Go?

Redirection de port SSH simple dans Go

Dans cet article, nous allons nous plonger dans la création et la fermeture d'une redirection de port TCP de base via SSH à l'aide de Go, spécifiquement pour les nouveaux arrivants sur Go et les langages typés statiquement. Nous fournirons une solution claire et concise en décomposant le processus en étapes compréhensibles.

Contexte et objectif

Nous visons à reproduire la fonctionnalité d'une commande de terminal comme "ssh -L 9000:localhost:9999 username@server" par programme à l'aide de Go. Cette commande établit une redirection de port du port local 9000 vers le port distant 9999 sur le serveur spécifié.

Aperçu de la solution

Pour y parvenir, nous allons créer un écouteur local sur le port 9000 et configurez une connexion client SSH avec le serveur distant. Lorsque le port local reçoit une demande, nous établissons une connexion avec le port distant et transmettons les données dans les deux sens.

Répartition du code

<code class="go">package main

import (
    "io"
    "log"
    "net"
    "golang.org/x/crypto/ssh"
)

var (
    username         = "root"
    password         = "password"
    serverAddrString = "192.168.1.100:22"
    localAddrString  = "localhost:9000"
    remoteAddrString = "localhost:9999"
)

func forward(localConn net.Conn, config *ssh.ClientConfig) {
    sshClientConn, err := ssh.Dial("tcp", serverAddrString, config)
    if err != nil {
        log.Fatalf("ssh.Dial failed: %s", err)
    }
    sshConn, err := sshClientConn.Dial("tcp", remoteAddrString)
    go func() { _, err = io.Copy(sshConn, localConn) }()
    go func() { _, err = io.Copy(localConn, sshConn) }()
}

func main() {
    config := &ssh.ClientConfig{
        User: username,
        Auth: []ssh.AuthMethod{
            ssh.Password(password),
        },
    }
    localListener, err := net.Listen("tcp", localAddrString)
    if err != nil {
        log.Fatalf("net.Listen failed: %v", err)
    }
    for {
        localConn, err := localListener.Accept()
        if err != nil {
            log.Fatalf("listen.Accept failed: %v", err)
        }
        go forward(localConn, config)
    }
}</code>
Copier après la connexion

Explication

  • Nous créons un écouteur local sur le port 9000 (localAddrString).
  • Lorsqu'une connexion est établie sur le port local, nous établissons une connexion client SSH vers le serveur (sshClientConn).
  • Nous nous connectons ensuite au port distant du serveur (sshConn).
  • Des goroutines séparées sont utilisées pour copier les données de la connexion locale vers la connexion SSH et vice versa .
  • Cela permet de transférer les données entre les ports locaux et distants.

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:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal