← 返回文章列表

04 // 正文

SSH基础用法与密钥对配置详解

SSH 是运维工程师的"钥匙串"——没有它,你连服务器的大门都进不去;用不好它,钥匙就可能被别人捡走。它通过在公网上建立加密通道,让远程登录、文件传输都变得安全可靠。本文从一次基础连接讲起,带你完成密钥对配置、SSH config 别名、端口转发和文件传输,最后聊聊如何把这个入口加固到位。

SSH 为什么不可替代

SSH(Secure Shell)在不安全的网络上提供加密的远程登录与传输通道。它之所以是运维标配,是因为:

  • 全程加密:传输的数据无法被窃听和篡改
  • 多种认证:密码、密钥、证书等多种身份验证方式
  • 隧道能力:支持端口转发,安全访问内网服务
  • 跨平台:Linux、macOS、Windows 都能用

💡 小知识

密码认证每次都要输入密码,而且密码可能被暴力破解;密钥认证靠一对"锁和钥匙",既免密又安全。所以下面的密钥配置,是这篇文章的重头戏。

一次基础连接

最简单的登录方式,一行命令搞定:

# 基本连接
ssh root@192.168.1.100

# 指定端口(默认 22)
ssh -p 2222 root@192.168.1.100

# 一次性执行远程命令
ssh root@192.168.1.100 "df -h && uptime"

密钥对配置:从配钥匙到开门

密钥认证就是"配一把锁(公钥)放服务器上,留一把钥匙(私钥)在自己手里"。四步走:

# 1. 在本地生成密钥对
ssh-keygen -t ed25519 -C "your_email@example.com"

参数说明:-t ed25519 指定密钥类型(比 RSA 更短更快),-b 4096 可用于 rsa 指定长度,-C 加注释便于识别。生成时建议设置 passphrase——即使私钥被偷,没有口令也用不了。

# 2. 查看生成的密钥
ls -la ~/.ssh/
# id_ed25519     私钥(必须保密!权限 600)
# id_ed25519.pub 公钥(可以公开)
# 3. 把公钥装到服务器上(推荐,一行搞定)
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@192.168.1.100

# 没有 ssh-copy-id 时手动装:
# 1) cat ~/.ssh/id_ed25519.pub 复制公钥内容
# 2) ssh root@192.168.1.100 登录服务器
# 3) mkdir -p ~/.ssh
# 4) echo "公钥内容" >> ~/.ssh/authorized_keys
# 5) chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
# 4. 测试免密登录
ssh root@192.168.1.100
⚠️ 提醒:私钥文件权限必须是 600,服务器上的 ~/.ssh 必须是 700。权限太松(比如 644)时,OpenSSH 会直接拒绝使用该密钥——这是新手最常见的问题之一。

用 SSH config 告别长命令

机器多了之后,每次敲 ssh -p 2222 user@ip 太累。在 ~/.ssh/config 里定义别名,一劳永逸:

# ~/.ssh/config
Host myserver
    HostName 192.168.1.100
    User root
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60
    ServerAliveCountMax 3

Host github.com
    User git
    IdentityFile ~/.ssh/github_ed25519
# 之后直接:ssh myserver

端口转发与隧道:借道 SSH 走内网

SSH 不仅能登录,还能当"加密管道"用。三种最常见的玩法:

# 本地转发:把远程 80 端口映射到本地 8080,访问 localhost:8080 即访问远程站点
ssh -L 8080:localhost:80 root@192.168.1.100

# 远程转发:把本地服务暴露到远程,供远程网络访问
ssh -R 8080:localhost:80 root@192.168.1.100

# 动态转发:开一个 SOCKS 代理,浏览器走它访问内网
ssh -D 1080 root@192.168.1.100
📌 注意:-N 参数表示只建隧道不登 shell(ssh -N -L ...),配合 -f 后台运行,是做代理隧道的标准姿势。

文件传输:scp 与 sftp

传文件走加密通道,安全又方便:

# 上传
scp localfile.txt root@192.168.1.100:/path/to/destination/

# 下载
scp root@192.168.1.100:/path/to/file.txt ./local/

# 递归传目录
scp -r localdir/ root@192.168.1.100:/path/to/destination/

# 交互式文件管理
sftp root@192.168.1.100

常见问题排查

  1. 连接被拒绝:先 systemctl status sshd 看服务是否在跑,再 ss -lntp 看 22 端口是否监听
  2. 密钥登不上:确认 authorized_keys 内容与公钥一致、目录/文件权限正确
  3. 莫名掉线:本地 config 加 ServerAliveInterval,防空闲被掐断
  4. 详细调试ssh -vvv 看连接全过程,报错信息往往就在细节里
⚠️ 高发坑位:sshd_config 后千万别忘了 systemctl restart sshd,更要先 sshd -t 校验语法。禁掉密码登录前,务必确认密钥登录已经验证通过,否则就是给自己挖坑。

安全加固要点

# /etc/ssh/sshd_config 推荐配置
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
AllowUsers zhangsan
ClientAliveInterval 300

再叠加 Fail2ban 防暴力破解,多重防御基本就位。

最佳实践建议

  • 一律密钥认证:能不用密码登录就不用,从源头堵死爆破
  • 给私钥上锁:passphrase + ssh-agent,安全与便利兼得
  • 用别名管理:SSH config 把常用机器固化成"快捷方式"
  • 公钥不裸奔:只在 trusted host 上放公钥,别到处乱贴
  • 勤看日志journalctl -u ssh -f 盯登录记录,异常第一时间发现
  • 定期轮换:重要环境按周期更换密钥,回收离职人员的访问权
SSH 是运维一切远程操作的地基。地基打得稳(密钥认证、最小授权、日志留痕),上面的系统管理、自动化、监控才有意义。把钥匙管好,是每个运维的基本功。

从基础连接、密钥配置到端口转发和文件传输,这套技能已经覆盖了日常 90% 的远程操作。下一步可以结合 Linux 安全加固方案里讲的 Fail2ban 和防火墙,把 SSH 这个入口守得更严实。

相关资源