golang快速创建SSH隧道命令行工具插件mole的使用
Golang快速创建SSH隧道命令行工具插件mole的使用
Mole是一个专注于弹性和用户体验的CLI应用程序,用于创建SSH隧道。
安装与构建
要构建Mole,您的系统需要安装Go 1.17.1或更高版本。
$ make build
测试与代码覆盖率
运行测试:
$ make test
生成代码覆盖率报告:
$ make cover && open coverage.html
静态代码分析
- 首先安装golangci-lint
- 然后运行:
$ 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
常用命令示例
- 本地端口转发(将远程服务映射到本地)
mole -local 127.0.0.1:8080 -remote 192.168.1.100:80 -server user@ssh-server.com
- 远程端口转发(将本地服务暴露给远程)
mole -remote 0.0.0.0:3306 -local 127.0.0.1:3306 -server user@ssh-server.com
- 动态端口转发(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的对比
-
mole优势:
- 已经过充分测试
- 支持更多高级功能(多隧道、自动重连等)
- 更好的错误处理和日志记录
- 支持配置文件
-
自实现优势:
- 完全控制功能
- 可以定制特定需求
- 无外部依赖
总结
对于大多数用户,直接使用mole是更简单可靠的选择。但如果需要特殊功能或想学习SSH隧道实现原理,用Go自实现也是一个不错的选择。生产环境中建议添加以下功能:
- 完善的日志系统
- 连接保持和自动重连
- 性能监控
- 更安全的认证方式(如密钥认证)
希望这个指南对你有所帮助!