借助 vscode Remote-SSH 插件与 Sakura Frp 实现内网穿透及远程开发

  • 最近组里配了电脑,性能比我的笔记本好不少,特别是一张 3080Ti 的显卡,如果不物尽其用就太可惜了。所以我拿到之后立马就装了向日葵远程软件,感觉还可以,但总是有点卡顿,没法拿来写代码什么的,最多看看程序运行情况
  • 今天一个同学教了我一下怎么用 vscode 连组里的服务器,顿时感觉很不错,通过一个插件的形式来连接,写程序就的感觉就和本地开发差不多,还能享受高性能,于是今晚折腾了几个小时也配了一套
  • 两边系统都是 win10

文章目录

  • 1. 建立 ssh 连接
    • 1.1 安装 OpenSSH 组件
    • 1.2 服务器配置
    • 1.3 连接客户端
  • 2. 使用密钥方式连接
  • 3. 内网穿透
  • 4. 使用 VSCode 编辑远端工程

1. 建立 ssh 连接

1.1 安装 OpenSSH 组件

  • 现在的 win10 已经自带 OpenSSH server 和 client,这两年的版本甚至都已经预装了 OpenSSH client,因此方便很多。
    1. 工具栏搜索应用 -> 可选功能 -> 已安装的功能(确保 OpenSSH client已安装)-> 添加功能 (安装 OpenSSH server)

    2. 工具栏搜索服务 -> 找到 OpenSSH SSH Server 和 OpenSSH Authentication Agent -> 启动服务并设为自动

    3. 打开 power shell,使用以下命令检查安装和运行情况

      Get-Service sshd 												# 检查服务器是否已经在运行
      Get-WindowsCapability -Online | ? Name -like 'OpenSSH*' 		# 检查组件是否已安装
      

      正常情况如下(理论上远程主机只装 OpenSSH SSH Server,客户端只装 OpenSSH Authentication Agent 即可)
      借助 vscode Remote-SSH 插件与 Sakura Frp 实现内网穿透及远程开发_第1张图片

1.2 服务器配置

  • 远程主机作为服务器,管理员身份打开 power shell,输入以下命令进行配置,并启动 SSHD 服务
    Start-Service sshd
    # OPTIONAL but recommended:
    Set-Service -Name sshd -StartupType 'Automatic'
    # Confirm the Firewall rule is configured. It should be created automatically by setup. 
    Get-NetFirewallRule -Name *ssh*
    # There should be a firewall rule named "OpenSSH-Server-In-TCP", which should be enabled
    # If the firewall does not exist, create one
    New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
    
  • 设置完成后,服务器就会开始监听 22 端口准备连接 client

