摘要
本文系统梳理了 SSH 协议、OpenSSH 软件、服务配置、故障排查以及密钥认证等核心知识点。内容涵盖 SSH 协议基础、OpenSSH 组件构成、服务端配置优化、常见连接问题排查步骤,并详细演示了 Linux 与 Linux、Windows 与 Linux 之间基于密钥的免密登录配置过程。
1. SSH 协议与 OpenSSH 简介
协议 (Protocol):在数据交换过程中建立的标准和规则。在计算机领域,协议通常以软件形式实现,定义了数据的组成格式和交互方式。
SSH (Secure Shell):一种安全的网络协议,用于在不安全的网络上提供安全的远程登录和其他安全网络服务。
OpenSSH:是 SSH 协议的一个开源实现,它是一个远程控制软件,用于安全地远程操作 Linux 系统。其核心特性包括:
- 加密传输:远程传输的数据经过加密,安全性高,难以破解。
- 身份认证:支持密码和密钥等多种认证方式。
- 常用加密算法:RSA、ECDSA、Ed25519。
2. OpenSSH 组件与安装
2.1 核心软件包
在 Rocky Linux/CentOS 系统中,OpenSSH 通常包含以下主要软件包:
- openssh:完整元包,包含客户端、服务端、密钥生成工具及共享库。
- openssh-clients:客户端包,包含
ssh,scp,sftp等连接工具,用于主动连接其他 SSH 服务器。 - openssh-server:服务器端包,包含
sshd守护进程,用于开启 SSH 服务,允许他人连接。
查询已安装的 OpenSSH 相关包:
rpm -qa | grep openssh2.2 从镜像安装软件
系统镜像(如光盘)是软件的重要来源。挂载光盘并查找软件包:
# 挂载光盘到 /mnt 目录 mount /dev/cdrom /mnt 进入 Packages 目录查找 openssh 相关包 cd /mnt/AppStream/Packages/ ls openssh* 使用 rpm 命令安装(注意依赖) rpm -ivh openssh-*.rpm3. SSH 服务配置与加固
3.1 配置文件解析
- sshd_config:SSH 服务端 (
sshd) 的主配置文件,控制他人连接本机时的行为。 - ssh_config:SSH 客户端的配置文件,控制本机主动连接他人时的行为。
- 配置目录:
/etc/ssh/sshd_config.d/存放服务端子配置文件,优先级高于主配置文件。
配置加载顺序:sshd进程先读取主配置文件sshd_config,再读取子配置文件*.conf,子配置会覆盖主配置中的相同项。
3.2 常见安全加固方法
编辑/etc/ssh/sshd_config或子配置文件进行加固:
- 修改默认端口:将端口从 22 改为 1024-65535 之间的任意端口。
Port 2255 - 禁止 root 用户直接登录:
PermitRootLogin no - 禁用密码认证,仅使用密钥登录(更高安全级别):
PasswordAuthentication no PubkeyAuthentication yes
注意:在启用 SELinux 时,修改默认端口可能导致连接失败,需临时或永久禁用 SELinux。
3.3 服务管理
修改配置后必须重启服务使配置生效:
systemctl restart sshd # 或 service sshd restart验证服务状态与端口监听:
# 查看 sshd 进程 ps aux | grep sshd 查看端口监听情况 ss -anplut | grep sshd 或 netstat -anlutp | grep sshd 查看特定端口被哪个进程占用 lsof -i:22554. SSH 连接问题排查流程
当 SSH 连接失败时,可按以下步骤排查:
- 测试网络连通性:使用
ping命令检查目标 IP 是否可达。 - 检查 SSH 服务状态:确认
sshd进程是否运行,端口是否监听。 - 确认端口号:检查客户端是否使用了正确的端口(非默认 22 端口时需指定
-p)。 - 检查用户限制:确认配置文件是否限制了特定用户登录。
- 查看日志:检查
/var/log/secure或/var/log/auth.log获取详细错误信息。 - 检查防火墙与 SELinux:
- 临时关闭防火墙:
systemctl stop firewalld - 禁用防火墙开机自启:
systemctl disable firewalld - 查看 SELinux 状态:
getenforce - 临时关闭 SELinux:
setenforce 0 - 永久禁用 SELinux:编辑
/etc/selinux/config,设置SELINUX=disabled并重启。
- 临时关闭防火墙:
- 检查 SSH 配置:确认是否配置了禁止密码登录等限制。
5. SSH 密钥认证实战
5.1 Linux 与 Linux 之间密钥认证
目标:实现从 Client 机(如 Ubuntu)到 Server 机(如 Rocky Linux)的免密登录。
步骤:
- 在 Client 端生成密钥对:
ssh-keygen -t ed25519 # 默认保存在 ~/.ssh/id_ed25519(私钥)和 ~/.ssh/id_ed25519.pub(公钥) - 将公钥传输到 Server 端:
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2255 username@server_ip # 例如:ssh-copy-id -p 2255 fanzb@192.168.10.228该命令会将公钥自动追加到 Server 端用户家目录的
~/.ssh/authorized_keys文件中。 - 验证免密登录:
ssh -p 2255 username@server_ip # 例如:ssh -p 2255 fanzb@192.168.10.228
5.2 Windows (Xshell) 与 Linux 之间密钥认证
目标:使用 Xshell 通过密钥登录 Linux 服务器。
步骤:
- 在 Xshell 中生成密钥对:
- 打开 Xshell,点击菜单栏「工具」-「新建用户密钥生成向导」。
- 选择密钥类型(如 RSA)和密钥长度,生成密钥对。
- 将生成的公钥内容保存下来。
- 在 Linux Server 上配置公钥:
- 登录 Server,进入相应用户的家目录(例如普通用户
fanzb)。 - 创建或编辑
~/.ssh/authorized_keys文件。 - 将 Xshell 生成的公钥内容粘贴到该文件中,每行一个公钥。
- 设置正确的文件权限:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
- 登录 Server,进入相应用户的家目录(例如普通用户
- 在 Xshell 中配置连接:
- 新建会话,填写主机 IP 和端口。
- 在「用户身份验证」方法中选择「Public Key」,并浏览选择刚才生成的私钥文件。
- 连接即可实现免密登录。
6. 常用客户端工具
- ssh:远程登录。
ssh -p 2255 user@host_ip - scp:安全拷贝文件。
# 上传文件到远程 scp -P 2255 local_file user@host_ip:remote_path 从远程下载文件 scp -P 2255 user@host_ip:remote_file local_path注意:
scp使用大写的-P指定端口,而ssh使用小写的-p。 - sftp:交互式安全文件传输。
7. 总结
- 安全第一:修改默认端口、禁用 root 登录、使用密钥认证是加固 SSH 服务的三大有效措施。
- 配置管理:理解主配置文件与子配置文件的优先级,修改后务必重启服务。
- 故障排查:按照“网络 → 服务 → 端口 → 配置 → 防火墙/SELinux → 日志”的顺序进行排查。
- 密钥管理:私钥务必妥善保管,公钥分发到目标服务器的
~/.ssh/authorized_keys文件中。 - 环境准备:实验或生产环境部署前,建议先关闭防火墙和 SELinux 以避免干扰,待调试完成后再按需开启。