一 ssh隧道协议
1.絮絮叨叨说一下“知识点1”:什么是ssh协议
ssh(secure shell)故名思义安全的壳,这是一个为建立在应用层和传输层基础上的安全协议。ssh为远程通信提供了安全保障,区别于telnet和ftp(都是应用于远程通信协议)这俩货都是不安全的。说到安全性,无外乎多了些加密的算法亦或者巧妙的交互过程。 没错,所谓协议就是像是各个国家的语言一样,约定了计算机之间沟通的方式。而一个所谓的具备安全性的协议也就是多➕了些密码算法。而具体该采用怎样的秘密算法来保证一个协议或者是交互过程的安全性就要考虑整体应用的场景以及现实性能问题。
针对,ssh加密的过程其实大家在使用xshell工具进行远程登录的时候已经体会过了。我们使用xshell工具为我们生成了公钥和私钥,再此过程中我们输入了一个密码,并将公钥上传于zero平台保存。这个过程我们就完成了一次签名加密的过程,具体的过程原理就不赘述了。
知识点总结1:用于远程通信的协议,且安全。
2.超级有用的“知识点2”:端口转发(隧道原理)
我们都知道通过ss协议可以实现登陆远程主机的目的。其实ssh协议还有许多其他的应用,比如接下来马上介绍的本地端口转发以及远程端口转发。当然ssh的功能不限于此,他还可以实现远程操作等。
2.1绑定本地端口
实现目的:从本地绑定的端口通过ssh主机向目的主机传送数据;
命令举例:$ ssh -d 8080 user@host
命令解析:ssh会建立一个socket监听本机的8080端口,如果一旦有数据通过这个端口,将自动将数据转移到ssh链接上,发送到远程主机。因为通过ssh完成操作,因此该通讯过程是安全的。
2.2本地端口转发
在更复杂的场景中,为了实现端到端的传输,我们不仅要指定目的主机还要指定主机端口。我们根据绑定端口好所在方区分为本地端口转发(local forwarding)和远程端口转发(remote forwarding)。
假设应用场景如下图所示,现有本地主机host1,一台远程主机host2(也是我们所要达到的目的主机),一台可以沟通两台主机的主机host3,其中host1,host2不能进行连接。那么如果我们想由host1传达信息到host2需要通过host3进行中转。那么我们使用如下命令
命令举例:$ ssh -l 21:host2:21 host3
命令解析:其中命令分成三个部分,其中黄色部分包含了本地主机端口号:目的主机地址:目的主机端口号,蓝色表示中转主机地址。其中目的主机地址以及目的主机端口号是相对于中转主机而言,也就是对于host3来说他的目的主机是host2,端口号是21。那么我们可以通过这个命令实现host1从端口21向host2主机端口21的连接。其中我们将host1于host3之间的数据传输称之为ssh隧道。
推广举例:ssh -l 21:localhost:21 host3
命令解析:表示由host1的端口21向host3端口21传输数据。因为对于host3来说他的目的主机的localhost就是host3本身。
2.3远程端口转发
"本地端口转发"是指绑定本地端口的转发,那么"远程端口转发"(remote forwarding)当然是指绑定远程端口的转发。还是接着看上面那个例子,host1与host2之间无法连通,必须借助host3转发。但是,特殊情况出现了,host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。这时,”本地端口转发”就不能用了,怎么办?解决办法是,既然host3可以连host1,那么就从host3上建立与host1的SSH连接,然后在host1上使用这条连接就可以了。我们在host3执行下面的命令:
$ ssh -r 21:host2:21 host1
这条命令的意思,就是让host1监听它自己的2121端口,然后将所有数据经由host3,转发到host2的21端口。由于对于host3来说,host1是远程主机,所以这种情况就被称为"远程端口绑定"。
二 远程debug测试环境
接下来解释远程debug过程的基本原理。
1、查看/配置测试环境的debug端口。
-
SpringBoot的工程address
-
详细配置:
-server -XX:+UseG1GC -XX:G1HeapRegionSize=4m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -verbose:gc -Xloggc:logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy -XX:+UseGCLogFileRotation-XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/heapdump.hprof
-agentlib:jdwp=transport=dt_socket,address=11128,server=y,suspend=n -Dserver.port=11120
-
非springboot的工程:xdebugaddress
2、xshell配置测试服务器的ssh隧道,侦听端口为IDEA配置的端口,目标端口为测试环境的debug端口。
假设场景:qa小明想通过IDEA+Xshell隧道功能远程debug A工程jxc_test1环境的主机。
假定,远程服务器jxc_test1为主机1,小明的本地电脑为主机2
最终达到的目的:小明在本地idea对 A 工程设置断点,通过jxc_test1的host访问test.test.com,最终可以在idea中实现对jxc_test1环境的远程debug。
实现手段: 绑定主机2的远程端口,即设置对主机2端口的监听。一旦有数据通过该端口,将数据映射到主机1的debug端口。由于在debug模式,因此我们通过隧道传递的就是断点信息。
3 在xshell登录远程主机jxc_test1,设置隧道窗格,在工具下方点击转移规则,校验规则是否正确配置
4、IDE中增加remote配置,打开idea中的run/debug configurations, 选择remote类型,设置端口与xshell的侦听端口一致
5、点击debug,连接成功后有如下日志:
6、打断点,在对应的测试环境执行操作,可进行远程debug