Linux SSH 服务与隧道:sshd 配置、密钥认证、端口转发与安全加固

深入 Linux SSH 服务与隧道:sshd 服务端配置(端口/密钥/认证方式)、密钥认证与免密登录、SSH 隧道本地转发/远程转发/动态代理(SOCKS5)、scp/rsync 安全传输、SSH 安全加固清单(禁 root/禁密码/限 IP)、跳板机与多主机管理,掌握远程管理与内网穿透的 SSH 全套实践。

引言

「服务器怎么安全地连进去」「内网服务怎么从外网访问」「不用密码怎么免密登录」——答案都是 SSH。本文把 SSH 讲透三层:连接(sshd 配置 + 密钥认证免密)、隧道(本地转发/远程转发/动态代理,内网穿透的核心)、安全(加固清单 + 跳板机管理),最后覆盖 scp/rsync 传输与排错。掌握 SSH 就从「远程工具」进阶为「网络基础设施」。

前置:/linux-network-commands/(网络连接)。SSH 基于 TCP 22 端口;防火墙放行见 /linux-firewall-nftables/。服务开机自启见 /linux-systemd-services/。


目录


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 与网络

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「linux」更多文章

  1. Linux 日志管理:rsyslog 集中收集、logrotate 轮转与日志分析
  2. Linux DNS 与 DHCP 服务:BIND/dnsmasq、zone 文件与解析排错
  3. Linux 定时任务:cron/at/anacron 与 systemd timer 全解析