公网服务器上,SSH 的 22 端口几乎是”永远有人在敲门”。安全机构的统计数据显示,一台暴露在公网上的 Linux 服务器,平均每天会收到数百次密码爆破尝试,高峰期甚至每分钟几十次。很多站长抱着”密码设复杂点就没事”的侥幸心理,直到某天登录服务器,发现 CPU 占用 100%,top 里跑着一个陌生的进程——服务器已经被植入挖矿木马,成了别人的”肉鸡”。
SSH 暴力破解是服务器沦陷的第一入口,但它也是最容易防住的攻击之一。本文以 CentOS/Ubuntu 双环境为例,从日志分析、自动封禁、登录方式改造三个层面,给出可直接落地的加固方案,全程命令可复制。
一、先看清你的服务器正在被怎么”敲门”
动手加固之前,先确认威胁真实存在。暴力破解的痕迹全部留在登录日志里,查看命令如下:
# CentOS/RHEL 系列
grep "Failed password" /var/log/secure | wc -l
# Ubuntu/Debian 系列
grep "Failed password" /var/log/auth.log | wc -l
如果统计结果在几千甚至上万,说明你的服务器正在被脚本化轮询爆破。再按 IP 排序,看谁是”主力爆破手”:
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
同时快速自查是否已经被攻破:检查有无异常登录成功的记录、查看 /etc/passwd 中 UID 为 0 的账户、检查 crontab 和系统服务里有没有陌生定时任务。若已被入侵,先断网隔离、清除后门再谈加固,否则封禁再严也是给黑客打工。
二、fail2ban:让服务器学会”拉黑”爆破 IP
手工封 IP 治标不治本,fail2ban 能自动读取登录日志,对达到阈值的 IP 进行封禁,是防爆破的标配工具。
安装与配置:
# CentOS/RHEL
yum install -y epel-release && yum install -y fail2ban
# Ubuntu/Debian
apt update && apt install -y fail2ban
# 宝塔面板用户:软件商店搜索 fail2ban 一键安装,同样支持可视化配置
创建 SSH 防护规则(不建议直接改主配置文件,用 local 覆盖文件更利于升级):
vi /etc/fail2ban/jail.local
写入以下内容:
[DEFAULT]
bantime = 86400 # 封禁时间:1 天
findtime = 600 # 统计窗口:10 分钟
maxretry = 5 # 10 分钟内失败 5 次即封禁
ignoreip = 127.0.0.1/8 你的固定办公IP # 千万别把公司 IP 也封了
[sshd]
enabled = true
port = ssh
logpath = %(sshd_backend)s
action = iptables-multiport
启动并验证:
systemctl enable --now fail2ban
systemctl status fail2ban
# 查看封禁列表
fail2ban-client status sshd
# 手动解除误封(某 IP 被误封时)
fail2ban-client set sshd unbanip 1.2.3.4
进阶玩法:把 bantime 改成阶梯式递增(第一次 10 分钟、第二次 1 小时、第三次永久),配合 recidive 监狱,能让爆破脚本的扫描成本无限放大。生产环境建议把 maxretry 设为 3~5,bantime 不低于 1 小时。
三、密钥登录:从根上断掉”猜密码”这条路
fail2ban 只是把攻击者挡在门外,只要密码认证还开着,爆破就不会停。彻底方案是改用密钥登录并禁用密码认证——没有密码可猜,爆破自然失去意义。
第一步:本机生成密钥对(Mac/Linux 终端或 Windows PowerShell 均可):
ssh-keygen -t ed25519 -C "你的备注"
一路回车即可,私钥(~/.ssh/id_ed25519)务必保管好,建议再加个 passphrase 保护。
第二步:把公钥推送到服务器:
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@你的服务器IP
第三步:确认密钥能登录后,再关闭密码认证:
vi /etc/ssh/sshd_config
# 修改或追加以下三项
PasswordAuthentication no # 禁用密码登录
PubkeyAuthentication yes # 启用密钥登录
PermitRootLogin prohibit-password # 禁止 root 用密码登录,允许密钥
# 检查配置无误后重启 SSH 服务(CentOS 8+/Ubuntu 18.04+ 用 sshd 或 ssh)
systemctl restart sshd
# 或
service sshd restart
重要:改完先不要关当前终端!另开一个窗口用密钥方式重新登录验证,确认能进再继续,防止配置错误把自己锁在门外。若密钥登录失败,立即把 PasswordAuthentication 改回 yes 恢复。
四、终极加固清单:剩下的都在这
把上面三步做完,服务器被爆破攻破的概率已经下降 99%。想做到万无一失,再补上这几项:
# 1. 修改 SSH 端口,避开默认 22 端口扫描
vi /etc/ssh/sshd_config
Port 22222 # 改成高位随机端口,记得同步放行防火墙
# 2. 防火墙仅放行必要端口(以 firewalld 为例)
firewall-cmd --permanent --add-port=22222/tcp --remove-service=ssh
firewall-cmd --reload
# 3. 使用密钥登录后,可选关闭 SSH 空密码账户
vi /etc/ssh/sshd_config
PermitEmptyPasswords no
另外两个容易被忽略的点:一是给服务器做异地备份,被勒索病毒加密时能快速恢复;二是对接云防护产品,把 SSH 高危端口仅对办公 IP 开放,从网络层彻底隐藏爆破面。
总结
SSH 爆破防护的优先级很清晰:密钥登录是治本(密码认证一关,爆破再无意义),fail2ban 是治标(即便有漏网之鱼也能快速封禁),改端口 + 防火墙限制是减负(让攻击者根本找不到入口)。建议按”先自查日志 → 部署 fail2ban → 切换密钥登录 → 关闭密码认证”的顺序操作,每一步都有验证手段,不会把自己锁在门外。
如果觉得逐台服务器手工加固太费事,或想进一步接入 WAF、高防等云端联动防护,欢迎联系速度网络,我们提供服务器安全评估与加固代维服务,帮你把每一台机器的暴露面都收干净。
