Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah anda melaksanakan pemajuan port SSH mudah dalam Go?

Bagaimanakah anda melaksanakan pemajuan port SSH mudah dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-11-11 02:51:03835semak imbas

How do you implement simple SSH port forwarding in Go?

Pemajuan Port SSH Mudah dalam Go

Pemajuan port ialah teknik yang berguna untuk mewujudkan terowong antara dua hos, membolehkan trafik disampaikan dengan selamat melalui pelayan perantara. Dalam Go, penghantaran port boleh dicapai menggunakan pakej golang.org/x/crypto/ssh.

Port Forward dengan Go

Persediaan port forward asas melibatkan:

  1. Mencipta pendengar setempat untuk menerima sambungan masuk.
  2. Mewujudkan sambungan SSH ke pelayan jauh.
  3. Memulakan sambungan ke port destinasi pada pelayan jauh.
  4. Menyampaikan data antara pendengar setempat dan sambungan jauh.

Contoh Kod

Berikut ialah contoh kod Go mudah yang menunjukkan pemajuan port dari port tempatan (9000) ke port jauh ( 9999) pada pelayan jauh:

<code class="go">package main

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

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

func forward(localConn net.Conn, config *ssh.ClientConfig) {
    // Establish SSH connection to remote server
    sshClientConn, err := ssh.Dial("tcp", serverAddrString, config)
    if err != nil {
        log.Fatalf("ssh.Dial failed: %s", err)
    }
    defer sshClientConn.Close()

    // Establish connection to remote destination port
    sshConn, err := sshClientConn.Dial("tcp", remoteAddrString)
    if err != nil {
        log.Fatalf("sshClientConn.Dial failed: %s", err)
    }
    defer sshConn.Close()

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

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

func main() {
    // Configure SSH client
    config := &ssh.ClientConfig{
        User: username,
        Auth: []ssh.AuthMethod{
            ssh.Password(password),
        },
    }

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

    // Accept incoming connections and forward them
    for {
        localConn, err := localListener.Accept()
        if err != nil {
            log.Fatalf("listener.Accept failed: %v", err)
        }

        go forward(localConn, config)
    }
}</code>

Kod ini bermula dengan mencipta pendengar tempatan pada port 9000, kemudian mewujudkan sambungan klien ke pelayan SSH jauh. Seterusnya, sambungan SSH dimulakan ke port destinasi (9999) pada pelayan jauh. Akhir sekali, data disampaikan antara sambungan tempatan dan jauh melalui goroutine.

Atas ialah kandungan terperinci Bagaimanakah anda melaksanakan pemajuan port SSH mudah dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn