没有VPN的VPN或有关SSH非常规使用的故事

根据ssh.com和Wikipedia的说法,SSH协议的第一个版本和实现于1995年发布。 作者的任务是开发rlogin,telnet和rsh的安全替代品,然后将其用于远程管理。 奇怪的是,信息安全事件助长了SSH协议的出现,因此攻击者从服务器收集了一个令人印象深刻的用户名/密码数据库,仅侦听大学网络并提取身份验证数据包(用户名/密码对以未加密的形式传输)。

该协议迅速流行,经过长时间的完善和改进,该协议于2006年由IETF标准化。 从那时起,他设法成为文本控制台系统远程管理的事实上的标准。 除了文本控制台本身之外,该协议还提供了许多其他有用的功能,例如文件传输和端口转发。 本文将讨论端口转发及其不太明显的应用程序。

SSH协议提供两种端口转发模式-转发和反向。 直接模式允许您在SSH客户端上打开侦听TCP端口,并将与此端口的所有连接转发到服务器端。

图片

例如,如果在我们的SSH服务器上运行远程桌面服务器(RDS),即使无法进行直接网络连接(例如,它被防火墙阻止),我们也可以使用SSH协议连接到该服务器。 像这样:

图片

第二种端口转发模式(反向)使您可以交换SSH服务器和客户端的角色(应用于已转发的端口)。 在反向模式下,侦听TCP端口在SSH服务器端打开,为该端口提供服务的应用程序在SSH客户端上。 它很少派上用场,但通常来说非常合适。

图片

将这两种模式以及我们的示例与远程桌面服务器结合使用,您可以得到以下配置:

图片

乍一看,它看起来很多余。 但是,连同表面上的冗余,我们获得了两个重要的属性:

  1. 网络要使这种方案正常工作,唯一需要的是确保SSH服务器所在主机的网络地址。 运行RDS服务器和客户端的节点可以至少每分钟更改一次其网络地址(或者它们甚至可以在专用网络上拥有地址,我们只需要传出NAT,通常称为“ Internet连接”字样)。
  2. 尽管对我们来说RDS服务器可以从Internet上的任何位置访问,但其他用户无法连接到它(前提是SSH服务器中没有漏洞)。 而且由于RDS协议具有其自己的访问控制,即使在SSH服务器上成功进行攻击的情况下,攻击者也将需要对RDS进行攻击。 同时具有SSH服务器漏洞和RDS服务器漏洞的可能性远小于每个组件单独存在的可能性。

如果仔细观察,则在此图中可以看到两个独立的计算机网络。 一种-传输-允许您建立SSH连接。 另一个-内部-用于应用目的。 在后续的文章中,我们将尝试从这种观察中得出一些有趣的结论,但是现在,让我们回到实验中。

连接到家用电脑


在21世纪的院子里,从西伯利亚到加利福尼亚的网络数据包传输需要0.1秒,整个世界都纠缠在计算机网络中,而TCP / IP甚至在牙刷中也是如此。 似乎万物之间的这种连通性,使我们很久以前应该不仅可以通过输入设备附近的物理状态而且可以通过网络远程地控制计算机。 而且,有很多技术和协议可以做到这一点。 Microsoft的远程桌面,* nix系统上的VNC变体,Citrix解决方案,成千上万个...然而,我们当中很少有人能够吹嘘使用这些技术可以从世界任何地方连接到我们的家用计算机。

有两个原因使得很少有人可以吹嘘连接到自己的家用计算机,并且它们彼此连接。 第一个是全球网络中缺少典型的家用计算机地址。 这种状况的根源可以追溯到1981年,当时首次描述了IPv4标准,而该标准到今天为止一直被用来(单独地进行更改和添加)寻址Internet上的大多数站点。 该标准的作者认为,拥有37亿个地址的地址空间足以满足世界上所有设备的需求,但事实证明这是严酷的。 预计到2019年9月将无法使用IPv4 Internet。

此外,不托管网站的典型Internet用户可能会很好地享受文明的所有好处,而无需在全球网络上拥有地址,而是仅限于专用网络和提供商NAT上的地址。 换句话说,对于大多数Internet用户而言,是否存在其设备的全局IP地址之间没有区别。 在这种情况下,提供商在全球网络中向其发布全球IP地址的人数正在迅速下降。 结果,典型的家用计算机位于专用网络上,并且没有全局地址。 即使提供商仍在全球网络中为用户设备分配地址,该设备也是从家庭专用网络执行NAT的家庭路由器。 用户当然可以在路由器上“转发端口”,但是即使在这种最佳情况下,路由器的全局地址也可能每天都在变化。 是的,有些提供商以适度的费用提供“静态IP”服务,但实际上,到那时,用户意识到游戏已经不值钱了,如果您需要用家用计算机做某事,您也可以致电打电话。

