SSH (安全外壳协议)
约 5 分钟阅读
最后更新: 2026-08-12
什么是 SSH
SSH (Secure Shell) 是一种为了安全地远程连接网络上的计算机而设计的协议。它对所有通信内容进行加密,从而排除了密码和命令内容被第三方窃听的风险。
在 SSH 出现以前,人们使用 Telnet 和 rlogin 等协议,但它们以明文 (未加密) 传输通信内容,对网络上的窃听毫无防备。1995 年,芬兰的 Tatu Ylönen 开发了 SSH,其后它以 OpenSSH 的形式开源,成为事实上的标准协议。
如今,SSH 被用于服务器管理、云基础设施操作、Git 仓库访问、自动化部署流水线等 IT 基础设施的各种场景。默认的端口号是 22。
公钥认证的工作原理
SSH 的认证方式中最受推荐的是公钥认证。它不使用密码,而是用数学上成对的两把密钥 (公钥和私钥) 来完成身份确认。
- 生成密钥对:在客户端运行
ssh-keygen命令,生成公钥与私钥的密钥对。私钥保存在客户端,绝不能泄露到外部。 - 注册公钥:把生成的公钥登记到服务器的
~/.ssh/authorized_keys文件中。 - 认证过程:连接时,服务器生成随机的挑战数据并发送给客户端;客户端用私钥对挑战数据签名,服务器再用公钥验证该签名。私钥本身不会流经网络。
密钥算法目前推荐 Ed25519。RSA 也在广泛使用,但建议密钥长度为 4096 位以上。DSA 和 ECDSA (nistp256) 因安全方面的顾虑已不再推荐。
端口转发
SSH 的端口转发 (隧道) 是通过 SSH 的加密连接,把其他协议的通信安全地转发出去的功能。
- 本地转发:把对客户端一侧端口的连接,经由 SSH 隧道转发到远程服务器一侧的指定端口。例如用
ssh -L 3306:db-server:3306 bastion,即可从本地的 3306 端口经跳板机连接数据库。用于连接因防火墙而无法直接访问的服务。 - 远程转发:把对远程服务器一侧端口的连接,经由 SSH 隧道转发到客户端一侧。用于把位于 NAT 内侧的服务器对外公开等场景。
- 动态转发:把 SSH 连接当作 SOCKS 代理使用。执行
ssh -D 1080 server后,只要把浏览器的代理设置指向localhost:1080,所有网页通信都会经过 SSH 隧道。对公共 Wi-Fi 上的通信保护很有效。
在尚不至于要搭建 VPN、但需要安全连接特定服务的场合,端口转发非常实用。经由跳板机 (Bastion Host) 的多级 SSH 连接,也可以用 ~/.ssh/config 的 ProxyJump 指令简洁地配置。
SCP 和 SFTP 文件传输
利用 SSH 的加密通道进行文件传输的协议,有 SCP 和 SFTP 两种。
scp file.txt user@server:/path/。不能中断与续传,也不适合目录的同步。从 OpenSSH 9.0 开始,其内部改为使用 SFTP 协议。传统的 FTP 以明文传输密码和文件内容,因此如今出于安全上的理由,强烈建议迁移到 SFTP。除了需要与旧系统保持兼容的情况,新建系统都应选择 SFTP。
SSH 安全最佳实践
SSH 即使保持默认设置也能提供加密通信,但在生产环境中施加以下配置,可以大幅降低受攻击的风险。
- 禁用密码认证:在
/etc/ssh/sshd_config中设置PasswordAuthentication no,仅允许公钥认证。仅此一项就能让绝大多数暴力破解攻击失效。 - 禁止 root 登录:设置
PermitRootLogin no,改为以普通用户登录后再用sudo提升权限的运维方式。 - 更改端口号:把默认的 22 端口改为其他端口。这并不能从本质上强化安全性,但能大幅减少自动扫描带来的攻击尝试。
- 限制来源 IP:用防火墙把对 SSH 端口的访问限定在特定的 IP 地址。在云环境中则用安全组来控制。
- 部署 Fail2ban:这是把认证失败超过一定次数的 IP 地址自动封锁的工具,是针对暴力破解攻击的有效对策。
- 密钥的轮换:定期更新 SSH 密钥,把离职人员和不再需要的密钥迅速从
authorized_keys中删除。一旦疏于清点密钥,离职人员仍能继续访问服务器的状态就会被放任下去。
常见误解
- SSH 只有系统管理员才会用
- 开发人员通过 SSH 访问 Git 仓库 (git@github.com:...),CI/CD 流水线通过 SSH 部署代码,数据科学家通过 SSH 连接远程 GPU 服务器。几乎所有 IT 从业者都在日常工作中使用 SSH。
- 改了 SSH 端口就安全了
- 更改端口可以减少自动扫描,但通过端口扫描很容易发现。真正的安全需要禁用密码认证、强制公钥认证、限制来源 IP 等多重措施。
- SSH 密钥创建后可以永久使用
- SSH 密钥应该定期轮换。风险包括离职人员密钥未删除、私钥泄露可能性以及加密算法过时等问题。