前言
在 Linux 运维和系统管理中,跨主机的远程操作和文件传输是日常工作的重要组成部分。SSH(Secure Shell)协议作为网络安全连接的基石,为我们提供了安全可靠的远程管理和数据传输能力。本文将基于 OpenSSH 套件,全面讲解 SSH 协议原理、文件传输工具、远程管理配置、认证机制以及高级应用,帮助读者建立完整的 SSH 知识体系。
一、SSH 协议与 OpenSSH 套件
1.1 SSH 协议概述
SSH(Secure Shell)是一种网络协议,用于计算机之间的加密通信。它通过加密所有传输的数据,有效防止了网络窃听、连接劫持等安全威胁。SSH 协议被广泛应用于远程登录、命令执行以及文件传输等场景。
核心特点:
- 加密通信,保障数据传输安全
- 支持多种认证方式
- 提供安全的远程管理通道
- 可作为其他协议的安全传输层
1.2 OpenSSH 套件组成
OpenSSH 是 SSH 协议的开源实现,包含多个软件包:
软件包 | 作用 | 包含工具 |
openssh-server | 服务端程序,提供 sshd 服务 | sshd.service |
openssh-clients | 客户端程序,提供连接工具 | ssh, scp, sftp 等 |
在 Linux 系统中,默认同时安装了服务端和客户端组件:
# 查看已安装的 openssh 组件
[root@lab1 ~]# rpm -qa | grep openssh-server
openssh-server-8.7p1-34.el9.x86_64
[root@lab1 ~]# rpm -qa | grep openssh-client
openssh-clients-8.7p1-34.el9.x86_64
重要概念:
- sshd.service:服务端守护进程,监听 SSH 连接请求
- ssh 命令:客户端工具,发起远程连接
- 同一台主机:既可作为服务端,也可作为客户端
1.3 排查
SSH不能访问
-
sshd服务没开启
-
防火墙问题
-
检查黑名单
-
不能传输文件
-
检查SSH服务器
-
检查网络通信
二、跨主机文件传输工具
2.1 scp 命令(全量同步)
scp(secure copy)基于 SSH 协议实现安全的跨主机文件传输。它的特点是全量拷贝,每次传输都会复制所有指定的文件。
常用选项
参数 | 作用说明 | 使用示例 |
| 递归复制,传输文件夹必须使用 |
|
| 大写 P,指定 SSH 端口(默认 22) |
|
| 小写 p,保留文件权限、时间戳 |
|
| 传输时开启压缩,弱网 / 大文件提速 |
|
| 输出详细调试日志,用于排错 |
|
| 指定自定义私钥文件 |
|
| 限制传输带宽,单位 Kbit/s |
|
| 静默模式,不打印进度与提示 |
|
| 传递 ssh 原生配置参数 |
|
| 强制使用 IPv4 地址连接 |
|
| 强制使用 IPv6 地址连接 |
|
命令来源查询:
[root@lab1 ~]# rpm -qf `which scp`
openssh-clients-8.7p1-34.el9.x86_64
两种传输模式
推送模式(本机 → 远程):
需要X权限
scp [选项] 本地源文件路径 远程用户@远程IP:远程目录
拉取模式(远程 → 本机):
需要W权限
scp [选项] 远程用户@远程IP:远程文件 本地路径
实际案例
案例一:拷贝单个文件
# 将本机的 /etc/passwd 推送到远程主机的 /opt/ 目录
[root@lab1 ~]# scp /etc/passwd root@192.168.200.154:/opt/
案例二:拷贝整个目录(递归)
# 使用 -r 选项实现目录递归拷贝
[root@lab1 ~]# scp -r /etc/ root@192.168.200.154:/opt/
案例三:指定端口连接
# 当服务端 SSH 监听非默认端口时,使用 -P 指定端口
[root@lab1 ~]# scp -P 2222 -r /etc/ root@192.168.200.154:/opt/
注意: scp 的端口选项是大写的 -P,而 ssh 命令使用的是小写 -p。
2.2 rsync 命令(增量同步)
rsync 是更强大的文件同步工具,支持增量拷贝,只会传输变化的部分,且支持断点续传。
基于ssh,daemon(不多)
常用参数
参数 | 作用 |
-a | 归档模式,最核心,包含递归、权限、时间、软链接等 |
-v | 显示详细输出,看到传输文件 |
-z | 传输压缩,远程同步提速 |
-h | 人性化单位(GB/MB),可读性高 |
-P | 等价 --progress --partial,显示进度 + 断点续传 |
-e "ssh -p 端口" | 指定 ssh 端口连接远程 |
--delete | 删除目标端多余文件,完全对齐源目录 |
--exclude=xxx | 排除文件 / 文件夹 |
--bwlimit=1000 | 限速,单位 KB/s |
-n / --dry-run | 模拟同步,不真实修改,测试用 |
与 scp 的核心区别:
特性 | scp | rsync |
拷贝方式 | 全量拷贝 | 增量拷贝 |
断点续传 | 不支持 | 支持 |
传输中断影响 | 文件不完整 | 下次继续传输 |
适用场景 | 一次性文件传输 | 定期备份同步 |
基本使用(同 scp 语法)
推送:
rsync [选项] 本地源路径 远程用户@远程IP:远程目录
拉取:
rsync [选项] 远程用户@远程IP:远程文件 本地路径
目录拷贝的特殊规则
# 目录后不带 / :拷贝目录本身
rsync -r /etc root@192.168.200.154:/opt
# 结果:/opt/etc/
# 目录后带 / :拷贝目录下的所有内容
rsync -r /etc/ root@192.168.200.154:/opt
# 结果:/opt/passwd, /opt/group, ...(etc 下的内容)
常用选项详解
选项 | 说明 |
| 递归拷贝目录 |
| 归档模式(保留权限、时间戳等) |
| 显示详细信息 |
| 传输时压缩 |
| 显示传输进度 |
| 开启断点续传 |
| 删除目标端多余文件,保持一致性 |
| 排除指定文件或目录 |
| 忽略已存在的文件 |
| 只更新已存在的文件 |
实战示例
基本备份同步:
# 完整备份,显示进度
[root@lab1 ~]# rsync -avz --progress /data/ backup@192.168.200.154:/backup/
排除特定文件:
# 同步时排除 passwd 文件
[root@lab1 opt]# rsync -e 'ssh -p 2222' -avz --progress /opt --exclude=passwd root@192.168.200.154:/opt
数据一致性同步(删除多余文件):
# 以源端为准,删除目标端多余文件
[root@lab1 ~]# rsync -av --delete /source/ user@192.168.200.154:/target/
2.3 Windows 与 Linux 文件传输
在 Windows 平台上,推荐使用支持 SSH 协议的第三方工具:
工具 | 特点 |
WinSCP | 图形化界面,支持 SFTP/SCP |
Xftp | 功能丰富,适合频繁传输 |
MobaXterm | 集成 SSH、SFTP、X11 等 |
FileZilla | 免费开源,支持 SFTP |
这些工具都提供了直观的文件拖拽操作,降低了跨平台文件传输的门槛。
三、SSH 远程管理 Linux
3.1 基本远程登录
命令语法:
ssh 远程用户@远程主机IP/主机名
首次连接示例:
[root@lab1 ~]# ssh root@192.168.200.154
The authenticity of host '192.168.200.154 (192.168.200.154)' can't be established.
ED25519 key fingerprint is SHA256:J1s1pETGnreX+syiMgRLSMJbQwByKgfVjfa66fy9On4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.200.154' (ED25519) to the list of known hosts.
root@192.168.200.154's password:
Last login: Sat Jun 27 11:01:41 2026 from 192.168.200.128
[root@localhost ~]#
3.2 远程执行命令
SSH 可以直接在远程主机上执行命令,无需登录交互式 shell:
# 在远程主机创建用户
[root@lab1 ~]# ssh root@192.168.200.154 'useradd devops'
root@192.168.200.154's password:
# 在远程主机删除用户
[root@lab1 ~]# ssh root@192.168.200.154 'userdel -r devops'
root@192.168.200.154's password:
3.3 图形化程序转发(X11)
使用 -X 选项可以在本地显示远程主机的图形化程序:
ssh -X root@192.168.200.154
前提条件: 本地需要运行 X Server(Windows 可使用 Xming 或 VcXsrv,Linux 原生支持)。
3.4 Windows 远程 SSH 登录
Windows 10/11 已内置 OpenSSH 客户端:
方法一:CMD 命令行
ssh root@192.168.200.154
方法二:第三方工具
- Xshell
- Putty
- MobaXterm
- Finalshell
四、SSH 服务端配置与管理
4.1 配置文件位置
SSH 配置文件位于 /etc/ssh/ 目录:
[root@lab1 ~]# ll /etc/ssh/
total 604
-rw-r--r--. 1 root root 578094 Jul 20 2023 moduli
-rw-r--r--. 1 root root 1921 Jul 20 2023 ssh_config # 客户端配置
-rw-------. 1 root root 3725 Jun 6 14:56 sshd_config # 服务端配置 ★
-rw-------. 1 root root 3686 May 30 14:00 sshd_config.bak
-rw-r-----. 1 root ssh_keys 480 May 16 15:45 ssh_host_ecdsa_key
-rw-r--r--. 1 root root 162 May 16 15:45 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys 387 May 16 15:45 ssh_host_ed25519_key
-rw-r--r--. 1 root root 82 May 16 15:45 ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys 2578 May 16 15:45 ssh_host_rsa_key
-rw-r--r--. 1 root root 554 May 16 15:45 ssh_host_rsa_key.pub
关键文件: sshd_config 是服务端主配置文件,我们所有的安全加固都在这进行。
4.2 核心配置参数
参数 | 默认值 | 说明 |
| 22 | SSH 监听端口 |
| 0.0.0.0 | 监听 IP 地址 |
| prohibit-password | 是否允许 root 登录 |
| 6 | 密码重试次数 |
| yes | 是否启用密钥认证 |
| yes | 是否启用密码认证 |
| no | 是否允许空密码 |
4.3 SELinux 注意事项
修改 SSH 端口时,需要关闭 SELinux 或配置相应策略:
# 查看 SELinux 状态
[root@client ~]# getenforce
Enforcing
# 临时关闭
[root@client ~]# setenforce 0
# 永久关闭(需重启)
[root@client ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
4.4 黑白名单访问控制
基于用户名的控制:
# 黑名单:禁止特定用户登录
DenyUsers root@192.168.200.1
DenyUsers *@192.168.200.1
DenyUsers root@*
# 白名单:仅允许特定用户登录
AllowUsers root@192.168.200.1
AllowUsers *@192.168.200.1
AllowUsers root@*
实用技巧:批量禁用暴力破解来源
通过 lastb 分析登录失败记录,批量生成拒绝规则:
# 统计失败登录的用户名
echo "DenyUsers $(lastb | head -n -2 | cut -d " " -f1 | sort | uniq)" >> /etc/ssh/sshd_config
# 统计失败登录的来源 IP
echo "DenyUsers $(lastb | head -n -2 | awk '{print $3}' | sort | uniq)" >> /etc/ssh/sshd_config
五、SSH 认证方式
5.1 基于密码的认证
这是最传统的认证方式,通过用户名和密码验证身份。
认证流程:
- 客户端发起 SSH 连接请求
- 服务端返回主机公钥指纹
- 客户端确认并保存主机公钥到
~/.ssh/known_hosts - 客户端输入密码,使用服务端主机公钥加密
- 服务端用私钥解密,验证密码
- 验证通过则允许登录
服务端主机公钥文件:
- 位置:
/etc/ssh/ssh_host_*_key.pub - 客户端保存位置:
~/.ssh/known_hosts
5.2 基于密钥的认证(免密登录)
密钥认证使用非对称加密,比密码认证更安全,适合自动化脚本和批量操作。
认证流程:
- 客户端使用
ssh-keygen生成用户公钥和私钥 - 客户端将公钥复制到服务端的
~/.ssh/authorized_keys - 客户端发起连接,服务端生成随机字符串
- 服务端用客户端公钥加密随机串并发送
- 客户端用私钥解密,再用服务端主机公钥加密
- 服务端用私钥解密并验证随机串
- 验证通过,允许免密登录
配置步骤
第一步:生成密钥对
[root@lab1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): # 可设置密码保护
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
第二步:复制公钥到远程主机
方法一(手动):
[root@lab1 ~]# scp .ssh/id_rsa.pub root@192.168.200.154:/root/.ssh/authorized_keys
方法二(推荐):
[root@lab1 ~]# ssh-copy-id root@192.168.200.154
5.3 常见认证错误及解决
错误一:私钥权限过大
Permissions 0644 for '/root/.ssh/id_rsa' are too open.
原因: 私钥文件权限过大,SSH 认为不安全。
解决:
chmod 600 ~/.ssh/id_rsa
错误二:主机公钥变更
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
原因: 远程主机重新生成了主机密钥,或 IP 被其他主机占用。
解决: 从 ~/.ssh/known_hosts 中删除对应记录
ssh-keygen -R 192.168.200.154
六、保证 SSH 连接安全的最佳实践
在生产环境中,建议采用以下安全配置:
6.1 核心安全加固建议
# /etc/ssh/sshd_config 安全配置示例
# 1. 修改监听端口(避开默认22端口)
Port 2222
# 2. 禁用 root 远程登录
PermitRootLogin no
# 3. 只允许密钥认证,禁用密码认证
PasswordAuthentication no
PubkeyAuthentication yes
# 4. 限制认证尝试次数
MaxAuthTries 3
# 5. 配置白名单
AllowUsers admin@192.168.1.* devops@10.0.0.*
# 6. 禁用空密码
PermitEmptyPasswords no
# 7. 配置登录超时
ClientAliveInterval 300
ClientAliveCountMax 0
6.2 私钥加密保护
为了防止私钥泄露风险,可以在生成密钥时设置密码:
# 生成带密码保护的密钥
[root@lab1 ~]# ssh-keygen -t rsa -b 4096
Enter passphrase (empty for no passphrase): ********
Enter same passphrase again: ********
特点:
- 即使私钥泄露,仍需密码才能使用
- 可通过
ssh-agent缓存密码,减少重复输入
6.3 监控与审计
# 查看当前登录用户
who
w
# 查看登录历史
last
# 查看登录失败记录
lastb
# 实时监控 SSH 日志
tail -f /var/log/secure | grep ssh
七、高级应用:SSH 端口转发(隧道)
SSH 端口转发(SSH Tunneling)是 SSH 最强大的功能之一,可以实现网络流量的安全转发和穿透防火墙。
7.1 本地端口转发(Local Forwarding)
用途: 将本地端口流量转发到远程主机,适合绕过防火墙访问内网服务。
语法:
ssh -Nf -L 本地端口:目标主机:目标端口 跳板机用户@跳板机IP
示例: 将本地 8888 端口流量转发到内网 192.168.200.154 的 80 端口
[root@lab1 ~]# ssh -Nf -L 8888:192.168.200.154:80 root@192.168.200.150
参数说明:
-N:不执行远程命令-f:后台运行-L:本地端口转发
应用场景: 访问被防火墙阻挡的内部 Web 服务。
7.2 远程端口转发(Remote Forwarding)
用途: 将远程主机端口流量转发到本地,适合内网服务对外暴露。
语法:
ssh -Nf -R 远程端口:本地目标:本地端口 公网主机用户@公网主机IP
示例: 将公网主机的 8888 端口转发到本机的 80 端口
[root@client html]# ssh -Nf -R 8888:127.0.0.1:80 root@94.74.98.54
注意: 需要在服务端开启 GatewayPorts yes,才能监听所有 IP。
7.3 动态端口转发(SOCKS 代理)
用途: 建立一个 SOCKS 代理服务器,通过 SSH 隧道访问网络。
语法:
ssh -Nf -g -D 本地端口 跳板机用户@跳板机IP
示例: 建立 SOCKS5 代理
[root@lab1 ~]# ssh -Nf -g -D 8888 root@94.74.98.54
应用场景: 浏览器配置 SOCKS5 代理(127.0.0.1:8888),实现科学上网或访问内网资源。
八、综合案例实战
案例要求
准备 2 台虚拟机(NAT 模式,互通),要求:
- 客户端配置 SSH 免密登录服务端
- 可以免密登录到服务端的 root 和 user 用户
- 通过 scp 免密传输
/etc/passwd和/etc/group到/opt/
操作步骤
1. 在客户端生成密钥对
ssh-keygen -t rsa -b 4096
2. 复制公钥到服务端 root 用户
ssh-copy-id root@192.168.200.154
3. 复制公钥到服务端普通用户
# 服务端先创建普通用户
ssh root@192.168.200.154 'useradd user'
ssh root@192.168.200.154 'echo "password" | passwd --stdin user'
# 复制公钥
ssh-copy-id user@192.168.200.154
4. 测试免密登录
ssh root@192.168.200.154
ssh user@192.168.200.154
5. 免密传输文件
scp /etc/passwd root@192.168.200.154:/opt/
scp /etc/group user@192.168.200.154:/opt/
总结
本文系统地介绍了 OpenSSH 套件的核心功能:
功能模块 | 关键点 |
文件传输 | scp 全量拷贝 vs rsync 增量同步 |
远程管理 | ssh 命令、远程命令执行、X11 转发 |
安全加固 | 修改端口、禁用 root、密钥认证、黑白名单 |
高级应用 | 本地/远程/动态端口转发 |
SSH 作为 Linux 运维的基石工具,掌握其原理和高级用法,能够显著提升运维效率和安全水平。在实际生产环境中,建议:
- 使用密钥认证替代密码认证
- 定期审查 SSH 日志
- 及时更新 OpenSSH 版本
- 合理配置防火墙规则
本文基于实际运维经验整理,如有疑问或补充,欢迎交流讨论。