golang快速创建SSH隧道命令行工具插件mole的使用

Golang快速创建SSH隧道命令行工具插件mole的使用

Mole是一个专注于弹性和用户体验的CLI应用程序,用于创建SSH隧道。

安装与构建

要构建Mole,您的系统需要安装Go 1.17.1或更高版本。

$ make build

测试与代码覆盖率

运行测试:

$ make test

生成代码覆盖率报告:

$ make cover && open coverage.html

静态代码分析

  1. 首先安装golangci-lint
  2. 然后运行:
$ make lint

基本使用示例

以下是一个使用Mole创建SSH隧道的示例代码:

package main

import (
	"github.com/davrodpin/mole"
)

func main() {
	// 创建隧道配置
	t := &mole.Tunnel{
		Local:     "localhost:8080",  // 本地监听地址
		Remote:    "remote:80",       // 远程目标地址
		Server:    "ssh.example.com", // SSH服务器地址
		Key:       "/path/to/key",    // SSH私钥路径
		User:      "username",        // SSH用户名
		KeepAlive: true,              // 保持连接
	}

	// 启动隧道
	err := t.Start()
	if err != nil {
		panic(err)
	}
}

命令行使用示例

Mole也可以通过命令行直接使用:

# 基本SSH隧道
$ mole start --local :8080 --remote remote:80 --server ssh.example.com --key ~/.ssh/id_rsa

# 使用别名配置
$ mole start --alias my-tunnel

测试环境

项目提供了一个小型自动化基础设施来帮助进行手动测试。


更多关于golang快速创建SSH隧道命令行工具插件mole的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang快速创建SSH隧道命令行工具插件mole的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用mole创建SSH隧道的Golang工具指南

mole是一个用Go编写的轻量级SSH隧道工具,可以快速创建本地、远程或动态端口转发。下面我将介绍如何使用mole以及如何用Go代码实现类似功能。

mole的基本使用

安装mole

go install github.com/davrodpin/mole@latest

常用命令示例

  1. 本地端口转发(将远程服务映射到本地)
mole -local 127.0.0.1:8080 -remote 192.168.1.100:80 -server user@ssh-server.com
  1. 远程端口转发(将本地服务暴露给远程)
mole -remote 0.0.0.0:3306 -local 127.0.0.1:3306 -server user@ssh-server.com
  1. 动态端口转发(SOCKS代理)
mole -local 127.0.0.1:1080 -server user@ssh-server.com -v

用Go实现SSH隧道

如果你想自己实现类似功能,可以使用golang.org/x/crypto/ssh包。以下是示例代码:

package main

import (
	"fmt"
	"log"
	"net"
	"os"
	"time"

	"golang.org/x/crypto/ssh"
)

func main() {
	// SSH客户端配置
	sshConfig := &ssh.ClientConfig{
		User: "username",
		Auth: []ssh.AuthMethod{
			ssh.Password("password"),
			// 或者使用公钥认证
			// ssh.PublicKeys(signer),
		},
		HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 生产环境应验证主机密钥
		Timeout:         30 * time.Second,
	}

	// 连接到SSH服务器
	sshConn, err := ssh.Dial("tcp", "ssh-server.com:22", sshConfig)
	if err != nil {
		log.Fatalf("SSH连接失败: %v", err)
	}
	defer sshConn.Close()

	// 本地端口转发示例
	localForward(sshConn, "127.0.0.1:8080", "remote-server:80")
}

func localForward(sshClient *ssh.Client, localAddr, remoteAddr string) {
	// 监听本地端口
	localListener, err := net.Listen("tcp", localAddr)
	if err != nil {
		log.Fatalf("本地监听失败: %v", err)
	}
	defer localListener.Close()

	fmt.Printf("本地转发已启动 %s -> %s\n", localAddr, remoteAddr)

	for {
		// 接受本地连接
		localConn, err := localListener.Accept()
		if err != nil {
			log.Printf("接受本地连接失败: %v", err)
			continue
		}

		// 为每个本地连接创建远程连接
		go func() {
			remoteConn, err := sshClient.Dial("tcp", remoteAddr)
			if err != nil {
				log.Printf("远程连接失败: %v", err)
				localConn.Close()
				return
			}

			// 双向转发数据
			go copyConn(localConn, remoteConn)
			go copyConn(remoteConn, localConn)
		}()
	}
}

func copyConn(dst, src net.Conn) {
	defer dst.Close()
	defer src.Close()
	_, err := io.Copy(dst, src)
	if err != nil && err != io.EOF {
		log.Printf("数据转发错误: %v", err)
	}
}

高级功能实现

1. 支持配置文件

type Config struct {
	Server     string `yaml:"server"`
	LocalPort  string `yaml:"local_port"`
	RemotePort string `yaml:"remote_port"`
	Username   string `yaml:"username"`
	Password   string `yaml:"password"`
}

func loadConfig(path string) (*Config, error) {
	data, err := os.ReadFile(path)
	if err != nil {
		return nil, err
	}

	var cfg Config
	err = yaml.Unmarshal(data, &cfg)
	return &cfg, err
}

2. 支持SOCKS5代理

import "golang.org/x/net/proxy"

func createSocksProxy(sshClient *ssh.Client, localAddr string) {
	listener, err := net.Listen("tcp", localAddr)
	if err != nil {
		log.Fatal(err)
	}

	server := &socks5.Server{}
	if err := server.Serve(listener); err != nil {
		log.Fatal(err)
	}
}

与mole的对比

  1. mole优势

    • 已经过充分测试
    • 支持更多高级功能(多隧道、自动重连等)
    • 更好的错误处理和日志记录
    • 支持配置文件
  2. 自实现优势

    • 完全控制功能
    • 可以定制特定需求
    • 无外部依赖

总结

对于大多数用户,直接使用mole是更简单可靠的选择。但如果需要特殊功能或想学习SSH隧道实现原理,用Go自实现也是一个不错的选择。生产环境中建议添加以下功能:

  1. 完善的日志系统
  2. 连接保持和自动重连
  3. 性能监控
  4. 更安全的认证方式(如密钥认证)

希望这个指南对你有所帮助!

回到顶部