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) }
}
`
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通