SSH隧道

本文详细介绍了如何在Windows环境下使用putty、sshsecureshell、SecureCRT进行SSH隧道设置,将远程主机的服务映射到本地端口,实现远程访问和管理。通过配置文件和操作界面,用户可以轻松地建立隧道,从而访问到位于内网的远程服务器资源。

SSH隧道管理内部服务(putty,ssh secure shell,SecureCRT)forWINDOWS windows下使用putty和ssh secure shell,SecureCRT的隧道功能映射远程主机的方法

概念:隧道就是一种端口映射.他通过中间机器的转发.把远程机器的端口映射到本地机器的端口上

举个例子

A主机(看着是自己电脑)===可连接(远程管理)====>(外口)B主机(=====能访问=内网====>)C主机

A主机(ADSL)———-(ssh连接)—————–>>B主机(211.200.200.200)—————C主机(192.168.2.254)

A能访问B,B能访问C,但A不能直接访问C.这时可以建立一个隧道.

把C的端口通过B,映射到A的本地端口上去

建立隧道后

A======直接访问c映射端口=========>C

在A主机上的应用程序.只要访问A上的端口.就能连到C的端口.

举个例子
1.通过B.我把C的3306端口映射到A的3306端口.这样我就可以用管理工具访问c主机数据库了

2.通过B.我把C的22端口映射到A的22端口.这样我就可以用SSH工具练到C主机

3.通过B.我把B的防火墙关闭端口和不对外的端口8080映射到A的8080端口
具体设置方法如下

在ssh中.profile->edit profiles->tunneling->add

然后

display.名字.随便打无所谓.你自己知道就行
Type.选tcp或ftp根据你的需要
listen.这个你本地的端口.监听这个端口.把包发送到远程(一般1024以上.选个没用过的就行)
destnation.有两个,1是远程主机地址,2是端口,你希望访问的那个远程机器的信息

例如添加下面:
1.DISPLAY:3306 Type:tcp listen:3306 destanation:192.168.2.254 destanation:3306
2.DISPLAY:22 Type:tcp listen:22 destanation:192.168.2.254 destanation:22
3.DISPLAY:8080 Type:tcp listen:8080 destanation:127.0.0.1 destanation:8080

然后save一下.启动这个profile连接到中间节点B主机(这个ssh要一直开着)
现在访问本地3306端口 就是访问C主机的3306端口数据库,
现在访问本地22端口就是访问C主机的22端口的SSHD服务,
现在访问本地8080端口就是访问B主机的8080端口。

现在明白了吗?
下面就是讲putty设置
具体的操作是这样的。
1.运行putty,会出现设置窗口,点击左边的sessions选项(默认)
输入IP地址和端口号(默认为22)
2.选择左边的Connection->SSH->Tunnels选项
在Source port里面输入本地要开启的端口号(选择一个本地未使用的任意端口号)
在Destination里面填入最终要连接的服务器IP和端口号。(例如:我们这里数据库服务器IP为:192.168.2.254,使用的mysql数据库,端口为3306,就要填写:“192.168.2.254:3306”,没有引号。
其他默认就行了。

A主机(看着是自己电脑)===可连接(远程管理)====>(外口)B主机(=====能访问=内网====>)C主机

A主机(ADSL)———-(ssh连接)—————–>>B主机(211.200.200.200)—————C主机(192.168.2.254)
1.通过B.我把C的3306端口映射到A的3306端口.这样我就可以用管理工具访问c主机数据库了

2.通过B.我把C的22端口映射到A的22端口.这样我就可以用SSH工具练到C主机

3.通过B.我把B的防火墙关闭端口和不对外的端口8080映射到A的8080端口
例如:运行putty,会出现设置窗口,点击左边的sessions选项(默认)211.200.200.200端口号:22,
左边的Connection->SSH->Tunnels选项 添加下面三项。
1.Source port(源端口):3306 Destination(目的):192.168.2.254:3306 点添加
2.Source port(源端口):22 Destination(目的):192.168.2.254:22 点添加
2.Source port(源端口):8080 Destination(目的):127.0.0.1:8080 点添加
用SSH登陆B主机,要一直开着

现在访问本地3306端口 就是访问C主机的3306端口数据库,
现在访问本地22端口就是访问C主机的22端口的SSHD服务,
现在访问本地8080端口就是访问B主机的8080端口。
完成。

SecureCRT设置
先登陆ssh 服务器,然后就是“选项”—-“会话选项”,这里有个“连接”—–“端口转发”
右边显示“本地端口转发”—下面点添加,
名称:随便 。
本机:添上端口号,如:3306,相当于访问地址这个端口就是远程应用端口。
远程:添上端口号,如:3306,就是应用端口。如果是在远程里面的另一台服务器,就添上那一台的IP地址就行了

在使用 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、付费专栏及课程。

余额充值