67·网络入门

SSH 远程连接基础

sshremote

第 67 课:SSH 远程连接基础

学习目标

完成本课学习后,你将能够:

  1. 理解 SSH 协议的作用、基本原理及其在系统管理中的重要性。
  2. 在 Linux 系统上安装并启动 SSH 服务端。
  3. 使用 ssh 命令从客户端安全地连接到远程服务器。
  4. 使用 scp 命令在本地与远程主机间安全地传输文件。
  5. 了解 SSH 基础安全配置的几个要点。

核心概念

什么是 SSH?

想象一下,你需要管理放在另一个城市机房里的服务器。你不能总是跑到机房去操作键盘鼠标。SSH(Secure Shell)就是你的“远程遥控器”。它让你能通过网络,安全地登录到远程的计算机,并在上面执行命令,就像你坐在那台计算机前面一样。

更技术化地说,SSH 是一种网络协议,用于在不安全的网络中,为两台计算机之间的通信提供加密和安全认证。它主要用于远程登录系统(替代不安全的 telnet)和安全地传输文件。

为什么必须用 SSH,而不是 telnet 或 FTP? 因为 SSH 在你输入密码和传输所有数据(包括命令和输出)时都会进行加密。就像你和朋友用只有你们懂的暗语打电话,即使有人窃听,也听不懂内容。而 telnet 和 FTP 则是“明文”传输,密码就像用大喇叭喊出去一样,非常容易被窃取。

核心组件

  • SSH 服务端 (sshd):运行在远程服务器上的“门卫”程序。它监听特定的网络端口(默认是 22),等待并验证客户端的连接请求,然后为合法的客户端提供一个加密的命令行“窗口”。
  • SSH 客户端:运行在你本地电脑上的程序(如 ssh 命令)。它负责向服务端发起连接,并将你输入的命令通过加密通道发送给服务器。

工作流程

一个典型的 SSH 连接过程如下:

  1. 客户端(你的电脑)向服务器的 22 端口发起连接请求。
  2. 服务器收到请求后,将自身的“主机密钥”发送给客户端。
  3. 客户端首次连接时,会提示你确认这个密钥的指纹(这是一个安全确认步骤)。
  4. 确认后,双方通过协商建立一个安全的加密通道。
  5. 服务器要求你输入用户名和密码(或密钥)进行身份验证。
  6. 验证通过,你就在远程服务器上获得了一个安全的命令行会话。

代码示例

示例 1:安装并启动 SSH 服务端 (在远程服务器上操作)

假设你有一台 Ubuntu/Debian 系统的服务器。

# 更新软件包列表
sudo apt update

# 安装 OpenSSH 服务器软件包
sudo apt install openssh-server

# 安装完成后,服务通常会自动启动。我们可以检查其状态。
sudo systemctl status ssh
# 如果看到 “active (running)” 则表示服务正在运行。

# 如果需要手动启动、重启或停止服务,可以使用以下命令:
sudo systemctl start ssh    # 启动
sudo systemctl restart ssh  # 重启
sudo systemctl stop ssh     # 停止

# 设置 SSH 服务为开机自启 (通常安装时已默认设置)
sudo systemctl enable ssh

示例 2:使用 SSH 客户端连接 (在你的本地电脑上操作)

连接到 IP 地址为 192.168.1.100 的远程服务器,用户名为 your_username

# 基础连接命令格式:ssh 用户名@服务器地址
ssh [email protected]

# 首次连接,你会看到类似下面的提示,询问是否信任这台主机:
# The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
# ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxx.
# Are you sure you want to continue connecting (yes/no)?
# 输入 yes 并回车。

# 接着,系统会提示你输入 `your_username` 在远程服务器上的密码。
# 输入密码(输入时屏幕上不会有任何显示,这是正常的),然后回车。
# 成功登录后,你的命令行提示符会发生变化,表明你现在已经身处远程服务器中。

示例 3:使用 SCP 进行安全文件传输

从本地复制文件到远程服务器:

# 格式:scp 本地文件路径 用户名@远程服务器地址:远程目标路径
# 将本地的 `report.txt` 复制到远程服务器的 `/home/your_username/` 目录下。
scp ./report.txt [email protected]:/home/your_username/

