SSH 安全:密钥登录、改端口与 Fail2ban(2026)

官网核实最后核验:2026-11-13 · 依据:OpenSSH 官方手册、Ubuntu 官方文档与 Fail2ban 上游配置

一句话结论:SSH 安全的本质是密钥登录加关闭密码登录,禁用 root 登录与 Fail2ban 是配合,改端口只减少扫描噪音;先验证密钥能登录,再关掉密码登录,顺序不能反。

核验信息:本文为官网核实,未实测。配置项与默认值来自 OpenSSH 官方手册,密钥算法建议来自 Ubuntu 官方文档,Fail2ban 默认参数来自上游 jail.conf,来源见研究笔记。本文只讲概念与方法,不写可执行脚本与逐条命令。总览见站内服务器安全基础文章。
本质:密钥登录 + 关闭密码 密码猜测失去可猜的目标 配合:禁用 root + Fail2ban 降噪:改端口不是安全本质
本质、配合、拦截、降噪,各做各的事。

密钥登录的原理:私钥留本地,公钥放服务器

密钥登录用一对密钥代替密码:私钥保存在自己的电脑上,公钥放在服务器上对应用户的 authorized_keys 文件里。登录时,客户端向服务器证明自己持有与公钥配对的私钥,服务器核对公钥是否在授权列表里。私钥从不上传到服务器,也不发给任何人;公钥即使公开,也推导不出私钥。密码是可被反复猜测的秘密,密钥是持有私钥文件的证明,验证方式变了,密码猜测也就失去了可猜的目标。

算法选择上,Ubuntu 官方文档推荐 ed25519,理由是密钥更短、计算需求更低;备选是 RSA,密钥长度 4096 位。生成密钥的工具是 ssh-keygen,把公钥装到服务器的便利工具是 ssh-copy-id;生成时可以给私钥设一个口令,多一道口令关。authorized_keys 文件的权限有要求:只有被认证的用户本人可以写,权限不对时密钥登录会被拒绝。

关闭密码登录:先验证密钥,再改配置

服务器端的 SSH 配置文件是 /etc/ssh/sshd_config,控制密码登录的选项是 PasswordAuthentication,OpenSSH 官方手册给出的默认值是 yes,也就是默认允许密码登录。改成 no 之后,密码登录被关闭。控制密钥登录的选项是 PubkeyAuthentication,默认值是 yes,改配置时要确认它没有被改成 no。键盘交互认证由 KbdInteractiveAuthentication 单独控制,与 PasswordAuthentication 是两个选项;服务器是否依赖它做多因素认证,决定了它是否一并关闭。

还有一个容易漏的点:OpenSSH 对多数配置项取第一个读到的值,而 Ubuntu 的主配置文件顶部包含 sshd_config.d 目录下的片段文件,云厂商镜像可能已在该目录预置配置;只改主文件末尾的一行,可能被片段文件里的值盖过。改完之后,用 sshd -t 检查语法、用 sshd -T 查看实际生效值,确认无误再重启 SSH 服务。顺序是全部要点:先在新会话里验证密钥登录能用,再关闭密码登录,全程保持原会话不断开。首次部署流程见站内Vultr 建站全流程文章。

禁用 root 登录:分清两个档位

控制 root 登录的选项是 PermitRootLogin,OpenSSH 官方手册给出的默认值是 prohibit-password,四个取值是 yes、prohibit-password、forced-commands-only、no。默认值的意思是:root 可以用密钥登录,但密码与键盘交互认证对 root 无效。设为 no 则是 root 完全不能通过 SSH 登录,比默认值更严。日常用非 root 用户加 sudo 提权,root 直接登录就没有保留的必要;仍需 root 密钥登录做特定用途时,保留默认值。顺序与上一节相同:先建好有 sudo 权限的非 root 用户并验证密钥登录,再禁用 root 登录。

改端口:只减少扫描噪音,不是安全本质

