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>
説明
以上がGo で SSH ポート転送を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。