SSH隧道

本文详细介绍了SSH隧道的功能及其应用场景,包括如何使用ssh-L和ssh-R命令建立本地和远程端口转发,实现远程调试或管理等任务。

初接触是跟自己老大尝试了解堡垒机,了解是通过cto后来的讲解
并且参考了以下地址
https://blog.youkuaiyun.com/death_spank/article/details/7403554

ssh隧道的功能及其强大,必要时可以协助进行远程调试,或者是肉鸡的管理

  • ssh -L

示例命令如下

ssh -L 12306:127.0.0.1:8080 root@192.168.1.99

这个命令的其实是简写,完整的命令是这样的

 ssh -L localhost:12306:localhost:8080 root@192.168.1.99

真实的情况是此命令会监听发往localhost的数据包,并且通过ssh root@192.168.1.99,从99的root用户将这个数据包发往99的localhost:8080。
换句话说,用户发往localhost:12306的请求其实是在请求99服务器的8080端口。
另外,如果按照默认的配置是只能监听从本机发送出去的请求,一旦是从其他服务器请求本机的12306是被捕获的,因此需要修改一个配置

# vi /etc/ssh/sshd_config
# 设置GatewayPorts yes
GatewayPorts yes
  • ssh -R
    那么ssh -r同理如下
    将发往174.139.9.66的8080访问转发到本机的80端口
ssh  -R 80:174.139.9.66:8080            master@174.139.9.66
在使用 Go 语言创建 SSH 隧道的场景中,开发者可以选择多个开源库来实现这一目标。以下是一些主流的方法和推荐的库。 ### 使用 `sshtunnel` 创建 SSH 隧道 `sshtunnel` 是一个为 Go 程序设计的超简单 SSH 隧道工具,它能够帮助开发者在 Go 应用中轻松实现 SSH 隧道功能,无需复杂的配置和繁琐的代码。无论是连接到远程数据库、API 服务,还是其他需要通过 SSH 隧道访问的资源,`sshtunnel` 都能提供一种简洁、高效的方式来实现这一目标[^1]。 ### 使用 `sshego` 实现 SSH 隧道 `sshego` 是一个使用 Go 语言编写的开源项目,旨在为开发者提供一个简单易用的 SSH 隧道(安全端口转发)库。该库填补了 Go 标准库中 SSH 功能的空白,提供了内嵌的 SSH 服务器功能,使得用户可以方便地为自己的应用添加 3 因素认证的 SSH 服务[^2]。 ### 使用 `go-ssh-tunnel` 进行隧道连接 `go-ssh-tunnel` 是一个用于实现 SSH 隧道的 Go 扩展包,可以通过简单的函数调用来创建 SSH 隧道。以下是一个使用 `go-ssh-tunnel` 的示例代码: ```go package main import ( "github.com/dtapps/dtapps/go-ssh-tunnel/dssh" ) func main() { dssh.Tunnel("root", "", ":22", ":3306", "localhost:13306") } ``` 这段代码展示了如何通过 `dssh.Tunnel` 函数创建一个 SSH 隧道,将本地端口 `13306` 转发到远程主机的 `3306` 端口[^5]。 ### 手动实现 SSH 隧道 如果希望手动实现 SSH 隧道,可以使用 Go 的 `golang.org/x/crypto/ssh` 包来创建 SSH 客户端并建立连接。以下是一个基本的 SSH 客户端连接示例: ```go package main import ( "fmt" "golang.org/x/crypto/ssh" "net" ) func main() { // SSH 客户端配置 config := &ssh.ClientConfig{ User: "username", Auth: []ssh.AuthMethod{ ssh.Password("password"), }, HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 注意:生产环境中应使用更安全的 HostKeyCallback } // 建立 SSH 连接 conn, err := ssh.Dial("tcp", "host:port", config) if err != nil { fmt.Errorf("Failed to dial: %s", err) return } defer conn.Close() // 创建一个本地监听器 listener, err := net.Listen("tcp", "localhost:13306") if err != nil { fmt.Errorf("Failed to listen: %s", err) return } defer listener.Close() for { // 接受本地连接 localConn, err := listener.Accept() if err != nil { fmt.Errorf("Failed to accept: %s", err) continue } // 在远程主机上建立连接 remoteConn, err := conn.Dial("tcp", "localhost:3306") if err != nil { fmt.Errorf("Failed to dial remote: %s", err) localConn.Close() continue } // 转发数据 go func() { defer localConn.Close() defer remoteConn.Close() // 从本地到远程的数据转发 go func() { _, err := io.Copy(remoteConn, localConn) if err != nil { fmt.Errorf("Error copying from local to remote: %s", err) } }() // 从远程到本地的数据转发 _, err = io.Copy(localConn, remoteConn) if err != nil { fmt.Errorf("Error copying from remote to local: %s", err) } }() } } ``` 上述代码展示了如何使用 `golang.org/x/crypto/ssh` 包创建一个 SSH 客户端,并通过 SSH 隧道将本地端口转发到远程主机上的指定端口。这种方式提供了更大的灵活性,但同时也需要更多的代码来实现和维护[^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值