真正有效的 ssh 防护是分层控制:先收敛入口(改端口、限 ip、禁 root)、再加固认证(禁密码、用密钥)、最后自动响应(fail2ban 封禁)并持续监控审计。

Linux 服务器暴露在公网时,SSH 端口常成为暴力破解的首要目标。真正有效的防护不是堆砌工具,而是分层控制:先收敛入口、再加固认证、最后自动响应。以下方案基于生产环境验证,兼顾安全性与可维护性。
收敛访问入口
减少攻击面是最直接有效的第一步,重点是让自动化扫描器“看不见”你的服务。
- 修改默认 SSH 端口至高位端口(如 22222 或 35678),避开 1024–10000 区间常见扫描范围;修改后需同步更新防火墙规则(如 firewalld 或 iptables)并开放新端口
- 限制可登录的 IP 段,通过云平台安全组或本地防火墙仅放行管理员常用出口 IP;若 IP 不固定,至少设置白名单网段(如公司办公区 C 类地址)
- 禁用 root 远程登录,避免攻击者直击最高权限账户;启用 PermitRootLogin no 并配合 AllowUsers 明确指定合法登录账户(如AllowUsers deploy admin)
强化身份认证
密码是暴力破解的突破口,必须消除其存在价值。
- 关闭密码认证:PasswordAuthentication no、ChallengeResponseAuthentication no,只保留PubkeyAuthentication yes
- 为每个管理员生成独立密钥对(ed25519 优先),私钥本地加密保存,公钥严格部署到对应用户 ~/.ssh/authorized_keys 中
- 禁用空密码账户,检查 /etc/shadow 中无 :: 字段(表示空密码),并确保所有远程账户密码字段非空
部署自动响应机制
即使做了前两步,仍可能遭遇定向攻击,需具备实时封禁能力。
- 安装 fail2ban,配置/etc/fail2ban/jail.local:设置maxretry = 3、findtime = 600(10 分钟内失败 3 次即封)、bantime = 86400(封 24 小时)
- 日志路径按系统区分:CentOS/RHEL 用/var/log/secure,Ubuntu/Debian 用/var/log/auth.log
- 添加可信 IP 白名单(ignoreip),避免误封;启用邮件通知(如sendmail-whois)便于及时感知攻击事件
持续监控与审计
防护不是一次配置就结束,需要建立常态化检查习惯。
- 每日执行 lastb -n 20 查看最近 20 条失败登录,识别新增可疑 IP;用 last -n 10 核对成功登录是否均为已知来源
- 每周检查特权账户:awk -F: ‘$3 == 0 {print $1}’ /etc/passwd,确认仅有 root 且无新增 UID= 0 账户
- 定期审查 ~/.ssh/authorized_keys 内容,删除长期未用或来源不明的公钥;检查定时任务和启动项有无异常指令






























