ホームページ  >  記事  >  バックエンド開発  >  Golang を使用して単純な SSH ポート転送を実装するにはどうすればよいですか?

Golang を使用して単純な SSH ポート転送を実装するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-05 04:19:02718ブラウズ

How to Implement Simple SSH Port Forwarding Using Golang?

Golang を利用したシンプルな SSH ポート転送: 複雑性を暴く

Go での SSH ポート転送の作成は、当初の想定に反して簡単な作業になる可能性があります。この記事では、プロセスをわかりやすくし、Golang でポート転送を実現する方法を明確に理解することを目的としています。

概念を理解する

SSH ポートを確立するには次に、ローカル ポートとリモート ポート間の接続を作成する必要があります。ローカル ポートからのデータは、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 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>

仕組み

  1. ローカル ソケット リスナー:クライアント アプリケーションがポート転送のために接続するローカル ポート (9000) 上のリスナー。
  2. SSH 接続の確立: クライアントがローカル ポートに接続すると、リモートへの SSH 接続が確立されます。
  3. リモート ソケット接続: SSH 接続が確立されたら、リモート サーバーのリモート ポート (9999) に接続します。
  4. データ転送: クライアントとリモート サーバー間で双方向データ ストリームが確立され、SSH 接続を通じてデータを安全に交換できるようになります。

キーポイント

  • ローカル リスナーは、ローカル ポート上の接続をリッスンします。
  • ローカル ポートで SSH 接続 が確立されると、接続が受け入れられます。
  • リモート接続は、リモート サーバーのリモート ポートへの接続を確立します。
  • データ転送は、ローカルとサーバーの間でデータを双方向にコピーします。リモート接続。

この例では、Golang での単純な SSH ポート転送の簡潔でわかりやすい実装を提供します。プロセスの各ステップを理解することで、安全なネットワーク通信のためにポート転送を効果的に利用できます。

以上がGolang を使用して単純な SSH ポート転送を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。