ssh代理的工作逻辑

这里写自定义目录标题

一、什么是SSH代理

ssh通常被用来对设备进行远程管理,是telnet软件功能的安全增强版本。使用时ssh客户端以远程网络的方式连接到ssh服务端,随后就可以远程执行管理设备的命令。
ssh代理在此基础上对其进行功能扩展,ssh客户端与ssh服务端建立的通道不在用于远程系统管理,而是承载希望被服务端转发的网络流量,此时ssh工作在代理模式,他们建立的通道也叫做ssh隧道。

二、SSH代理能够做什么

通过ssh代理生成的隧道,可以在数据被加密的情况下被转发和接收,进而突破网络安全规则的网络访问,也就是大家常说的爬梯子。当然这里的加密仅是理论上的,原因之一是密码算法和密码的强度可能被破解,原因之二是在ssh隧道建立过程中的加密参数可能被中间人窃取。

三、SSH是怎么工作的

理论上,ssh代理并非透明的传输客户端接收到的数据,而是将接收的数据承载在ssh客户端和服务端之间的某条回话上,因此在进过ssh隧道转发后的数据的IP头部、TCP/UDP头部(如果有的话)已经发生了变化。ssh代理有三个工作场景,分别是正向代理、反向代理、动态端口代理。

(一)正向代理

正向代理示意图
正向代理示意图
左侧数字表示的客户端可以通过A和B建立的ssh隧道访问他们因网络安全策略限制而无法访问的C上的业务。

1.左侧的数字代表希望通过ssh隧道访问C服务器上8888端口资源的客户端。

2.A为ssh隧道客户端,也是隧道的入口,因此具有隧道服务属性,具体表现在打开了一个3721的TCP端口,来监听希望通过隧道转发的数据。

3.B为ssh隧道服务端,同时也是ssh隧道的终点。

ssh隧道将左侧数字表示的客户端的不同连接进行会话化,使不同的会话表示不同的客户端业务。

4.C为开放业务的服务器。通常情况下,左侧数据表示的客户端是无法访问C上的业务的,而B可以访问

5.配置命令

linux下在A设备上通过以下命令实现隧道的建立:
ssh -fgNL 3721:C:8888 user@B
选项L:正向代理
选项N:建立的ssh连接用于隧道转发流量,而不是用于管理
选项g:允许除自身以外的其他主机使用该ssh隧道转发数据,需要修改ssh服务端默认配置文件选项f:让命令创建的进程在后台运行,不占用前端终端资源

(二)反向代理

反向代理示意图
正向代理示意图
一样的配方,不一样的口味。

1.反向代理与正向代理的主要区别是ssh隧道建立时ssh客户端和服务端角色的不同。

2.A为ssh隧道服务端,但他也是隧道的入口,打开了一个3721的TCP端口,来监听希望通过隧道转发的数据。

3.B为ssh隧道客户端,同时也是ssh隧道的终点。

4.C为放业务的服务器。通常情况下,左侧数据表示的客户端是无法访问C上的业务的,而B可以访问

5.反向连接主要用在网络安全策略更加严格的场景下,外网A无法向内网B发起ssh连接,而B可以向A发起ssh连接。

6.配置命令

linux下在B设备上通过以下命令实现隧道的建立:
ssh -fgNR 3721:C:8888 user@A
选项R:正向代理

(三)动态代理

动态端口代理1

正向代理示意图
不一样的配方,不一样的口味。

1.动态代理与正、反向代理的主要区别是最终希望访问的服务不再是一个固定的IP地址上的资源。

2.A为ssh隧道客户端,也是隧道的入口,打开了一个3721的TCP端口,来监听希望通过隧道转发的数据。

3.B为ssh隧道服务端,同时也是ssh隧道的终点。B可以自如的访问一些A以及左侧客户端无法访问的服务。

4.缺省情况下A、B之间随带只能代理HTTP类型的服务。

5.配置命令

linux下在A设备上通过以下命令实现隧道的建立:
ssh -fgND 3721 user@B
选项D:动态端口代理

6.当在B上配置自己到自己的ssh动态端口隧道时,可以省略A作为隧道起始点的操作。此时可以在B上配置:

ssh -fgND 3721 user@B
此时示意图可表示为:
动态端口代理2
*** 部分描述可能不准确,请批评指正。

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用 Paramiko 库可以实现 SSH 代理登录的功能,具体步骤如下: 1. 导入 Paramiko 库 ``` import paramiko ``` 2. 创建 SSH 代理对象 ``` proxy = paramiko.ProxyCommand("ssh -q -W %h:%p <user>@<proxy_host>") ``` 其中,`<user>` 和 `<proxy_host>` 分别是代理服务器的登录用户名和 IP 地址。 3. 创建 SSH 客户端对象 ``` ssh = paramiko.SSHClient() ``` 4. 设置 SSH 客户端的策略,允许连接未知的主机 ``` ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ``` 5. 使用 SSH 客户端连接目标服务器 ``` ssh.connect(hostname='hostname', port=22, username='username', password='password', sock=proxy) ``` 其中,`hostname` 是目标服务器的主机名或 IP 地址,`port` 是 SSH 服务的端口号,默认为 22。`username` 和 `password` 分别是登录目标服务器所用的用户名和密码。 需要注意的是,`proxy` 参数指定了代理服务器的连接方式,可以根据实际情况进行设置。 6. 执行命令 连接成功后,就可以执行相关的命令了,比如: ``` stdin, stdout, stderr = ssh.exec_command('ls') ``` 该命令会在目标服务器上执行 `ls` 命令,并返回命令的输出结果。 7. 关闭连接 在使用完 SSH 客户端后,应该关闭连接以释放资源: ``` ssh.close() ``` 需要注意的是,在执行命令时可能会出现一些特殊字符,可以使用 Python 的字符串转义来处理。另外,`password` 需要在代码中明文存储,建议对代码进行加密或者使用安全存储技术来保护密码的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值