文章目录
VS Code Remote-ssh 远程控制Windows主机 + 免密登录 + 内网穿透写在前面我们为什么需要远程连接服务器?(使用需求+场景)为什么需要免密登录?为什么需要内网穿透?什么是内网穿透?什么是SSH?SSH远程连接之后能干什么? 实操详解在Windows下将你的远程主机配置为SSH服务器在VS Code中连接你的远程主机免密登录![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/be9b71a6a0bac40882d2ff98d2f08f2f.jpeg)内网穿透
VS Code Remote-ssh 远程控制Windows主机 + 免密登录 + 内网穿透
写在前面
我们为什么需要远程连接服务器?(使用需求+场景)
炼丹的研究生:在我们炼丹过程中,经常需要连接远程的服务器(通常是实验室的服务器)进行炼丹。通常情况下,我们会使用Pycharm的远程开发功能,同步服务器与本地的项目文件,使用远程解释器进行开发。但是使用过的同学都知道,重量级的Pycharm每次远程同步、加载远程解释器都需要相当长的时间。如果我们想要随时切换工位、宿舍、家里的各个场景,Pycharm的同步、加载就成了一场噩梦。特别是当我们的python环境安装了很多依赖包,项目生成了大量文件的时候更是这样。直到VS Code推出了Remote Development开发包,便完全解决了这个问题。让我可以在不同的场景快速切换,无需等待同步文件、环境。因为VS Code远程开发完全是运行在服务器上的,我们本地的VS Code只是一个前端界面,所以根本无需同步服务器上的文件、解释器依赖库就可以体验到与本地开发完全相同的体验。在远程连接服务器后,只需要使用可以随身携带的笔记本进行Coding,而炼丹就交由服务器来完成。优雅!远程办公:将自己的台式机当成一个服务器在服务器上训练/测试模型。这样自己远程办公时,可以通过ssh远程连接到自己的台式机在公司开会时,用笔记本远程连接自己的台式机以上只是列举出来的一些常见的使用场景,但具体到每个人都是不尽相同的,但是需求都是相似的——优化我们的工作流。为什么需要免密登录?
Why not?难道你不想吗???
为什么需要内网穿透?
通常服务器是在一个局域网下的,没有公网ip,需要通过局域网内的NAT(Network Address Translation)讲局域网内的私有IP地址转换为公网IP才能正常通信。如果想要远程连接,要么和服务器处在同一个局域网下,但这通常限制了我们使用场景,如果离开这个局域网,就没法远程开发了。因此需要内网穿透,解决处于使用了NAT设备的私有TCP/IP网络中的主机之间建立连接的问题。但是如果你有公网IP,就没有这么多b事了。但是99%的可能你都没有公网IP,其中的原因也比较简单,公网IP地址是一种稀缺的有限的资源,而Internet是老美搞的,简单讲有人多了,就一定会有人少了,就得通各种各样的方式来提高我们为数不多的公网IP地址的利用率,以满足我国人民日益增长的上网需求doge。
什么是内网穿透?
内网穿透是一种网络技术,它允许在私有局域网(内网)中的设备或服务可以通过公共网络(如互联网)进行访问。通常情况下,内网设备由于NAT 设备屏蔽或防火墙等网络设备所保护,无法直接从公网访问。通过使用内网穿透技术,可以建立起公网和内网之间的通道,使得外部用户可以通过公网连接到内网中的设备,就像这些设备直接连接在公网上一样。内网穿透简单来说就是将内网外网通过隧道打通,让内网的数据让外网可以获取。以下是一些常见的使用场景:
场景一:企业远程办公企业用户购买了企业管理系统、财务系统、人力资源系统,分公司与总部不在同一城市,分公司需要远程访问总部系统;场景二:开发人员远程调试
放在家里的树莓派,服务器等,需要远程ssh管理,这样打通服务器的22端口即可远程通过ssh操作服务器了.场景三:数据远程同步
一些企业内部数据库,由于安全等原因,不愿意放到云服务器上,可以将数据库放到办公室本地,然后通过天联传输通道传输,这样既保证安全,又保证公网可以正常访问场景四:远程监控
一些设备的运行监控信息,可以远程监控管理,可以方便的管理监控各个设备的运行情况.场景五:远程联机游戏
一些本地运行的游戏,想和好基友一起联网玩,采用天联组网方案即可实现联网游戏.场景六:文件远程共享
FTP共享文件、NAS文件存储,实现远程共享、下载、上传
什么是SSH?
安全外壳协议(Secure Shell Protocol,简称SSH)是一种运行在应用层的(默认端口号为22)加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中建立安全隧道来实现SSH客户端与服务器之间的连接。最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。SSH使用频率最高的场合是类Unix系统,但是Windows操作系统也能有限度地使用SSH。2015年,微软宣布将在未来的操作系统中提供原生SSH协议支持,Windows 10 1803版本已提供OpenSSH工具。
SSH以非对称加密实现身份验证。身份验证有多种途径:
其中一种方法是使用自动生成的公钥-私钥对来简单地加密网络连接,随后使用密码认证进行登录;另一种方法是人工生成一对公钥和私钥,通过生成的密钥进行认证,这样就可以在不输入密码的情况下登录。任何人都可以自行生成密钥。公钥需要放在待访问的电脑之中,而对应的私钥需要由用户自行保管。认证过程基于生成出来的私钥,但整个认证过程中私钥本身不会传输到网络中。其中公钥用于让对方加密信息,而自己的私钥可以解密经过自己公钥加密后的信息,这就是非对称加密。SSH协议有两个主要版本,分别是SSH-1和SSH-2。无论是哪个版本,核实未知密钥来源都是重要的事情,因为SSH只验证提供用户是否拥有与公钥相匹配的私钥,只要接受公钥而且密钥匹配服务器就会授予许可。这样的话,一旦接受了恶意攻击者的公钥,那么系统也会把攻击者视为合法用户
SSH远程连接之后能干什么?
SSH远程连接之后,就可以像操作本地的机器一样操作远程机器。当需要操控的机器不在本地时就可以使用ssh协议远程连接操控。
实操详解
用ssh连接时,本地称为client,远程主机称为host。
在Windows下将你的远程主机配置为SSH服务器
这部分内容遵循Microsorft的官方教程,但在此基础上做了精简,官方教程写的好的部分会直接贴出来。
第一步:安装适用于 Windows 的 OpenSSH
在Powershell(管理员)中确保添加了防火墙规则
# 启动sshd服务Start-Service sshd# 将sshd服务设置为自动启动,若不设置需要在每次重启后重新开启sshdSet-Service -Name sshd -StartupType 'Automatic'# 确认防火墙规则,一般在安装时会配置好Get-NetFirewallRule -Name *ssh*# 若安装时未添加防火墙规则"OpenSSH-Server-In-TCP",则通过以下命令添加New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
第二步:连接到 OpenSSH 服务器
在第一次连接之前,我们先来了解两个概念:username和servername/hostname。在windows的SSH服务器中也就是在你的远程主机中
其中输入密码应该是你的远程主机的开机密码,并且这一次连接应该确保是在同一网络下进行的,因为我们并没有进行内网穿透操作
如果你成果的看到了以下输出,恭喜你成功的连接上了你的远程主机,并且已经成功了一大半了。接下来我们去VS Code中连接,操作都是类似的。
domain\username@SERVERNAME C:\Users\username>
在VS Code中连接你的远程主机
这部分内容遵循VS Code的官方教程,但在此基础上做了精简,官方教程写的好的部分会直接贴出来。这一次的连接同样应该确保是在同一网络下进行的,因为我们并没有进行内网穿透操作。
第一步:在 VS Code 中,从命令面板(F1、Ctrl+Shift+P )中选择Remote-SSH: Connect to Host…并使用与第一次连接中相同的操作。user@hostname
第二步:如果 VS Code 无法自动检测您要连接的服务器类型,系统会要求您手动选择类型。
选择平台后,它将存储在属性下的VS Code 设置remote.SSH.remotePlatform中,以便您可以随时更改它。
稍后,VS Code 将连接到 SSH 服务器并进行自行设置。VS Code 将使用进度通知让您了解最新情况,并且您可以在Remote - SSH输出通道中查看详细日志。
第三步:连接后,您将进入一个空窗口。您始终可以参考状态栏来查看您连接到哪个主机。
然后,您可以使用“文件”>“打开…”或“文件”>“打开工作区…”打开远程计算机上的任何文件夹或工作区,就像在本地一样!
免密登录
第一步:创建密钥对
在你想存放密钥对的目录下打开powershell/cmd,输入以下命令。你可以选择在生成密钥对时为其指定不同的文件名。请注意,-f 后的id_rsa_linux 和 id_rsa_windows 只是示例文件名,你可以根据需要选择其他文件名。
# 在 Linux 和 Mac 上 ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa_linux # 在 Windows 上 ssh-keygen -t rsa -b 2048 -f C:\Users\YourUsername\.ssh\id_rsa_windows # 如果你只有单平台使用 ssh ssh-keygen
注意:当你在多个平台上使用 SSH 连接到不同的远程服务器时,可能需要为每个平台生成和使用不同的密钥对。这是因为每个平台(例如,Windows、Linux、Mac)可能有不同的文件系统和密钥文件位置,同时在安全性的考虑下,不同平台上的密钥对最好是独立的
这应当会显示如下某些内容(其中,“username”将替代为你的用户名)
Generating public/private rsa key pair.Enter file in which to save the key (C:\Users\username\.ssh\id_rsa):
你可以按 Enter 来接受默认值,或指定要在其中生成密钥的路径。 此时,系统会提示你使用密码来加密你的私钥文件。 密码可以与密钥文件一起工作来提供双重身份验证。 在此示例中,我们将密码留空。(以下只是个例子,你的密钥肯定和示例不同)
Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in C:\Users\username\.ssh\id_rsa.Your public key has been saved in C:\Users\username\.ssh\id_rsa.pub.The key fingerprint is: SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@server@LOCAL-HOSTNAMEThe key's randomart image is:+--[RSA 2048]--+| . || o || . + + . || o B * = . || o= B S . || .=B O o || + =+% o || *oo.O.E ||+.o+=o. . |+----[SHA256]-----+
系统会在你指定的路径(本例子为 C:\Users\username.ssh)下生成两个文件,分别是id_rsa.pub和id_rsa,前者为生成的公钥,后者为私钥 。
Mode LastWriteTime Length Name---- ------------- ------ -----a---- 9/28/2018 11:09 AM 1679 id_rsa-a---- 9/28/2018 11:09 AM 414 id_rsa.pub
请记住,私钥文件等效于密码,应当采用与保护密码相同的方式来保护它。
第二步:上传公钥文件id_rsa.pub,并将其导入到服务器中目标用户的公钥数据库
若要使用上面创建的用户密钥,需要将公钥放置在远程主机也就是你的服务器中上的一个文本文件中,该文件名为 authorized_keys,位于 users\username\ .ssh下。遗憾的是 Windows 下目前还没有提供 ssh-copy-id 命令,需要手动把用户的公钥添加到远程主机系统中的用户的 authorized_keys 文件中。具体在运行 OpenSSH Server 的主机上的操作步骤如下:
手动复制公钥文件 (id_rsa_windows.pub) 的内容,然后登录到远程服务器,并将内容粘贴到 authorized_keys 文件。如下是我生成的id_rsa.pub粘贴到 authorized_keys 文件中的内容:
如果你本机是Linux:
ssh-copy-id 命令通常用于将你的公钥复制到远程服务器的 authorized_keys 文件中。-i 选项用于指定身份文件(即你的公钥文件)。在本机执行如下命令:
ssh-copy-id -i id_rsa.pub name@ip
确保公钥文件 (id_rsa.pub) 在本地机器上的正确位置,并且你有读取该密钥的权限。同时,确保远程服务器上的用户 有一个 .ssh 目录,并且 authorized_keys 文件有正确的权限(通常是目录权限为 700,authorized_keys 文件权限为 600)。
然后将你的公钥 (id_rsa.pub) 的内容复制并追加到远程服务器的 authorized_keys 文件中。
第三步:在vscode上通过公钥认证的方式登录到远程服务器
将添加公钥到远程服务器后,最后一步便是配置你的主机。在Command Palette (F1/ctrl+shift+P) 中,输入"ssh open configuration" 并打开客户端(本地)的config文件,内容应该类似如下
Host name HostName hostname User username
在下面添加配置(IdentityFile 私钥文件路径),以指定使用哪个私钥文件。
IdentityFile "C:\Users\username\.ssh\id_rsa"
注意添加的文本前面是有缩进的(你应该知道“username”应该换成什么吧)下图红框为我添加的内容。
这样,当你使用 ssh 连接服务器时,SSH 客户端将自动选择相应的私钥文件,就可以实现免密登录了。下一次登录远程主机时,点击vscode左下角的绿色标志,选择connect to,选择你的远程主机,就可以轻松登录了。
内网穿透
在开始之前首先搞清楚一点,以下操作都是在远程主机中进行的
第一步:首先去樱花FRP注册账号并实名认证
第二步:下载并安装对应操作系统的frp客户端
官方专门写了个教程可以说非常详细了(注意一定要设置开机自启动):帮助文档 - Sakura Frp
第三步:创建隧道
创建一个 TCP 类型的隧道,本地 IP 写 127.0.0.1,本地端口写 22 即可,访问密码看个人,填不填写都行,有密码安全一些,同时也会更麻烦以下。
服务->隧道列表->创建隧道
第四步:打开SakuraFrp启动器,启动隧道
记住此时返回的IP地址信息(格式类似如下)
第五步:==在本地主机(不是远程主机啦!)==连接到隧道(注意保障远程OpenSSH服务器运行)
ssh -p 端口号 用户名@IP地址
到此为止,你就可以突破局域网的限制远程连接你的服务器啦!