1.3 连接客户端

  • 理论上,这时如果把 Server 和 Client 连接到同一个局域网,比如连接同一个wifi、同一个热点、同一个路由器(有线),Client 应该已经可以发现并连接 Server 了

    1. 以管理员身份打开 power shell,输入以下命令
      ssh username@servername -p port
      
      说明:
      1. username:服务器用户名,就是 C:\Users\XXXX 路径里的 XXXX,你开机输入密码时看到的那个名字
      2. servername:有人说是服务器的计算机名称,就是 系统->关于 里的 “设备名称”,但是我自己测试好像用这个不太行。这个写服务器ip地址就行,如果是同一个局域网内,cmd输入命令 ipconfig,找ipv4地址写上就行
      3. -p port:这是指定连接到 port 端口,如果不写,就默认连接到 22 端口。ssh 命令还提供了很多其他设置项,如下按需配置即可
        usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
                   [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
                   [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
                   [-i identity_file] [-J [user@]host[:port]] [-L address]
                   [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
                   [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
                   [-w local_tun[:remote_tun]] destination [command]
        
    2. 如果一切正常,这时客户端就会有反应了。对于每一台首次连接的新见服务器,客户端会显示以下消息
      The authenticity of host 'servername (10.00.00.001)' can't be established.
      ECDSA key fingerprint is SHA256:(<a large string>).
      Are you sure you want to continue connecting (yes/no)?
      
      输入 yes 回车即可,这会将此服务器添加到本客户端的已知 ssh 远程主机列表中
    3. 下面会要求你输入密码,其实就是你服务器开机时输入的那个密码,输入就连接完成了
  • 连接上之后,默认的连接对象是 server 的 Windows 命令行解释器。如果你不喜欢cmd,可以

    1. 设置为连接到服务器 power shell
      New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
      
    2. 设置为连接到服务器 Git bash
      New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
      
  • 需要退出回到 client 时,输入 exit 回车即可

2. 使用密钥方式连接

  • 使用刚刚的连接方式,1.3 节最后一步会要求你输入服务器的账户密码,如果不想每次都写,那么可以使用密钥方式连接
  • 这个密钥其实和 github 那个 SSH 公钥私钥一模一样。密钥命令会生成匹配的一对公钥和私钥。私钥相当于密码要保管好;公钥相当于锁,它们直接不加保护地放在服务器上,但不会影响安全。只有使用匹配的私钥,才能打开对应的公钥进入服务器
  • 整个配置连接过程如下
    1. username\.ssh 路径下,使用以下命令生成钥匙
      ssh-keygen
      
    2. 接下来会提示你输入一个保存路径,不写的话默认私钥 id_rsa,公钥 id_rsa.pub。如果你有 github 仓库一定要小心,直接回车的话你的 github 钥匙就被覆盖了。
      Generating public/private rsa key pair.
      Enter file in which to save the key (C:\Users\username\.ssh\id_rsa):
      
    3. 然后要你输入一个密码,最后连接的时候不会再问 server 账号的密码,而是改问这个密钥密码。如果你答对了直接进server,答错的话就会卡在这直到你答对,而且答对之后还得再答对 server 账号密码才能连上。这个密码也可以设为空,直接回车就完了
      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-HOSTNAME
      
      The key's randomart image is:
      +--[RSA 2048]--+
      |        .        |
      |         o       |
      |    . + + .      |
      |   o B * = .     |
      |   o= B S .      |
      |   .=B O o       |
      |  + =+% o        |
      | *oo.O.E         |
      |+.o+=o. .        |
      +----[SHA256]-----+
      
    4. 生成钥匙之后,带 .pub 后缀的就是公钥,下面把它放到服务器去。先用记事本打开公钥,内容复制后发到远程主机,到主机后先粘贴到一个 .txt 上,然后删掉后缀名,文件名改成 authorized_keys,放到 username\.ssh 路径下即可
    5. 服务器管理员身打开 power shell,执行命令
      notepad C:\ProgramData\ssh\sshd_config
      
      会弹出一个打开的 txt 文件,注释掉最后两行保存即可
      #Match Group administrators 
      #       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
      
    6. 最后,工具栏搜索服务 -> 找到 OpenSSH SSH Server -> 重启服务,然后客户端就可以通过公钥认证的方式登录到远程服务器了
  • 配置完成后,在客户端使用以下命令连接
    ssh username@servername -p port -i id_rsa
    
    注意这里 id_rsa 是客户端私钥的路径

3. 内网穿透

  • 在互联网上,每台计算机都使用 ip 表示自己的地址,以便收发信息。但是世界上计算机太多了,其实早已超过了 ipv4 所能组成的不同地址的总个数。为了不发生崩溃,ip 又分成内网 ip 和公网 ip,只有公网 ip 能访问整个互联网所有 ip,内网 ip 只能访问公网和相同内网中的 ip,这样就能实现 ip 地址的复用,就好比每个小区都有一单元二单元三单元一样
  • 由于这个问题,上面讨论的方法仅限 server 和 client 处于相同局域网时有效。对我来说这是个大问题,因为只有校园网能覆盖我宿舍到实验室的距离,要想维持远程连接,无论网速如何,我都不得不让它们一直挂在校园网上,回家或者出差的话更是没法用了。
  • 好在还有一招,就是内网穿透。这需要我们有一台公网服务器,它作为中间人帮我们 “传话”,这里我选用了 sakura frp 提供的免费内网穿透服务,效果还是比较好的
  • 下图是我配置的公网服务器,注意这个是在 OpenSSH server 端下载软件进行配置的
    借助 vscode Remote-SSH 插件与 Sakura Frp 实现内网穿透及远程开发_第2张图片
    像我这种 SSH 远程控制需求,使用 TCP 连接即可,本地 IP 随意,本地端口(就是服务器端口)要设为 SSH 默认的 22 号口,远端端口我是用的随机分配的 49134,注意连接的时候要指定这个端口,当然,配置这个隧道还会给你分配一个公网 ip。比较重要的参数就是本地端口(22)、远端端口、公网 ip

4. 使用 VSCode 编辑远端工程

  1. 安装 Remote-SSH 插件
    借助 vscode Remote-SSH 插件与 Sakura Frp 实现内网穿透及远程开发_第3张图片
  2. 转好后,左侧边栏多出一个图标,如下图圈1所示,点击后,点击圈2左上的 “+” 号,在屏幕顶部中间位置弹出的文本框内,输入ssh连接命令,比如 ssh [email protected] -p xxx -i xxx_rsa,按提示输入密码后,即可连接上远程主机。而且这个连接会被记录,之后只要点圈2所示的图标即可直接连接,不用反复输入命令。连上之后,就好像打开了一个本地工程一样,几乎没有什么延时,也不存在显示比例等问题
    借助 vscode Remote-SSH 插件与 Sakura Frp 实现内网穿透及远程开发_第4张图片
  3. 点击上图 “+” 号右边的齿轮图标,在中间弹出的选项中选择 C:\Users\xxx\.ssh\config,可以打开远程连接的配置文件,形如
    Host hostname
      HostName hostname
      User username
      IdentityFile "C:\Users\username\.ssh\id_rsa"
      Port 1234
    
    其中 hostname 是vscode中显示的名字,可以随便写;username 是 Server 用户名,Port 处要写内网穿透的远端端口;IdentityFile 则是Client 的私钥文件地址。如果设置发生变化,可以轻松地从这里修改

你可能感兴趣的:(其他,vscode,ssh,远程开发)