使用 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")
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李光春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值