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
常见问题排查
- 连接被拒绝:先
systemctl status sshd看服务是否在跑,再ss -lntp看 22 端口是否监听 - 密钥登不上:确认
authorized_keys内容与公钥一致、目录/文件权限正确 - 莫名掉线:本地 config 加
ServerAliveInterval,防空闲被掐断 - 详细调试:
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 这个入口守得更严实。