SSH协议中隧道与代理的用法详解

      最后更新:2022-07-18 10:28:01 手机定位技术交流文章

      文章出自个人博客 https://knightyun.github.io/2022/07/17/tools-ssh-tunnel ,转载请申明。

      SSH 协议是 Linux 系统中使用较为频繁的协议之一,通常用于远程管理主机或服务器,默认使用 22 端口,可类比 Windows 系统中的telnet(23个端口),这里介绍ssh除了远程连接的其他强大的功能,即隧道加密和实现多场景代理功能。

      前置条件

      为了理解更轻松,最大程度上简化网络拓扑,后续都只用两台机器做测试,IP 与主机名对应关系如下;更复杂的网络结构和多接口场景可举一反三延申,要用作某些特殊用途,则自行YY。

      在验证IP地址和多层次代理场景时,除了网络交换机外:192.168.111.1

      然后再多了解一下三个 ssh 的命令行参数,后面会用到:

      本地转发(-L)

      原理

      本地转发即使用ssh -L参数,先看官方解释(man ssh):

      翻译成人话,通俗讲就是,使用此参数执行ssh连接,打开机器上指定的监控端口1,然后连接到远程机器指定接口(IP)的指定端口2,再用另一个程序访问主机上的指定端口1,流将传输到远程机的指定端口2,它相当于一个直接访问远程机器的终端2;它很容易被理解为“从本地到远程机器的流”。

      参数值([bind_address:]port:host:hostport还有一条规则,左到右是本地到远程的顺序:本地地址(bind_address])的端口(port)转发到远程地址(host)的端口(hostport),可省略本地接口地址,摩尔认为127.0.0.1.它也可以用于接口和终端Unix socket创建连接并将相应的位置转换为插座地址.

      实验

      上面的转发流程有点绕,用实验来理解下实际效果,假设场景为Kali(192.168.111.128连接 Centos(192.168.111.131因此,先确保 Centos打开22个端口,然后使用Python给它一个8000端口开启一个简单的http服务:
      centos-http-server

      首先尝试在本地访问下(Centos有一个第二个接口:192.168.122.1):
      centos-http-curl

      没问题,然后再去另一个机器,卡利(192.168.111.128让我们先测试 Centos的Ssh:
      kali-ssh-centos

      为了证明该连接是有效的,请直接使用Cali上的本地传输连接 Centos(为了方便,ssh公共密钥连接已预先为两个机器配置,避免输入密码),并执行下列参数:

      然后在卡利地区将对执行情况进行当地监测1080,再用curl到此端口,返回 Centos的数据192.168.122.1接口上的8000端口所对应的内容:
      kali-local-curl-1080

      Centos 这边也记录到了相应的连接日志,本地转发成功:
      centos-http-log

      远程转发(-R)

      原理

      远程传输的执行参数是ssh -R,官方的解释是:

      通俗讲就是,执行远程传输命令后,远程机器将打开指定的端口来听1,绑定到本地指定的2个端口,所有访问远程机器端口1的流量将转移到本地端口2,相当于直接访问本地港口2,它也可以简单地理解为“从远程传送到本地机的流量”;

      应该指出,这里的传输流方向实际上是上面的局部传输的相反,所以参数值([bind_address:]port:host:hostport规则也是逆转的,从左到右是写的:远程机器接口[bind_address])上的端口(port)转发到本地接口(host)的端口(hostport可以省略远程访问地址(IP)127.0.0.1socket连接同理。

      这里有一个值得注意的点,你可以看到参数值的块比以前的块有较高的局部传输[bind_address:]port这意味着本地端口地址和端口值都同时省略,远程端口也可以随需要省略。这意味着只有一个远程端口值可以被写入,从而创建一个反向袜子5代理,即远程机器的端口可以被视为一个socks4socks5代理端口,代理流量都会被引导至本地机器,这个后面也有对应实验验证。

      实验

      同样适用于卡利(192.168.111.128)连接 Centos(192.168.111.131),不过这次是在Kali上用 python 启一个简单的http服务:
      kali-http-and-curl

      本地连接正常, 然后打开卡利的远程传输, 参数是:

      kali-http-and-remote

      这将在远程机器上进行(Centos,192.168.111.131)开辟新的监视港1080,再使用curl为了访问它,你会得到卡利(192.168.111.128)上端口8000的返回内容:
      centos-remote-1080

      卡利在这一侧有相应的访问记录,所以远程传输成功:
      kali-http-8000-log

      反向袜子代理

      然后测试-R参数值仅指定远程端口的影响,这将使本地机器成为一个socks一个代理服务器,下面要测试代理效果,需要一个交换机(192.168.111.1(在网关上启动一个简单的php获取访客的实际IP地址的服务编码如下:

      访问路径是:http://192.168.111.1/get-ip.php,分别使用卡利和 Centos:
      kali-get-ip

      centos-get-ip

      好的,IP是正确的,然后在卡利(192.168.111.128)上启动反向袜子代理服务:

      kali-rev-socks

      去Centos(192.168.111.131查看代理人curl-x参数指定代理服务器)效果:
      centos-socks-curl

      至此反向袜子代理成功。

      远程接口地址问题

      当你使用远程继电器时,可能会遇到一个小陨石坑-R尽管有指定远程机的端口地址的选项,ssh的参数值实际上只有默认在127.0.0.1在接口地址上打开监视端口,即如果远程机器是公共网络服务器,新的监视端口在公共网络上不能访问,只有机器可以本地访问它。这是sshd的默认配置,它通常在/etc/ssh/sshd_config文件中, GatewayPorts 这个配置项,默认是no,改成yes是的,如果这个行没有,请手动添加:
      centos-sshd-gatewayports

      然后重启sshd该服务将在所有接口(即:0.0.0.0新的端口正在监视中,但它只能在所有端口上打开,不管连接器如何设置远程端口,因此它应该相应地使用。
      centos-gatewayports-yes

      动态转发(-D)

      原理

      动态传输的执行参数是ssh -D,官方解释是:

      这应该是一种更实际的用途,袜子代理人,动态传输是特定港口的局部监视,在应用程序将袜子代理端口设置到这个端口后,任何连接流将通过此端口,通过ssh隧道转到远程机器,而不是发送,由于终端和接口不再局限于连接和连接的终端,所以称为动态。

      参数值([bind_address:]port) 为了监控本地机的接口地址和端口,默认的不是写接口地址127.0.0.1在所有接口监控中0.0.0.0

      实验

      还是在Kali(192.168.111.128对当地进行操作和监测1080运送 Centos的终端(192.168.111.131作为袜子代理服务器:

      kali-dynamic-socks

      尝试用curl为了测试代理效果,你可以看到Socks5代理已经生效,而IP地址是 Centos(192.168.111.131)的:
      kali-dynamic-get-ip

      卡利访问Centos的其他接口(192.168.122.1)的http服务(8000端口)也没问题:
      kali-socks-centos-python
      centos-dynamic-socks-http-log

      多级代理(-J)

      原理

      实现多层次机构需要利用ssh -J参数,即设置Jump host可以理解为跳板,正式解释为:

      大意就是连接ssh在该过程中,可以指定(多个)跳跃器来实现第一级的交通传输,而第一级跳跃器的每个系统只有第一级的访问记录,并且达到某种匿名性。destination的语法与普通ssh连接对象的语法是一致的,指定的多个跳数以逗号分离多个节点值。

      实验

      为了显示多层次节点的效果,必须再次使用开关机(192.168.111.1),用其通过ssh连接Centos(192.168.111.131),并以Kali(192.168.111.128)作为跳跃器,直接在网络开关上执行:

      你可以看到端连接的 Centos机器的访问记录是跳伞卡利的IP地址:
      gateway-jump-centos

      再次测试以指定多个跳跃者:

      gateway-multi-jump

      这里为了简化网络拓扑,所以把 Centos 自身也设置为一个跳板,那么经过的两个跳转节点就是.128.131整个流程流程过程可以简化如下:

      -J并结合了上述几个传送和代理参数,实现了多层次代理函数。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/29981.html

          热门文章

          文章分类