ssh隧道转发解析与内网穿透RDP、简易VPN实现

发布于 2023-12-21  799 次阅读


ssh是日常连接服务器最常用的命令,但ssh的功能不仅局限于此,本文介绍了ssh端口转发的三种方式:本地转发、远程转发和动态转发,同时介绍了如何使用ssh转发技术实现内网穿透连接RDP服务。

ssh端口转发

转发前设置

在使用ssh转发功能前,需要修改sshd服务的设置。执行命令vi /etc/ssh/sshd_config,推荐如下修改设置

AllowAgentForwarding yes
AllowTcpForwarding yes
GatewayPorts yes
ClientAliveInterval 120
ClientAliveCountMax 10

其中GatewayPorts设置为yes将允许其它主机访问转发后的端口。

本地转发 - L

本地转发里的本地,我认为最简单的理解就是执行转发命令后,后续实际用于连接的端口位于本地主机。

本地转发的基本命令形式如下:

ssh -L 主机A端口A:主机C:主机C端口C username@主机B

结合下面的示意图,我们来理解下这个命令。如果我们的电脑是主机A,主机B是服务器的登录节点,主机C是服务器的子节点,其中我们的主机A可以连接主机B,但不能直接访问主机C。这时如果我们想要在自己电脑上直接使用主机C上部署在端口C的服务,就可以使用上面的命令,将端口C转发到本地的端口A上。

这时,我们在本地其它程序访问A端口,就等于访问了主机C的端口C,就好像在A和C端口之间打了一条隧道直连一样。

另外主要注意的时,主机B可以和主机C是同一台电脑,我们只要把上面命令里的主机C改成localhost即可。一般用在我们只能访问B的部分端口的情况。

ssh 本地转发.png

远程转发 - R

远程转发里的远程,同样的理解方法,在执行转发命令后,后续实际用于连接的端口在远程主机。

远程转发的基本命令形式如下:

ssh -R 主机B端口B:主机C:主机C端口C username@主机B

同样结合示意图来进行理解。此时我们的主机A与主机C位于同一个内网,无法被直接访问,主机B位于公网可以直接访问。如果我们想要访问主机C端口C上的服务,可以在主机A上发起到主机B的ssh连接,执行如上命令。

这是,访问主机B的端口B,就等于访问主机C的端口C。同样的,主机A和主机C可以是同一台电脑,实现将内网机器提供的服务暴露到公网上。

远程转发.png

动态转发 - D

不同于上面的固定端口转发,动态转发相当于把主机B当做一台代理来使用,使用如下命令,可以在端口A上提供一个socks5代理服务。这样当我们在主机A的其它应用上设置了代理后,就可以通过主机B来访问网络,并且A和B之间的通信会被ssh加密。这也是最雏形的越过wall的方式。

ssh -D 主机A端口A username@主机B

动态转发.png

辅助参数 - N

在执行上面的命令时,会同时打开一个ssh交互终端,如果我们只是需要后台启动隧道,可以添加- N参数。

实现内网穿透RDP

结合上面的介绍,让我们来实现内网穿透使用RDP远程桌面。

执行如下命令,将本机的RDP使用的3389端口转发到有公网IP的远程服务器的33333端口,同时服务器上防火墙放行33333端口,这样在家里电脑中,只要在远程桌面应用里连接服务器的33333端口就可以实现内网主机的访问。

ssh -R 33333:localhost:3389 username@hostname

实现简易VPN

类似的,让我们来实现一个简易的公司VPN服务,执行如下命令,第一步我们将公司主机的ssh端口(默认22)转发到服务器的33333端口,然后在家里的电脑上设置动态转发,端口号7890,这样,只要我们设置浏览器或者其它应用走7890端口的socks5代理,就可以正常访问公司的各种内网资源和服务了。

#  在公司主机执行
ssh -R 33333:10.65.71.23:22 username@hostnmame

#  在家里电脑执行
ssh -D 7890 -p 33333 username@hostnmame