首頁 > 後端開發 > Golang > 如何在 Go 中實現 SSH 連接埠轉送?

如何在 Go 中實現 SSH 連接埠轉送?

Barbara Streisand
發布: 2024-11-05 02:12:02
原創
817 人瀏覽過

How can I implement SSH port forwarding in Go?

Go 中的簡單SSH 連接埠轉送

在本文中,我們將深入研究使用SSH 建立和關閉基本TCP 連接埠轉送Go,專門針對Go 和靜態型別語言的新手。我們將透過將流程分解為可理解的步驟來提供清晰簡潔的解決方案。

背景和目標

我們的目標是複製終端命令的功能,例如使用Go 以程式設計方式“ssh -L 9000:localhost:9999 username@server” 。此命令在指定伺服器上建立從本機連接埠 9000 到遠端連接埠 9999 的連接埠轉送。

解決方案概要

為了實現此目的,我們將建立一個本地偵聽連接埠 9000 並與遠端伺服器建立 SSH 用戶端連線。當本機連接埠收到請求時,我們將與遠端連接埠建立連線並來回轉送資料。

程式碼分解

<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>
登入後複製

說明

  • 我們在連接埠上建立一個本機連接埠監聽器。
  • 當連線到本機連接埠時,我們會建立一個 SSH 用戶端連線伺服器 (sshClientConn)。
  • 然後我們連接到伺服器 (sshConn) 上的遠端連接埠。
  • 單獨的 goroutine 用於將資料從本地連接複製到 SSH 連接,反之亦然.
  • 這允許資料在本地和遠端連接埠之間轉送。

以上是如何在 Go 中實現 SSH 連接埠轉送?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板