基于SSH端口转发实现telnet的安全传输

基于SSH端口转发实现telnet的安全传输


学过一点Linux的人看到这题目,可能就感觉有点白痴。确实,SSH的一大功能就是加密的远程登录,何必多此一举。

在此,不得不先声明,本文的重点是实现SSH安全端口转发的功能。熟悉SSH的人都知道,端口转发也是SSH的一大功能。此功能可以加密非安全的TCP连接,如:FTP,IMAP,HTTP等协议。之所以选择telnet,就在于telnet协议相对简单,虽然此实验不具有实用性,但能使我们更容易理解SSH端口转发的工作原理。



一、实验环境:


两台Linux虚拟机,并且安装有telnet、ssh和tcpdump。需要注意的是telnet和ssh都是CS工作模式,安装包包括客户端和服务器。在宿主机上用putty登陆Linux。


二、实验步骤:


1、在Linux 172.16.1.3上输入下列命令:

 tcpdump -w pack2.sshtel host 172.16.1.2 and 172.16.1.3

用tcpdump捕获两台虚拟机之间传送的数据包,并将其存储到pack2.sshtel文件中。

因为tcpdump不具有数据包分析功能,在此我们使用wireshark对软件进行分析。


2、在Linux 172.16.1.2上创建端口转发的命令:

ssh -L2000:localhost:23 172.16.1.3  

打开一个到172.16.1.3的ssh连接,-L表明是本地转发,此时TCP客户端和SSH客户端同在本地主机上(即172.16.1.2)。后面接着三个值,有冒号分开,分别表示:需要监听的本地端口(2000),远程主机名或IP地址(172.16.1.3)以及远程的转发目标端口号(23是telnet的端口号)。

上面的命令可完成登陆到172.16.1.3的功能,如果仅输入ssh 172.16.1.3也能达到同样的效果。然而,现在的这个SSH会话同时将Linux 172.16.1.2的2000端口转发到Linux 172.16.1.3的23端口;在退出会话之前转发一直有效。


【注明:关于建立SSH远程端口转发的命令还有另外一种格式 

  ssh  -P  sshaccount@S -L localpost:host:hostport  

  解释如下:

            -P 用一个非特权端口进行出去的连接; 

            sshaccount 本地主机在远程主机服务器上的SSH连接帐号 

          -L 110:S:110 转发本地端口(localport)的连接到远程主机端口(hostport)。

也可以用高端端口(普通用户使用,因为普通用户不能在低于1024的端口上建立SSH隧道),如果用高端端口,如:-L 1110:S:110,这样任何用户都可建立这种加密隧道。】

  

3、再打开一个远程回话到Linux172.16.1.2,通过telnet远程连接到Linux 172.16.1.3,并告知telnet客户端使用被转发的本地端口2000,命令如下:

 telnet localhost 2000

之所以另外打开一个远程会话,只是为了更清楚的看到端口转发的过程。我们也完全可以让ssh端口转发的命令在后台运行(ssh -f -L2000:localhost:23 172.16.1.3 sleep 7200),继而在同一个putty远程会话中完成telnet连接。


至此,SSH安全端口转发telnet,实现telnet的加密传输就完成了。


三、数据包分析:


由于wireshark安装的宿主机,所以需要使用ftp将pack2.sshtel文件传回到宿主机;

另外,arp协议,三次握手tcp连接过程不做详细介绍,直接进入SSH协议的连接过程:


1、 版本协商

目前 SSH 实现中,比较普遍的协议版本号是 SSH2.0,但是因为还有一些网络设备上运行的是比较老的版本号,所以在实现的时候必须考虑版本兼容性问题。

当 TCP 连接建立之后,通信的双方都必须向对方发送自己的版本字符串,其中包括,SSH 的协议版本号、软件版本号等,版本字符串最长是 255 字节。

版本协商包括两种情况:旧的客户端和新的服务器端之间,以及新的客户端和旧的服务器端之间。

新的服务器端实现时,必须有一个可以配置的兼容选项,来控制是否兼容旧的版本的客户端登录。如果兼容,这个服务器端在版本协商阶段往对端发送的协议版本号就是 1.99。如果是 2.0 的客户端登录,1.99 和 2.0 的服务器端对于它来说应该是一致的,而对于 1.5 以及以下的客户端来说,1.99 意味着这个服务器兼容 1.5 的版本,版本协商可以通过。如果服务器配置成不兼容 2.0 的协议,那么它向对端发送的协议版本号就是 2.0,当 1.5 的客户端登录时,发现对端的协议版本号是 2.0,版本协商就不会成功,双方断开 TCP/IP 连接。

当新的客户端登录旧的服务器时,由于客户端不能去兼容服务器,所以遇到旧的服务器的时候,客户端必须断开连接,使用旧的版本再去登录。


2、算法协商与密钥交换


版本协商、算法协商和密钥交换都是以明文的方式进行,这些都可以在数据包中得到体现。从此对双方交互报文的报文长度字段、填充长度字段、净荷字段、填充字段以及之后的数据传输都必须使用协商出来的算法进行加密。



四、实验改进:


1、让ssh -L2000:localhost:23 172.16.1.3的命令在后台执行

让程序在后台跑后,不会占据终端,我们可以用终端做别的事情,也就是说我们可以在同一终端进行telnet的连接,而不用再打开一个到Linux 172.16.1.2的远程终端。后台执行的命令是:

ssh -f -L2000:localhost:23 172.16.1.3 sleep 7200

-f 参数表示让端口转发建立以后,就转入后台执行; sleep 7200表示该命令在后台执行的时间,7200表示2个小时。


2、直接使用宿主机上的wireshark程序可以直接捕获虚拟机之间的数据包,不用在Linux 172.16.1.3上运行tcpdump,再将存有数据包的文件传送到宿主机。这样实验步骤更简单。



五、改进后的实验步骤:


1、在宿主机上运行wireshark,捕捉过滤器的过滤语句: host 172.16.1.2 and 172.16.1.3;

2、在Linux 172.16.1.2上建立ssh端口转发:

   ssh -L2000:localhost:23 172.16.1.3 (非后台执行,会占据终端,需要另外打开一个远程终端来完成余下试验)

   ssh -f -L2000:localhost:23 172.16.1.3 sleep 7200(后台执行,不会占据终端,可以继续使用该终端完成实验);

3、依据是否选择了后台执行,选择正确的终端进行telnet连接:telnet localhost 2000;

4、分析wireshark捕获的数据包。


总结:SSH将本地端口(localhost 2000)转发到远程主机的23端口(ssh服务器所监听的端口),这样凡事经过localhost 2000端口进行的tcp连接都会通过SSH的安全隧道传送到远程主机的23端口;只要我们将本地tcp连接的端口设置为转发端口(localhost 2000),这样该tcp连接就会通过SSH的安全隧道进行传输,将不安全的tcp传输变为保密传输。当然,SSH客户端在建立连接时的端口仍是随机产生的,所以在捕获的数据包中我们不会发现转发端口2000。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值