# 将整个目录 `my_project` 递归复制过去,使用 -r 参数。
scp -r ./my_project [email protected]:/home/your_username/

从远程服务器复制文件到本地:

# 格式:scp 用户名@远程服务器地址:远程文件路径 本地目标路径
# 将远程服务器的 `/var/log/syslog` 日志文件复制到本地当前目录。
scp [email protected]:/var/log/syslog ./syslog_backup.txt

实践练习

练习 1:搭建你的第一个 SSH 环境

  • 要求
    1. 准备两台 Linux 电脑或虚拟机(或在同一台机器上使用两个用户模拟)。一台作为“服务器”,一台作为“客户端”。
    2. 在“服务器”上安装 openssh-server 并确保其服务正在运行。
    3. 在“客户端”上使用 ssh 命令连接到“服务器”,成功登录后,执行 whoamihostname 命令,并记录输出。
  • 预期输出
    • 成功登录后,在远程服务器上执行 whoami 应输出你登录的用户名。
    • 执行 hostname 应输出远程服务器的主机名。

练习 2:文件传输挑战

  • 要求
    1. 延续练习 1 的环境。
    2. 在客户端的本地目录下创建一个名为 test_file.txt 的文件,内容为 “Hello from client!”。
    3. 使用 scp 命令将此文件传输到远程服务器的 /tmp/ 目录下。
    4. 再使用 ssh 登录到远程服务器,用 cat /tmp/test_file.txt 命令查看文件内容是否正确。
    5. (选做)在远程服务器上修改该文件,添加一行 “Hello from server!”,然后用 scp 将其拉回本地,查看本地文件是否已更新。
  • 预期输出
    • 在远程服务器上用 cat 命令应看到文件内容为 “Hello from client!”。
    • (选做)拉回本地后,文件应包含两行内容。

常见错误

  1. “Connection refused” 或 “No route to host”

    • 原因:远程服务器上的 SSH 服务 (sshd) 没有运行,或者防火墙(如 ufwfirewalld)阻止了对 22 端口的访问。
    • 解决:先在服务器上检查并启动 ssh 服务 (sudo systemctl start ssh)。然后检查防火墙规则,允许 22 端口通过(如 sudo ufw allow ssh)。
  2. “Permission denied, please try again”

    • 原因:输入的密码错误,或者用户名不存在。
    • 解决:仔细核对密码(注意大小写)。确认用户名在远程服务器上是存在的。
  3. 连接速度非常慢或卡在 “Authenticating…”

    • 原因:DNS 解析问题。服务器可能在尝试反向解析客户端的 IP 地址。
    • 解决:可以在服务器端的 SSH 配置文件 (/etc/ssh/sshd_config) 中将 UseDNS 选项设置为 no,然后重启 ssh 服务。
  4. 首次连接后,因服务器重装系统等原因再次连接时出现 “WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!”

    • 原因:服务器的主机密钥发生了变化(例如重装了系统),而你本地客户端还保存着旧密钥。
    • 解决:这是一个安全警告。如果确认是你预期的变更(如你自己重装了服务器),可以使用 ssh-keygen -R 服务器地址 命令来清除本地保存的旧密钥信息,然后重新连接。

小结

在本课中,我们掌握了 SSH 远程连接的基础知识:

  • SSH 是什么:一个用于安全远程登录和文件传输的加密网络协议,是 Linux 系统管理员的核心工具。
  • 如何准备:在服务器端安装并运行 openssh-server 服务。
  • 如何连接:使用 ssh 用户名@服务器地址 命令从客户端发起安全连接。
  • 如何传输文件:使用 scp 命令在本地和远程主机之间安全地复制文件。
  • 安全第一:理解首次连接确认指纹的意义,并注意检查服务状态和防火墙设置。

本课为你建立了安全访问远程服务器的基础能力。在下一课中,我们将学习更安全、更方便的SSH 密钥认证方式,告别每次输入密码的麻烦,并进一步加固服务器安全。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「SSH 密钥认证与配置」 以巩固所学知识。