本文是一份面向 Debian / Ubuntu 的 SSH 实战指南,重点讲清楚如何安装 OpenSSH、使用密钥登录、配置服务端、做端口转发、复制文件以及排查常见问题。目标是把 SSH 从“会连”提升到“能稳定、安全地用”。
适用场景
- 远程登录 Linux 服务器
- 使用密钥替代密码登录
- 远程执行命令和脚本
- 通过 SSH 做文件传输和端口转发
- 管理多台服务器的统一访问
SSH 是什么
SSH 是 Secure Shell 的缩写,用于在不安全网络上进行加密远程登录和其他安全网络服务。常见实现是 OpenSSH。
SSH 通常替代这些老旧且不安全的协议:
- telnet
- rlogin
- rsh
安装前准备
确认:
- 你有目标服务器的访问权限
- 你知道服务器 IP 或域名
- 防火墙和安全组放行了 SSH 端口,默认是 22
安装 SSH 客户端
大多数 Linux 桌面或服务器默认已经有 SSH 客户端。如果没有:
sudo apt update
sudo apt install -y openssh-client验证:
ssh -V安装 SSH 服务端
如果你要让机器接受远程 SSH 登录,安装服务端:
sudo apt update
sudo apt install -y openssh-server启动并设置自启:
sudo systemctl enable ssh
sudo systemctl start ssh查看状态:
sudo systemctl status ssh在 Debian 上,服务名通常是 ssh,不是 sshd。
服务端配置文件
常见配置文件位置:
/etc/ssh/sshd_config
/etc/ssh/ssh_config
/etc/ssh/sshd_config.d/
/etc/ssh/ssh_config.d/说明:
- sshd_config:服务端配置
- ssh_config:客户端配置
- *.d/*.conf:Debian 新版本常用的分片配置目录
生成和查看主机密钥
SSH 服务端会使用主机密钥标识自己。常见文件位于:
/etc/ssh/ssh_host_* 如果主机密钥丢失或需要重建,可考虑重新生成,但要谨慎,因为这会影响客户端的主机指纹信任。
客户端基本用法
连接远程主机
ssh user@example.com指定端口:
ssh -p 2222 user@example.com指定私钥:
ssh -i ~/.ssh/id_ed25519 user@example.com远程执行命令
ssh user@example.com "uptime"传输文件
复制到远程:
scp file.txt user@example.com:/tmp/从远程复制到本地:
scp user@example.com:/tmp/file.txt .SFTP
sftp user@example.com密钥登录
相比密码登录,密钥登录更稳妥,也更适合自动化。
生成密钥
ssh-keygen -t ed25519 -C "your_email@example.com"建议优先使用 ed25519,除非你的环境有特殊兼容要求。
查看公钥
cat ~/.ssh/id_ed25519.pub把公钥放到远程服务器
最简单方式:
ssh-copy-id user@example.com如果没有 ssh-copy-id,也可以手工写入远程服务器的:
~/.ssh/authorized_keys检查本地 SSH 目录权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub服务端密钥认证配置
建议在确认密钥登录可用之后,再逐步关闭密码登录。
常见配置项示例:
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no注意:
- 先测试普通用户密钥登录
- 再考虑关闭密码登录
- 不建议开放 root 直接远程登录
修改后检查并重载:
sudo sshd -t
sudo systemctl reload sshSSH 常见配置项
常见服务端参数:
- Port:监听端口
- PermitRootLogin:是否允许 root 登录
- PasswordAuthentication:是否允许密码登录
- PubkeyAuthentication:是否允许密钥登录
- AllowUsers:允许的用户
- AllowGroups:允许的组
- X11Forwarding:是否转发 X11
- ClientAliveInterval:保持连接的空闲探活
- ClientAliveCountMax:断开前重试次数
示例片段
Port 22
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers deploy admin
ClientAliveInterval 60
ClientAliveCountMax 3安全建议
- 优先使用密钥认证
- 关闭 root 直接登录
- 不要把 SSH 暴露到不可信网络
- 给管理账号设置最小权限
- 必要时修改默认端口,但不要把“改端口”当作主要安全手段
- 可以结合 fail2ban 做暴力破解防护
SSH Agent
SSH Agent 可以帮助你在当前会话里缓存私钥解密后的状态。
常见用法:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l适合:
- 多次连接服务器
- 自动化脚本
- 需要减少重复输入私钥密码的场景
端口转发
SSH 不只是远程登录,还可以用于转发。
本地转发
把远端服务映射到本地:
ssh -L 8080:127.0.0.1:80 user@example.com访问本地 http://127.0.0.1:8080,实际转发到远端 80 端口。
远程转发
把本地服务暴露到远端:
ssh -R 9000:127.0.0.1:3000 user@example.com动态转发
把 SSH 当作 SOCKS 代理:
ssh -D 1080 user@example.com跳板机
如果你需要通过中间机访问内网主机,可以使用 ProxyJump:
ssh -J jumpuser@jump.example.com targetuser@target.internal这比手工套娃更清晰。
known_hosts 与主机指纹
第一次连接服务器时,SSH 会提示确认主机指纹。
相关文件:
~/.ssh/known_hosts建议:
- 不要无脑接受未知主机
- 主机指纹变化要先确认原因
- 服务器重装或主机密钥重建后,客户端可能需要清理旧记录
常见问题
1. Permission denied (publickey)
常见原因:
- 公钥没放到远端
- 远端用户不对
- .ssh 权限不对
- authorized_keys 内容错误
2. Connection refused
常见原因:
- ssh 服务没启动
- 端口没监听
- 防火墙阻止
3. Host key verification failed
常见原因:
- 远端主机密钥变化
- 旧的 known_hosts 记录冲突
4. 登录后立刻断开
常见原因:
- 用户 shell 配置有错误
- 家目录权限不对
- 服务端 PAM 或强制命令配置异常
5. 连接很慢
可能原因:
- DNS 反查慢
- 网络质量差
- SSH 服务端配置不合理
排障顺序
- 确认 ssh 服务是否运行
- 确认端口是否监听
- 确认防火墙是否放行
- 确认用户名和密钥是否正确
- 检查服务端日志
服务端日志查看:
sudo journalctl -u ssh -xe最小可用流程
如果你只是想快速把一台机器配成可 SSH 登录,顺序如下:
sudo apt update
sudo apt install -y openssh-server
sudo systemctl enable ssh
sudo systemctl start ssh
ssh-keygen -t ed25519
ssh-copy-id user@server然后测试:
ssh user@server结论
SSH 的关键不是“会连上去”,而是:
- 客户端和服务端配置清楚
- 密钥和权限正确
- root 登录和密码登录有明确边界
- 转发和跳板机用法清晰
- 出问题时知道看日志和指纹