控制监听端口的选项是 Port,OpenSSH 官方手册给出的默认值是 22。把 SSH 换到非默认端口之后,针对 22 端口的批量扫描与密码猜测尝试会大幅减少,日志清净很多。但这只是减少扫描噪音,不是安全本质:端口扫描可以发现实际监听的端口,知道端口的人面对的认证方式与原来完全相同。没有密钥登录打底,改端口挡不住有针对性的尝试。

改端口的代价是处处要同步:防火墙要放行新端口,客户端连接时要指定新端口,Fail2ban 的 jail 要按新端口封禁,服务商的防火墙组也要跟着改,漏改一处就是连不上。过渡期间可以利用 Port 允许多个取值的特点,让新旧两个端口同时监听,确认无误之后再去掉旧端口。

Fail2ban:读日志、计数、封禁

Fail2ban 的工作原理分三步:读认证日志,识别登录失败的记录,按来源地址计数,达到阈值后通过防火墙动作封禁该来源一段时间。针对 SSH 的 jail 名为 sshd,封禁是临时的,到期自动解除。三个默认参数来自 Fail2ban 上游仓库的 jail.conf,2026-11-13 核实:bantime(封禁时长)10 分钟,findtime(统计窗口)10 分钟,maxretry(失败次数)5 次。意思是:同一来源在 10 分钟内累计 5 次失败,就被封禁 10 分钟。发行版可能改动默认值,以本机 jail.conf 为准;上游默认所有 jail 都是关闭的,需在覆盖配置里启用 sshd jail。

配置文件的规则是:不要直接改 jail.conf,升级时它可能被覆盖;自定义配置写在 jail.local 或 jail.d 目录下的覆盖文件里。封禁动作由 banaction 决定,要与本机实际使用的防火墙配合。日志来源随发行版而异:较新的系统可能不再写传统的认证日志文件,启用后要确认 jail 真的在监视日志,而不是只确认服务在运行。Fail2ban 是事后拦截,封禁之前攻击者已经完成了几次失败尝试;面对换地址的分布式尝试,单个地址的计数很难达到阈值。密钥登录关闭密码登录之后,Fail2ban 的作用主要是减少无效流量与日志噪音。把自己的常用地址加入忽略名单,可以避免自己输错几次就被封在门外。

防火墙配合:两层都要对上端口

防火墙分两层:服务商的防火墙组在实例之外过滤流量,机内防火墙(如 Ubuntu 的 UFW)在实例之内过滤流量。两层都要放行 SSH 端口,缺一层就连不上;改了 SSH 端口,两层都要跟着改。机内防火墙的基线是默认拒绝入站、默认允许出站,只放行需要的端口;启用之前必须先放行 SSH 端口。UFW 的 limit 规则可以对 SSH 做速率限制,作为补充;它不读日志,替代不了 Fail2ban。容器工具可能直接改动底层防火墙规则,用容器的服务器要按容器工具的官方文档单独核对。

检查项确认内容
密钥可用新会话用密钥登录成功,私钥有口令且未上传
密码已关PasswordAuthentication 生效值为 no
root 已限PermitRootLogin 生效值符合预期,可 sudo 提权
端口同步SSH 端口、两层防火墙、客户端、Fail2ban 四处一致
防护运行sshd jail 已启用且在监视日志,封禁动作与防火墙配合

局限

本文未实测。做法以 Ubuntu 与 2026 年 11 月的官方文档口径为准,其他发行版的默认值、日志位置与防火墙后端可能不同,以本机配置文件为准。UFW 速率限制的具体阈值本次未核实到官方文档原文,本文只定性写。

链式阅读 · 安全:2FA 丢失恢复:备用码、恢复流程与事前准备(2026) · 备份与快照:VPS 数据保护的三种做法(2026) · 多账号管理:身份隔离、浏览器配置与风险(2026) · 密码管理与二步验证:账号安全的地基怎么打(2026) · 服务器安全基础:新 VPS 到手先做这 6 件事(2026)
更新日志:
2026-11-13:首发

相关:VPS 与网络 · 服务器安全基础 · Vultr 建站全流程 · 备份与快照 · 方法论