SSH 安装与使用指南

本文是一份面向 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 ssh

SSH 常见配置项

常见服务端参数:

  • 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 服务端配置不合理

排障顺序

  1. 确认 ssh 服务是否运行
  2. 确认端口是否监听
  3. 确认防火墙是否放行
  4. 确认用户名和密钥是否正确
  5. 检查服务端日志

服务端日志查看:

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 登录和密码登录有明确边界
  • 转发和跳板机用法清晰
  • 出问题时知道看日志和指纹
本文地址: https://www.vvcms.cn/blog/ssh-guid
版权所有 © admin 未经授权不得转载