使用 Golang 實現 SSH 隧道功能


文章目錄:

  • 目標
    • golang.org/x/crypto
    • gopkg.in/yaml.v2
  • 注意
    • 本文講的是客戶端部分

文章使用到的軟件:

  • Mac 12.0 Beta(macOS Monterey),處理器為:M1
  • Goland 2021.1.3
  • Golang 1.17beta1

目標

  • 通過Go在客戶端實現ssh隧道功能並連接到服務器的mysql

Go程序

在工作目錄創建一個go應用程序,並配置SSH的信息....還是看注釋吧! 阿巴阿巴阿巴

package main

func main() {
	// 設置SSH配置
	config := &ssh.ClientConfig{
  	// 服務器用戶名
		User: "",
		Auth: []ssh.AuthMethod{
    	// 服務器密碼
			ssh.Password(""),
		},
		Timeout: 30 * time.Second,
		HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
			return nil
		},
	}
  
	// 設置本地監聽器,格式:地址:端口
  localListener, err := net.Listen("tcp", "localhost:13306")
	if err != nil {
		fmt.Printf("net.Listen failed: %v\n", err)
	}
  
  for {
		localConn, err := localListener.Accept()
		if err != nil {
			fmt.Printf("localListener.Accept failed: %v\n", err)
		}
		go forward(localConn, config)
	}
}

// 轉發
func forward(localConn net.Conn, config *ssh.ClientConfig) {
	// 設置服務器地址,格式:地址:端口
	sshClientConn, err := ssh.Dial("tcp", "", config)
	if err != nil {
		fmt.Printf("ssh.Dial failed: %s", err)
	}

	// 設置遠程地址,格式:地址:端口(請在服務器通過 ifconfig 查看地址)
	sshConn, err := sshClientConn.Dial("tcp", "")

	// 將localConn.Reader復制到sshConn.Writer
	go func() {
		_, err = io.Copy(sshConn, localConn)
		if err != nil {
			fmt.Printf("io.Copy failed: %v", err)
		}
	}()

	// 將sshConn.Reader復制到localConn.Writer
	go func() {
		_, err = io.Copy(localConn, sshConn)
		if err != nil {
			fmt.Printf("io.Copy failed: %v", err)
		}
	}()
}

快速安排

給不想寫的朋友們安排了一個擴展包 (早說嘛...)

go get -u github.com/dtapps/dtapps/go-ssh-tunnel

擴展包使用

package main

import (
	"github.com/dtapps/dtapps/go-ssh-tunnel/dssh"
)

func main() {
	dssh.Tunnel("root", "", ":22", ":3306", "localhost:13306")
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM