Maison  >  Article  >  développement back-end  >  Comment implémenter une redirection de port SSH simple à l'aide de Golang ?

Comment implémenter une redirection de port SSH simple à l'aide de Golang ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-05 04:19:02665parcourir

How to Implement Simple SSH Port Forwarding Using Golang?

Redirection de port SSH simple à l'aide de Golang : démystifier la complexité

Créer des redirections de port SSH dans Go peut être une tâche simple, contrairement aux hypothèses initiales . Dans cet article, nous visons à démystifier le processus et à fournir une compréhension claire de la façon de réaliser la redirection de port dans Golang.

Comprendre le concept

Pour établir un port SSH en avant, nous devons créer une connexion entre un port local et un port distant. Les données du port local sont transférées via la connexion SSH vers le port distant. Cela permet un accès sécurisé aux services ou aux applications exécutés sur la machine distante via le port local.

Implémentation d'un redirecteur de port simple

Plongeons-nous dans les écrous et les boulons de redirection de port. Voici l'extrait de code clé qui atteint notre objectif :

<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 main() {
    // Configure SSH connection
    config := &ssh.ClientConfig{
        User: username,
        Auth: []ssh.AuthMethod{
            ssh.Password(password),
        },
    }

    // Listen for local port connections
    localListener, err := net.Listen("tcp", localAddrString)
    if err != nil {
        log.Fatalf("net.Listen failed: %v", err)
    }

    for {
        // Accept local port connections
        localConn, err := localListener.Accept()
        if err != nil {
            log.Fatalf("listen.Accept failed: %v", err)
        }

        // Create SSH connection and dial remote port
        sshClientConn, err := ssh.Dial("tcp", serverAddrString, config)
        if err != nil {
            log.Fatalf("ssh.Dial failed: %s", err)
        }

        // Establish remote port connection
        sshConn, err := sshClientConn.Dial("tcp", remoteAddrString)

        // Copy data between local and remote connections
        go func() {
            _, err = io.Copy(sshConn, localConn)
            if err != nil {
                log.Fatalf("io.Copy failed: %v", err)
            }
        }()

        go func() {
            _, err = io.Copy(localConn, sshConn)
            if err != nil {
                log.Fatalf("io.Copy failed: %v", err)
            }
        }()
    }
}</code>

Comment ça marche

  1. Local Socket Listener : Nous lançons un écouteur sur le port local (9000) où les applications clientes se connecteront pour la redirection de port.
  2. Établissement de la connexion SSH : Lorsqu'un client se connecte au port local, nous établissons une connexion SSH avec le port distant serveur en utilisant le nom d'utilisateur et le mot de passe fournis.
  3. Connexion socket à distance : Une fois la connexion SSH établie, nous nous connectons au port distant (9999) sur le serveur distant.
  4. Transfert de données : Un flux de données bidirectionnel est établi entre le client et le serveur distant, permettant un échange de données en toute sécurité via la connexion SSH.

Clé Points

  • Un auditeur local écoute les connexions sur le port local.
  • Une connexion SSH est établie une fois qu'un port local la connexion est acceptée.
  • Connexion à distance établit une connexion au port distant sur le serveur distant.
  • Transfert de données copie les données de manière bidirectionnelle entre le serveur local et connexions à distance.

Cet exemple fournit une implémentation concise et facile à suivre d'une simple redirection de port SSH dans Golang. En comprenant chaque étape du processus, vous pouvez utiliser efficacement la redirection de port pour une communication réseau sécurisée.

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:
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