>  기사  >  백엔드 개발  >  Go에서 SSH 포트 전달을 어떻게 구현하나요?

Go에서 SSH 포트 전달을 어떻게 구현하나요?

Barbara Streisand
Barbara Streisand원래의
2024-11-05 02:12:02747검색

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>

설명

  • 포트 9000(localAddrString)에 로컬 리스너를 생성합니다.
  • 로컬 포트에 연결되면 SSH 클라이언트 연결을 설정합니다. 서버(sshClientConn).
  • 그런 다음 서버의 원격 포트(sshConn)에 연결합니다.
  • 로컬 연결에서 SSH 연결로 또는 그 반대로 데이터를 복사하는 데 별도의 고루틴이 사용됩니다. .
  • 이를 통해 로컬 포트와 원격 포트 간에 데이터를 전달할 수 있습니다.

위 내용은 Go에서 SSH 포트 전달을 어떻게 구현하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.