ポート転送は、2 つのホスト間にトンネルを確立し、中間サーバーを介してトラフィックを安全に中継できるようにする便利な手法です。 Go では、golang.org/x/crypto/ssh パッケージを使用してポート転送を実現できます。
基本的なポート転送設定には次のものが含まれます。
これは、ローカル ポート (9000) からリモート ポート (9999) へのポート転送を示す簡単な Go コード例です。リモート サーバー:
<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>
このコードは、ポート 9000 でローカル リスナーを作成することから始まり、次にリモート SSH サーバーへのクライアント接続を確立します。次に、リモート サーバー上の宛先ポート (9999) への SSH 接続が開始されます。最後に、データはゴルーチンを介してローカル接続とリモート接続の間で中継されます。
以上がGo で単純な SSH ポート転送を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。