golang 打隧道和端口转发

`package main

import (
"golang.org/x/crypto/ssh"
"io"
"log"
"net"
)

// main 万物的起源
func main() {
sshAddr := "000.00.000.00:22" // 服务器的 ip:ssh端口
sshUser := "root" // 用户名,可以新建一个特定用户
sshPasswd := "6666666.66666" // 密码
Remote := "127.0.0.1:3306" // 转发到远程的端口,未开放但是你想访问的端口
Listen := "127.0.0.1:3307" // 需要转发的本地端口,本地访问时使用的端口

serverClient, err := ssh.Dial("tcp", sshAddr, &ssh.ClientConfig{
    User:            sshUser,
    Auth:            []ssh.AuthMethod{ssh.Password(sshPasswd)},
    HostKeyCallback: ssh.InsecureIgnoreHostKey(),
})
if err != nil {
    log.Fatalf("ssh服务器连接异常: %s", err.Error())
}
defer serverClient.Close() // 程序执行完关闭连接,养成好习惯
log.Println("与服务器建立ssh连接成功啦")

// 监听本地映射端口 这样访问本地端口的时候我就可以发现啦
listener, err := net.Listen("tcp", Listen)
if err != nil {
    log.Fatalf(err.Error())
}
defer listener.Close() // 程序执行完关闭连接,养成好习惯

for {
    // 接收本地发送的数据
    conn, err := listener.Accept()
    if err != nil { // 养成好习惯处理错误
        log.Println(err)
        return
    }
    // 开启一个协程去处理这次的消息
    go func(conn net.Conn) {
        //建立ssh到后端服务的连接
        forwardConn, err := serverClient.Dial("tcp", Remote)
        if err != nil { // 养成好习惯处理错误
            log.Fatalln(err.Error())
        }
        log.Println("ssh端口映射隧道建立成功")
        defer forwardConn.Close() // 用完要关掉
        // 转发工作
        go io.Copy(forwardConn, conn) // 客户端发送给服务端的数据拷贝给服务端
        io.Copy(conn, forwardConn)    // 服务端发送给客户端的数据拷贝给客户端
    }(conn)
}

}
`

posted @ 2023-01-05 22:39  干炸小黄鱼  阅读(842)  评论(0)    收藏  举报