我有一台windows的虚拟机, 已经在路由器中对RDP的端口做了端口映射, 如此我便能在任何地方连接上这台虚拟机, 但问题也随之而来, 如何在保证易用的同时也适当的保障安全性?
为什么要通过ssh隧道来建立远程桌面连接
- RDP服务本身存在诸多风险, 不仅仅用户的弱口令问题, 还包括其本身也有诸多漏洞, 相比之下, 还是更相信SSH一些。
- 很多公司为了规避风险, 会在防火墙中限制3389端口的访问。但对SSH, 会宽容许多。当然, 即使安全策略没有彻底限制RDP, 这里也不建议在没有得到公司允许的情况下, 私自利用ssh隧道来建立RDP连接, 因为还是会存在诸多风险的。
思路
通过SSH隧道安全建立RDP远程桌面连接的方法有许多种, 这里提供以下几种方法
- 方法1 win10通过配置可以打开 OpenSSH Server, 非win10可自行下载安装, 而后通过该Server建立ssh隧道, 本文重点介绍该方法
- 方法2 在内网中创建另外一个能和当前win主机互访的linux主机, 再建立隧道
- 方法3 如果你的路由是软路由系统并支持ssh tunnel, 可以直接利用软路由建立隧道
大致步骤:
- 在win10上打开 OpenSSH server
- 配置ssh server, 诸如改ssh端口, 启用密钥登录, 禁用密码登录
- 生成ssh key, 并将公钥拷贝到指定文件夹
- 将密钥拷贝到另一台计算机
- 在另一台计算机建立ssh隧道连接win10主机
具体步骤
-
打开"设置"->“应用和功能”->“可选功能”, 并安装"OpenSSH Server"功能
-
配置ssh server
OpenSSH Server 的安装目录在"C:\Windows\System32\OpenSSH", 但我们需要在"C:\ProgramData\ssh"目录下, 修改"sshd_config"文件, 如果不能直接保存, 可先拷贝出来修改后再覆盖回去。
- 修改ssh默认端口, Port 22 改为 Port 55555
- 修改 PermitRootLogin 选项为 no, 即"PermitRootLogin no"
- 修改 PasswordAuthentication 选项为 no, 即"PasswordAuthentication no"
- 不注释该行 “PubkeyAuthentication yes”
- 不注释该行 “AuthorizedKeysFile .ssh/authorized_keys”
- 注释该行 “Match Group administrators”
- 注释该行 “AuthorizedKeysFile PROGRAMDATA/ssh/administrators_authorized_keys”
可参考"https://winaero.com/enable-openssh-server-windows-10/"
- 生成ssh key, 并将公钥拷贝到指定文件夹
生成 ssh key 有很多种做法
- 很多程序员安装了"git extension" , 它自带了"putty key generator"可以生成key
- 利用OpenSSH本身的"ssh-keygen"生成, 可直接在"cmd"中键入"ssh-keygen"回车, 按照提示创建key, 最好为私钥创建一个密码。
默认"C://Users//用户名//.ssh//id_rsa.pub"文件便是公钥, 在该文件夹中创建"authorized_keys", 并把公钥中的文本追加"authorized_keys"文件中。
-
将密钥拷贝到另一台计算机
你一定会需要把你生成私钥拷贝到另外这台计算机上, 无论是windows还是linux, 一般都是放到用户文件夹下的".ssh"文件夹。
windows是类似"C://Users//用户名//.ssh"文件夹
linux是类似"/home/用户名/.ssh"文件夹
macos是类似"/Users/用户名/.ssh"文件夹 -
在另一台计算机建立ssh隧道连接win10主机
- 如果另一台计算机是 linux 或者 macos, 那么只需要打开"terminal"键入命令即可创建隧道, 命令类似
ssh 用户名@公网IP或者域名 -p 33333 -L 12345:127.0.0.1:55555 -N -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -f
- 用户名应填写win10的用户名
- 公网IP或者域名处应填写你的公网IP或者域名, 如果你是用路由器上网的, 应填写路由器的获取到的公网IP地址
- 33333是你路由器上暴露给外部的端口号
- 55555是路由器映射到win10的内部端口号
- 如果你是通过局域网内另外一台机器做隧道, 那么127.0.0.1应改为win10在内网中的IP地址
- 两个"-o"参数用来保证ssh隧道不会自动关闭
- 加 “-f” 参数, 可以让隧道在后台运行, 但同时也不方便我们关闭隧道, 若要关闭隧道, 可以先"lsof -i tcp:12345"获取PID值, 再通过"kill -9 PID值"来关闭隧道。我一般不加"-f"参数, 方便我随时关闭隧道。
- "-N"参数表示只连接远程主机, 不打开远程shell
而后可以下载RDP客户端, windows自带远程桌面, linux可下载"xfreerdp", macos可自行下载微软官方的远程桌面。新建RDP连接, ip地址填写"127.0.0.1", 端口号写"12345", 即可连接。
- 如果另一台计算机也是windows, 你可以像之前安装OpenSSH Server一样安装"OpenSSH Client",或者安装开源免费的MobaXterm, 创建一个新Session, 按照下图设置即可。