欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

如何在本地使用虚拟机模拟远程服务器并进行SSH远程登录?

最编程 2024-08-03 13:39:21
...

在之前的笔记中, 我们已经成功完成了服务器的安装虚拟网络的配置。在本篇文章中,我们将为服务器配置 SSH 远程登录,进一步模拟实际开发环境中我们与服务器的交互。

SSH 简介

在开始配置之间,我们先简单了解一下 SSH:SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理 Linux 系统的首选方式。

我们可以将 SSH 粗略地视作 C/S(Client/Server)结构,想要使用 SSH 管理远程服务器, 需要在远程服务器上部署 openssh-server 服务,在本地服务器配置 openssh-client 服务。

接下来我们就开始一步步地部署 SSH 服务吧:)

服务端

我们首先确认一下服务器上是否已经安装了 openssh-serverservice sshd status

server-查看.png

可以看到我的服务器上已经安装了 openssh-server 并且开机自启动。

如果你的服务器上没有安装 openssh-server,使用 APT 进行软件包管理的 Linux 发行版可以通过 sudo apt install openssh-server 安装,然后通过 systemctl 设置开机自启动 sudo systemctl enable --now sshd

至此,服务端的 SSH 服务已经可以使用了。

客户端

密码登录

我们先在 Windows 10 专业版环境下配置 openssh-client,并通过密码进行登录(这是 SSH 默认的登录方式)

  1. 打开“设置”选择“应用”

    win-设置.png

  2. 选择“可选功能”

    win-可选功能.png

  3. 可以看到我的机器上已经安装了 openssh-client

    win-已安装.png

  4. 如果你的机器上还没有安装的话,可以点击“添加功能”进行搜索安装

    win-添加.png

  5. 打开 PowerShell 尝试连接服务器 ssh <服务器用户名>@<服务器IP>(用户名和 IP 在上两篇笔记中已经配置好了)

  6. 输入用户对应密码后即可成功登录,实现在本地对服务器进行操作

    win-登录.png

密钥登录

如果仅使用一台服务器进行一些基础的应用,并且使用高强度密码的话,密码登录其实已经足够了。

但在实际环境中,我们可能会有多台服务器,并且管理员会通过脚本进行自动化运维。如果对每一台服务器进行操作时都需要输入对应密码,整个过程将会非常低效。

这时候我们可以尝试使用 SSH 密钥登录。

简介

在开始配置前,我们先对 SSH 密钥登录进行简单的介绍:

  1. 客户端通过非对称加密算法生成一对密钥,其中包含一个公钥(key)和一个私钥(key.pub),公钥和私钥构成一一对应关系
  2. 私钥文件被保存在客户端公钥文件则被放置在服务端
  3. 客户端发起 SSH 连接请求后,会通过私钥表明身份
  4. 服务端收到客户端请求后会查找是否存在对应公钥,若有则允许登录,若无则拒绝登录

配置

接下来我们在 Ubuntu Desktop 环境下配置 openssh-client,并使用密钥进行登录

  1. 首先我们确认一下 openssh-client 是否已安装:apt list --installed | grep -ne ssh

    linux-确认.png

    可以看到我的机器上已经安装了 openssh-client。若未安装,使用 APT 进行软件包管理的 Linux 发行版可以通过 sudo apt install openssh-client 安装

  2. 生成密钥对:ssh-keygen -t <加密算法> -b <密钥长度> -f <密钥对存放路径和名称> -C "<密钥对注释>"

    linux-密钥对.png

    • 常用的密钥类型和建议长度如下表:

      密钥类型 建议长度 特征
      ecdsa 521 是当下推荐使用的密钥类型, 拥有较好的兼容性
      rsa 2048 拥有最好的兼容性, 但其安全性正逐渐降低
      dsa 1024 其原始形式已不推荐使用
    • 在我看的一部分 SSH 密钥登录教程里,会在创建密钥时指示连续输入两次回车,该操作的含义是将密钥文件密码留空,即 openssh-client 可以直接读取该密钥文件,不需要输入密码解锁。但在实际应用中更推荐的是:用户登录密钥设置密码加密,自动化脚本登录密钥不设置密码加密(但需要在服务端限制其权限)

    • 成功生成密钥后,在对应路径下可以找到密钥文件 <key><key>.pub,分别对应私钥和公钥

  3. 将表示客户端身份的私钥添加到本地的 ssh-agent 统一管理: ssh-add <私钥>

    linux-添加.png

    添加成功后,我们只需要在 ssh-agent 读取密钥文件时输入一次密码,而不需要在每次使用密钥登录时都输入密码

    更新:这里需要进一步说明一下,ssh-add 的密钥添加其实是一次性的,系统重启后 ssh-agent 并不会记忆之前添加过的密钥。之所以每次启动时 ssh-agent 都会自动添加先前的密钥(使用 ssh-add -l 查看 ssh-agent 当前已读取密钥),是因为 ssh-agent 启动时会自动读取 ~/.ssh 目录下的密钥文件,该路径又是创建密钥的默认路径,所以就好像是通过 ssh-add 添加密钥后 ssh-agent 会保存记忆。

    • 密钥放置于默认路径 ~/.ssh 下(可以看到密钥被自动读取)

      自动-默认.png

    • 密钥放置于自定义路径 ~/.ssh/test_dir(可以看到密钥没有被读取)

      自动-处理.png

    我们可以通过在客户端配置文件 ~/.ssh/config 中添加 AddKeysToAgent yes 实现解锁加密密钥后,自动将其添加到 ssh-agent。这样在本次启动中只需要解锁一次密钥文件,而不是每次建立连接都需要输入密码解锁。(当然重启后需要再次解锁)

    自动-真正.png

  4. 将用于验证客户端身份的公钥传输到服务端:ssh-copy-id -i <公钥> <服务器用户名>@<服务器IP>

    linux-传输.png

  5. 通过密钥登录服务器

    linux-测试.png

总结

在本篇笔记中,我们对 SSH 进行了简单的介绍,并一步步地分别实现了密码登录和密钥登录。自此,我们与服务器的交互也算是“有模有样”了。

但服务器作为应用运行的基础,安全是重中之重。而 SSH 登录安全又是服务器安全中非常重要的一环。

在下一篇笔记中,我们将对 SSH 安全配置进行简单的介绍,让我们的服务器更“强壮”一些:)

推荐阅读