最持久的人可以完成此任务,并遇到第二个原因,即仅对那些有进取心的人来说,通过Internet开放对计算机的访问是一种娱乐。 这个原因很普遍-信息安全。 全球网络是全球性的,迟早会有来自世界另一端并且出于恶意的人来敲门。 扫描远程桌面服务器在其上打开的开放端口不是一件容易的事,并且,请确保TCP SYN迟早会从中国村庄进入您的超级秘密端口32167。

回到使用SSH进行外来端口转发的过程中,您会注意到它的功能消除了这两个原因。

建立自己的TeamViewer


您需要立即进行预订,以确保TeamViewer是一款出色的产品,具有许多非常不同的功能。 作为本文的一部分,我们将只为自己收集一种通过远程桌面协议通过Internet安全连接到位于NAT后面的计算机的方法。 但是,我敢建议,与任何可访问Internet的计算机的连接都是TeamViewer的主要区别功能,因此该产品非常受欢迎。 正是这样的连接,我们可以使用本文第一部分中的SSH配置来亲自实现。

因此,任务条件是:有一台家用计算机和一台笔记本电脑都运行Windows10。有必要使笔记本电脑能够在世界任何地方使用远程桌面协议访问家用计算机。 我们的系统将包括家用计算机远程桌面服务器,带有远程桌面客户端的笔记本电脑和SSH服务器。 SSH服务器是唯一需要全局IP地址和永久可用性的组件。 满足这些要求的最简单选择是在云中托管SSH服务器。 Yandex.Cloud很棒(主要是由于其定价政策),因此我们将使用它。 结果是这样的:

图片

让我们从准备家用计算机开始。 首先,请确保通常允许对其进行远程访问。 这可以通过其他系统设置中的“远程访问”选项卡来完成:

图片

从2018年4月开始,Windows 10在命令行实用程序中已经具有ssh客户端。 通过安装不同的软件,这将有助于我们减少分心,并立即着手开展业务。 首先,我们为SSH生成一个密钥。 打开PowerShell Shell并执行'ssh-keygen'。 当询问我们有关密钥的密码时,请将其留空。 生成密钥后,使用命令“ cat $ HOME / .ssh / id_rsa.pub”在控制台上显示其打开的部分。 该命令的结果对于我们在云中启动SSH服务器很有用。 您应该得到这样的内容:

图片

我们需要将SSH密钥的私有部分复制到便携式计算机。 密钥的这一部分位于文件“ $ HOME / .ssh / id_rsa”(不带后缀“ .pub”)中,我们可以将其复制为常规文件。 例如,使用USB闪存驱动器(我们假定它作为驱动器F安装:)

copy $HOME/.ssh/id_rsa f:\ 

现在运行我们的SSH服务器。 在Yandex.Cloud中创建一个虚拟机(VM)。 出于我们的目的,您可以选择具有1个vCPU和0.5 GB RAM的“轻型” VM。 在“网络设置”部分中,选择具有自动IP地址的默认网络。 在“访问”部分中,输入“ home”作为登录名,在SSH密钥的输入字段中,复制上一步在控制台中显示的内容:

图片

单击“创建VM”,然后等待完成。 虚拟机创建完成后,我们需要找出其IP地址:

图片

我们将需要虚拟机的IP地址以在家用计算机和便携式计算机上运行SSH客户端。 以这种方式在计算机上运行它(在此以及以下命令中,您需要用VM的IP地址替换84.201.141.36):

 ssh -NR 3389:localhost:3389 home@84.201.141.36 

当询问有关连接到未知服务器的信息时,我们回答“是”。 如果那样的话,我们在控制台上看不到任何文本,那么一切都很好。 现在配置笔记本电脑。 从我们的闪存驱动器复制私钥:

  mkdir -Force $HOME/.ssh copy f:\id_rsa $HOME/.ssh/id_rsa 

并运行SSH客户端:

 ssh -NL 1025:localhost:3389 home@84.201.141.36 

现在,您可以在便携式计算机上运行远程桌面访问客户端(mstsc.exe),并将localhost:1025指定为连接地址。 太好了,它有效!

或几乎可行。 如果您停止家用计算机上的SSH进程,将无法连接。 我们需要使该过程在系统启动时自动启动,并在连接断开时重新启动。 例如,可以通过创建PowerShell脚本并将其注册为在计算机启动时在组策略中运行所必需的脚本来实现。 您只需要考虑它将代表系统帐户启动,这意味着您需要确保我们的SSH密钥可用于该系统帐户。

让我们先了解关键。 以管理员身份运行PowerShell并执行以下命令:

 copy $HOME/.ssh/id_rsa "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" icacls "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" /reset 

同时,在同一PowerShell窗口中,启用脚本执行:

 Set-ExecutionPolicy RemoteSigned 

