SSH 完全手册:文件传输、安全策略与端口转发,一篇就够了

24 阅读13分钟

前言

在 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 协议实现安全的跨主机文件传输。它的特点是全量拷贝,每次传输都会复制所有指定的文件。

常用选项

参数

作用说明

使用示例

-r

递归复制,传输文件夹必须使用

scp -r ./dir root@192.1.1:/tmp

-P

大写 P,指定 SSH 端口(默认 22)

scp -P 2233 test.txt root@ip:/

-p

小写 p,保留文件权限、时间戳

scp -p file.tar user@ip:/data

-C

传输时开启压缩,弱网 / 大文件提速

scp -Cr logs root@ip:/opt

-v

输出详细调试日志,用于排错

scp -v app.log user@ip:/tmp

-i

指定自定义私钥文件

scp -i ~/.ssh/my.pem file root@ip:/

-l

限制传输带宽,单位 Kbit/s

scp -l 5120 big.iso root@ip:/mnt

-q

静默模式,不打印进度与提示

scp -q backup.zip user@ip:/

-o

传递 ssh 原生配置参数

scp -o StrictHostKeyChecking=no file user@ip:/tmp

-4

强制使用 IPv4 地址连接

scp -4 test.txt root@192.168.1.1:/

-6

强制使用 IPv6 地址连接

scp -6 test.txt root@[2001::1]:/tmp

命令来源查询:

[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 下的内容)
常用选项详解

选项

说明

-r

递归拷贝目录

-a

归档模式(保留权限、时间戳等)

-v

显示详细信息

-z

传输时压缩

--progress

显示传输进度

-P

开启断点续传

--delete

删除目标端多余文件,保持一致性

--exclude

排除指定文件或目录

--ignore-existing

忽略已存在的文件

--existing

只更新已存在的文件

实战示例

基本备份同步:

# 完整备份,显示进度
[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 核心配置参数

参数

默认值

说明

Port

22

SSH 监听端口

ListenAddress

0.0.0.0

监听 IP 地址

PermitRootLogin

prohibit-password

是否允许 root 登录

MaxAuthTries

6

密码重试次数

PubkeyAuthentication

yes

是否启用密钥认证

PasswordAuthentication

yes

是否启用密码认证

PermitEmptyPasswords

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 基于密码的认证

这是最传统的认证方式,通过用户名和密码验证身份。

认证流程:

  1. 客户端发起 SSH 连接请求
  2. 服务端返回主机公钥指纹
  3. 客户端确认并保存主机公钥到 ~/.ssh/known_hosts
  4. 客户端输入密码,使用服务端主机公钥加密
  5. 服务端用私钥解密,验证密码
  6. 验证通过则允许登录

服务端主机公钥文件:

  • 位置:/etc/ssh/ssh_host_*_key.pub
  • 客户端保存位置:~/.ssh/known_hosts

5.2 基于密钥的认证(免密登录)

密钥认证使用非对称加密,比密码认证更安全,适合自动化脚本和批量操作。

认证流程:

  1. 客户端使用 ssh-keygen 生成用户公钥和私钥
  2. 客户端将公钥复制到服务端的 ~/.ssh/authorized_keys
  3. 客户端发起连接,服务端生成随机字符串
  4. 服务端用客户端公钥加密随机串并发送
  5. 客户端用私钥解密,再用服务端主机公钥加密
  6. 服务端用私钥解密并验证随机串
  7. 验证通过,允许免密登录
配置步骤

第一步:生成密钥对

[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 模式,互通),要求:

  1. 客户端配置 SSH 免密登录服务端
  2. 可以免密登录到服务端的 root 和 user 用户
  3. 通过 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 版本
  • 合理配置防火墙规则

本文基于实际运维经验整理,如有疑问或补充,欢迎交流讨论。