写在前面:因为这学期要上传奇史课os,课程要求使用OpenEuler系统,为了方便用vscode编程使用了ssh来连接虚拟机。折腾的过程中发现桥接模式会随着你网络环境他的变化而产生网段的变化导致ssh配置发生变动,而nat模式下的虚拟机ip不会产生改变。而使用nat网络模式来进行连接相对麻烦一点儿,故有了该文章。

一、设置端口转发

因为nat模式下尽管虚拟机ping得通主机,但是主机ping不通虚拟机的话ssh连接仍然是不可行的,所以必须要先进行端口转发。
ping不通
设置端口转发也非常简单,首先点击VirtualBox左上角的管理,选择其中的工具,在工具的菜单栏中选择网络管理器。或者是直接使用快捷键Ctrl+H打开。
网络管理器
之后先点开属性,选择NAT网络,在下方选择端口转发,点击右边的”+“添加新规则。
端口转发
主机ip和子系统端口和上图保持一致,除非你ssh端口自定义了非22端口。主机端口可以自己改动,只要该端口没有被占用就行。需要注意的是子系统ip要和你的虚拟机保持一致。至于如何获得子系统的ip,需要打开子系统输入命令ip addr来查看,一般如果你没有进行特别的修改,ip都应该为10.0.2.xx
子系统ip
输入好后,点击右下角的应用开始转发。

二、虚拟机的准备

要想进行ssh连接,你的虚拟机必须要开启sshd服务,关于如何安装sshd服务请左转自行谷歌。
输入以下命令来设置ssh服务:

1
2
3
systemctl enable sshd #启用sshd开机自启动
systemctl start sshd #启用sshd服务
systemctl status sshd #查看sshd服务状态

最后你的sshd服务状态应该类似于下图:
sshd-status

三、ssh相关设置

  • 测试连接
    现在在确保虚拟机开着的情况下可以进行ssh的连接了。在cmd中输入以下命令ssh -p 你设置的主机端口号 username(你想用什么身份登陆你的虚拟机)@127.0.0.1来测试连接,若提示你输入密码进行登录则说明连接成功。

  • 配置密钥登录
    如果不配置密钥,在vscode中打开一个文件夹就要输入一次密码,极其的麻烦。而且以后工作的时候肯定是使用安全的密钥登录,所以用密钥登陆是很有必要的。

    • 在cmd输入命令ssh-keygen -t rsa -b 4096生成一对rsa密钥(之后一直回车即可),如果你之前已经生成了密钥了,那就用你之前的密钥就行。

    • 进入C/Users/你的用户名/.ssh文件夹,你应该在这里能找到你之前生成的密钥对。在这里右键打开terminal,输入命令scp -P 你设置的主机端口号 id_rsa.pub username@127.0.0.1:~(可以改成你想要的目录),这一步是将公钥文件传给你的虚拟机。

    • 打开你的虚拟机,找到你传入的公钥文件,输入以下命令:

      1
      sudo cat id_rsa.pub >> ~/.ssh/authorized_keys
  • 最后是对sshd的一些配置
    修改/etc/ssh/sshd_config文件,将对应行修改成下面那样:

    1
    2
    3
    4
    PermitRootLogin prohibit-password #限制不能使用密码登录root用户
    PubkeyAuthentication yes #允许使用公钥进行登录
    PasswordAuthentication no #禁止使用密码登录
    AllowTcpForwarding yes #允许进行ssh端口的tcp转发

之后再进行ssh连接,你会发现直接连接成功,最后在vscode输入之前的ssh连接命令即可成功远程登陆虚拟机。

四、踩过的坑

因为我之前已经有了rsa密钥,我把生成的新的rsa密钥命名成了自定义的名字,然后发现怎么都连接不成功。搜索后发现原来ssh会按照一定顺序扫描已有的私钥,而自定义名字的私钥是最后扫描的,导致ssh在扫描到之前就认为你的私钥已经是错误的了(居然不是遍历!!!)。
这种情况需要在ssh连接命令中加入参数-i来指定你要使用的私钥来进行连接。