现在创建实际的脚本。 让我们打开我们最喜欢的文本编辑器(也可以使用记事本),并编写以下脚本(记住用Yandex发行的SSH服务器替换IP地址):

 while (1) { & $(get-command ssh |select -expandproperty Path) ` -i "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" ` -o StrictHostKeyChecking=accept-new -o ExitOnForwardFailure=yes ` -NR 3389:localhost:3389 home@84.201.141.36 Start-Sleep -Seconds 15 } 

将脚本保存到所需的目录。 最后,将其注册为自动运行。 为此,请运行组策略编辑器(Win + R→gpedit.msc),然后打开“计算机配置”→“ Windows配置”→“脚本(开始/结束)”→“启动”项。 在“ PowerShell脚本”选项卡上,使用“添加”按钮并指示保存的脚本的路径。

图片

我们将在笔记本电脑上执行相同的操作。 首先使用PowerShell作为管理员:

 copy $HOME/.ssh/id_rsa "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" icacls "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" /reset Set-ExecutionPolicy RemoteSigned 

然后,我们将在文本编辑器中准备一个脚本(该脚本与先前的脚本略有不同,但是和以前一样,我们将IP地址替换为Yandex颁发给您的脚本):

 while (1) { & $(get-command ssh |select -expandproperty Path) ` -i "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" ` -o StrictHostKeyChecking=accept-new -o ExitOnForwardFailure=yes ` -NL 1025:localhost:3389 home@84.201.141.36 Start-Sleep -Seconds 15 } 

非端点将使用“ gpedit.msc”注册它以在启动时启动。 重新启动计算机和笔记本电脑(以确保一切正常启动),瞧! 现在,我们的家用计算机和笔记本电脑将永远相互连接(只要我们在Yandex.Cloud中的虚拟机处于打开状态并且可以访问)。

那又怎样


那不是很好吗? 在任何咖啡馆,任何机场,您都可以连接到家中,并与猫一起看自己喜欢的照片。 或者,请收录完整的贝多芬第五交响曲回家。 或对您的采矿场的成功感兴趣。 或使用网络摄像头查看家里正在发生的事情。 但是,有多少应用程序有这样的机会进行“传送”? 但是我们的解决方案也有缺点。

首先,建立连接不是最简单,最愉快的过程。 如果出现问题,调试会比初始设置复杂一些。 当然,这个问题可以通过毅力和耐心解决,但是即使需要花费的少量劳动也会引起人们对努力的可行性的怀疑。

其次,云中的虚拟机要花钱。 对于Yandex,您可以指望的最低金额为每月480卢布。 当然,这不是过高的钱,而是自己的汗水。 是否值得与这些钱的猫一起观看图片取决于每个人自己决定,但是很可能我们的解决方案的所有优势都将被他的价格所抵消。

通过与朋友和志同道合的人分担费用,可以大大缓解价格问题。 由于虚拟机用于不需要任何明显计算能力的任务,因此性能降低的可能性极小。 而且经济效果是显而易见的:如果您租用一台虚拟机(可容纳10个人),那么每个人每月只需支付48卢布。 的确,在这种情况下,信任问题会破坏和谐:任何志趣相投的人都有机会通过SSH服务器连接到另一台计算机。 如果每个人的帐户都具有很强的密码,这不是问题。 但是,坦率地说,输入家用计算机的强密码不只是一条规则而已。

待续


因此,假设我们汇集了10个志趣相投的人,如上所述进行了设置,并且一切对每个人都有效。 我们爱猫图片爱好者俱乐部安全地利用这个机会,每月通过互联网仅需48卢布就可以通过互联网回家,而无需注册和发送短信,每个人都很高兴和高兴。 问题是-我们的“技术”的可能性是否仅限于猫,是否有可能将其用于更严重的事情?

当然可以 如果在我们的推理中,我们将“家用计算机”替换为“云中的构建服务器”,而将“笔记本电脑”替换为“办公室中的工作计算机”,那么我们就可以得到“开发基础设施的访问系统”这一称号。 如果我们有一个IP摄像机而不是一个构建服务器,还有一个安全站而不是一台可用的计算机,那么我们将获得一个“视频监控系统”。

但是,在两种情况下,都必须更加注意访问控制问题。 特别是,当多个用户共享SSH服务器时,我想将这些用户彼此隔离。 即使进行这种共享,我们也必须将每个用户的每个单独资源分配给一个单独的TCP端口,并记住其编号。 通过数字寻址很快就会变得很乏味,因此我希望能够为资源分配有意义的名称。 但是,我们将在下一篇文章中讨论如何改善这种情况。

同时,感谢您的关注,请在评论中分享您的想法。

Source: https://habr.com/ru/post/zh-CN441806/


All Articles