引言
「服务器怎么安全地连进去」「内网服务怎么从外网访问」「不用密码怎么免密登录」——答案都是 SSH。本文把 SSH 讲透三层:连接(sshd 配置 + 密钥认证免密)、隧道(本地转发/远程转发/动态代理,内网穿透的核心)、安全(加固清单 + 跳板机管理),最后覆盖 scp/rsync 传输与排错。掌握 SSH 就从「远程工具」进阶为「网络基础设施」。
前置:/linux-network-commands/(网络连接)。SSH 基于 TCP 22 端口;防火墙放行见 /linux-firewall-nftables/。服务开机自启见 /linux-systemd-services/。
目录
- 1. SSH 服务全景:远程管理与安全
- 2. sshd:服务端配置
- 3. 密钥认证:从密码到免密
- 4. 本地转发:访问内网服务
- 5. 远程转发与动态代理
- 6. scp 与 rsync:安全文件传输
- 7. SSH 安全加固清单
- 8. 跳板机与多主机管理
- 9. 排错:连接、权限与 known_hosts
- 10. 速查表
- 延伸阅读
1. SSH 服务全景:远程管理与安全
SSH(Secure Shell)是加密的远程登录协议——一切连接内容加密,替代不安全的 telnet:
SSH 三层能力:
远程登录:ssh user@host(终端操作服务器)
文件传输:scp/rsync(加密传文件)
隧道转发:本地/远程端口转发(内网穿透)
| 组件 | 说明 |
|---|---|
| sshd(服务端) | 服务器上监听 22 端口的守护进程 |
| ssh(客户端) | 本机用来连服务器的命令 |
| 密钥对 | 私钥(本机)+ 公钥(服务器),免密认证 |
心智:SSH 是「加密的通道」,不只是登录——它能把 TCP 流量「装进隧道」穿过防火墙。隧道转发让「外网访问内网」成为可能,这是 SSH 最被低估的能力。
2. sshd:服务端配置
sshd 是服务器的 SSH 守护进程,配置在 /etc/ssh/sshd_config:
sudo vim /etc/ssh/sshd_config
# 常用配置项
Port 22 # 端口(换高位端口可降低扫描)
PermitRootLogin no # 禁 root 直接登录(用普通用户+su)
PasswordAuthentication yes # 允许密码登录(加固时改 no)
PubkeyAuthentication yes # 允许密钥登录(默认开)
MaxAuthTries 3 # 认证失败上限(防爆破)
AllowUsers alice bob # 白名单用户
ListenAddress 0.0.0.0 # 监听地址
# 改配置后校验语法 + 平滑重启
sudo sshd -t # 测试配置语法
sudo systemctl restart sshd
记忆:sshd 改配置必先
sshd -t校验再重启——配错了会把自己锁在门外。PermitRootLogin no是所有加固的第一条(用普通用户登录再 sudo)。
3. 密钥认证:从密码到免密
密钥认证 = 本机私钥 + 服务器公钥——验证靠「数学签名」而非密码:
# 1. 本机生成密钥对(生成一次即可)
ssh-keygen -t ed25519 -C "your@email" # 现代推荐 ed25519
# 生成 ~/.ssh/id_ed25519(私钥)+ id_ed25519.pub(公钥)
# 2. 把公钥装到服务器(一次命令搞定)
ssh-copy-id user@server
# 等价于手动:把本机 .pub 追加到服务器 ~/.ssh/authorized_keys
# 3. 免密登录
ssh user@server # 直接进,不再要密码
# 权限要正确(否则 SSH 拒绝用密钥)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519
记忆:免密的本质 = 「私钥在你这、公钥在服务器」的签名校验。装公钥用
ssh-copy-id;登录失败先查~/.ssh权限(600/700)与 authorized_keys 内容。
4. 本地转发:访问内网服务
本地转发 = 把远程服务器的某端口「拉回」本地——访问内网服务:
# 场景:服务器(外网可达)能访问内网的数据库 3306
# 本机想直接连这个内网数据库
ssh -L 3306:db.internal:3306 user@server
# 本地3306 →(隧道)→ 服务器 → 内网 db.internal:3306
# 之后本机连 localhost:3306 就等于连内网数据库
本地转发原理:
本机 localhost:3306
→ SSH 加密隧道 → 服务器
→ 服务器再访问 db.internal:3306
「借服务器的网络访问它够得着的东西」
# 多个端口 / 后台挂隧道
ssh -L 8080:web.internal:80 -L 3306:db.internal:3306 user@server
# -f 后台 + -N 不执行命令(纯隧道)
ssh -fN -L 3306:db.internal:3306 user@server
心法:本地转发解决「你够不着、服务器够得着」——内网服务没开公网,借一台外网可达的服务器当跳板把端口「拉出来」。
-fN让隧道后台常驻。
5. 远程转发与动态代理
远程转发(-R)反方向:把本机端口「推」到服务器——服务器侧访问本机:
# 场景:想让服务器访问「你本机」的服务(反向)
ssh -R 9000:localhost:8080 user@server
# 服务器 9000 → 隧道 → 本机 8080
# 服务器上访问 localhost:9000 即访问你本机 8080
# 动态代理(-D):本机当 SOCKS5 代理,浏览器走服务器网络
ssh -D 1080 user@server
# 浏览器设置 SOCKS5 localhost:1080 → 所有流量经服务器出口
# 用途:绕过地域限制、公网 IP 访问测试、安全上网
记忆:
-L拉回来、-R推出去、-D变代理。-D 1080让整个本机网络走服务器的出口 IP——是最实用的「IP 测试」与「安全通道」方案(配合-N纯隧道)。
6. scp 与 rsync:安全文件传输
scp/rsync 都是走 SSH 加密传输文件:
# scp:简单拷贝
scp file.txt user@server:/path/ # 本机 → 服务器
scp user@server:/path/file.txt . # 服务器 → 本机
scp -r dir user@server:/path/ # 递归拷目录
# rsync:增量同步(推荐,支持续传/排除/压缩)
rsync -avz --progress ./backup/ user@server:/backup/
# -a 归档 -v 详细 -z 压缩
rsync -avz --delete ./src/ user@server:/src/ # 镜像(多删少补)
rsync -avz --exclude '*.log' . user@server:/target/ # 排除
心法:拷少量文件用 scp,同步/备份用 rsync——rsync 只传差异、支持断点、可排除可镜像,是备份任务的标配(配合 /linux-backup-disaster-recovery/)。
7. SSH 安全加固清单
SSH 是服务器大门——加固是重中之重(配合 /linux-security-hardening/):
# 核心加固五条(/etc/ssh/sshd_config)
PermitRootLogin no # 1. 禁 root 直登
PasswordAuthentication no # 2. 禁密码(只密钥),前提密钥已装好
MaxAuthTries 3 # 3. 限尝试次数
Port 2222 # 4. 换端口(减少扫描噪音)
AllowUsers alice # 5. 白名单用户
# 防火墙只放行 SSH 来源
# nftables:只允许办公网段访问 22/2222
加固顺序(别跳):
先装好密钥 → 验证密钥能登录 → 再关密码认证
关闭顺序错 = 把自己锁在门外(务必留一个能连的会话)
| 攻击 | 防御 |
|---|---|
| 密码爆破 | 禁密码 + fail2ban |
| root 爆破 | 禁 root 直登 |
| 扫描噪音 | 换端口 + 限 IP |
| 私钥泄露 | 密钥加口令 + 定期轮换 |
铁律:关密码认证前必须先验证密钥能登录,且保持一个现有会话。SSH 加固最惨的翻车不是被黑,是把自己锁在门外。
8. 跳板机与多主机管理
跳板机(Jump Host)是访问内网服务器的唯一入口——安全审计集中:
外网 → 跳板机(唯一公网入口)→ 内网服务器群
├── 所有管理员先登跳板机
├── 再从跳板机登内网机器(或直接 ProxyJump)
└── 跳板机记录所有操作(审计)
# 客户端侧:ProxyJump 一键穿跳板
ssh -J jumpuser@jump.example.com target@192.168.1.50
# 本机 → 跳板机 → 内网目标机(一条命令)
# 或写在 ~/.ssh/config 里(推荐)
Host internal-*
ProxyJump jumpuser@jump.example.com
User target
Host db1
HostName 192.168.1.50
# 之后直接:ssh db1 就自动穿跳板
记忆:跳板机 = 内网唯一门户。现代用法是客户端
~/.ssh/config+ProxyJump,管理员无感穿跳板、审计集中、公网入口收敛到一个点(安全面最小化)。
9. 排错:连接、权限与 known_hosts
SSH 排错按「连接 → 认证 → 授权」三层查:
# 1. 连接层:端口通不通
ssh -v user@server # -v 详细输出,看卡在哪一步
nc -vz server 22 # 测端口连通
# 不通 → 防火墙(nftables)/服务没起(systemctl status sshd)
# 2. 认证层:密钥/密码
ls -l ~/.ssh/authorized_keys # 公钥在不在、权限 600
ssh -v user@server # 看 "Offering public key" / "Authentications that can continue"
# 3. 授权层:允许谁登录
grep AllowUsers /etc/ssh/sshd_config # 白名单是否挡住
journalctl -u sshd -n 20 # sshd 日志(认证失败原因)
# known_hosts 问题(服务器重装 IP 变了)
ssh-keygen -R server # 删除旧指纹
ssh-keyscan server >> ~/.ssh/known_hosts # 重新收录
| 现象 | 原因 | 解法 |
|---|---|---|
| Connection refused | 服务没起/端口不对 | systemctl status sshd |
| 一直要密码 | 密钥没装/权限错 | 重跑 ssh-copy-id |
| Host key mismatch | 服务器重装过 | ssh-keygen -R |
| Permission denied | 白名单/禁 root | 查 AllowUsers + 日志 |
记忆:SSH 排错看
-v输出 + journald 日志——-v告诉你客户端走到了哪,journalctl -u sshd告诉你服务器拒绝了谁。三连查:端口、密钥、白名单。
10. 速查表
| 需求 | 命令 |
|---|---|
| 远程登录 | ssh user@host |
| 免密登录 | ssh-keygen + ssh-copy-id |
| 本地转发 | ssh -L 本地:内网服务 |
| 远程转发 | ssh -R 服务器端口:本机 |
| 动态代理 | ssh -D 1080 |
| 后台隧道 | -fN(纯隧道常驻) |
| 文件拷贝 | scp -r file host:/path |
| 增量同步 | rsync -avz --progress |
| 穿跳板 | ssh -J jumpuser@jump host |
| 加固核心 | 禁 root + 禁密码 + 白名单 |
一句话记忆:连接靠 sshd(配置)+ 密钥(免密)、穿透靠 -L 拉/-R 推/-D 代理、安全靠「密钥先装好再关密码、禁 root、限来源」——SSH 是远程管理与内网穿透的瑞士军刀。
延伸阅读
- /linux-firewall-nftables/ — 放行与管理 SSH 端口
- /linux-security-hardening/ — 系统安全加固清单
- /linux-backup-disaster-recovery/ — rsync 备份实战
- /linux-user-permissions/ — 用户与 sudo 权限
- /linux-systemd-services/ — sshd 开机自启
- [[docker]] — 容器内 SSH 与网络
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。