只要你的 Linux 服务器暴露公网,SSH(默认 22 端口)从上线起就在被扫描、被爆破,普通云主机平均每天收到上千次暴力破解尝试。本文从「基础三板斧」讲到 fail2ban 自动封禁,给出可直接落地的加固方案。
一、为什么必须优先加固 SSH?
SSH 是服务器的「后门钥匙」,一旦被爆破成功,攻击者就能拿到系统级权限,随之而来的就是植入木马、勒索加密、被当肉鸡发起 DDoS。很多站长把精力都花在 WAF、CDN 上,却忽略了最基础的 SSH 入口。
先看服务器正承受多大压力,登录后执行:
# 统计 SSH 登录失败次数
grep "Failed password" /var/log/auth.log | wc -l
# 查看都是哪些 IP 在爆破
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | head -20
CentOS 系统把日志路径换成 /var/log/secure 即可。若输出里出现大量境外 IDC 段的连续失败记录,说明服务器已是「肉鸡猎场」的常客。
二、基础三板斧:改端口、禁 root、上密钥
先把 OpenSSH 自身配置到位,编辑 /etc/ssh/sshd_config,先备份:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)
vi /etc/ssh/sshd_config
关键参数改成如下:
# 1. 改用非标准端口(1024-65535 内选一个)
Port 51234
# 2. 禁止 root 远程登录,日常用普通用户 + sudo
PermitRootLogin no
# 3. 只认密钥登录(先确认密钥可登录再改)
PasswordAuthentication no
PubkeyAuthentication yes
# 4. 限制允许登录的用户
AllowUsers deploy
# 5. 收紧超时与尝试次数
LoginGraceTime 30
MaxAuthTries 3
生成并部署密钥对(本机执行):
ssh-keygen -t ed25519 -C "deploy@myserver"
ssh-copy-id -p 51234 deploy@你的服务器IP
改完务必用另一个终端窗口验证新端口和密钥可登录,再重启服务,避免被锁在门外:
sshd -t # 校验语法
systemctl restart sshd
三、fail2ban 部署与 jail 规则实战
基础加固后仍会有大量扫描流量打在新端口上。fail2ban 自动分析日志,短时间内多次失败即调用防火墙封禁来源 IP,是最省心的「自动保安」。
# Debian/Ubuntu
apt update && apt install -y fail2ban
# CentOS/Rocky
yum install -y epel-release && yum install -y fail2ban
systemctl enable --now fail2ban
新建 /etc/fail2ban/jail.local 覆盖默认配置:
[DEFAULT]
bantime = 3600 # 封禁时长(秒),1 小时
findtime = 600 # 统计窗口(秒)
maxretry = 3 # 窗口内失败 3 次即封禁
action = %(action_mwl)s
[sshd]
enabled = true
port = 51234 # 填你修改后的 SSH 端口
filter = sshd
logpath = /var/log/auth.log # CentOS 改为 /var/log/secure
maxretry = 3
bantime = 86400
生效与常用命令:
systemctl restart fail2ban
# 查看被封禁 IP 列表
fail2ban-client status sshd
# 手动解封 / 封禁某个 IP
fail2ban-client set sshd unbanip 1.2.3.4
fail2ban-client set sshd banip 9.9.9.9
四、联动云防护与日常巡检
fail2ban 基于日志事后封禁,且消耗本机资源。更稳的架构是「本地加固 + 云端前置清洗」:把流量收敛到速度网络这类云防护平台,在到达源站前就完成恶意 IP 识别与拦截。
宝塔用户可在「安全 → SSH 管理」关闭密码登录、限制登录 IP;命令行用户可在 Nginx 层给敏感路径加 basic auth:
# 生成账号密码文件
printf "admin:$(openssl passwd -apr1 '你的强密码')
" > /etc/nginx/.htpasswd
# Nginx 站点配置中保护敏感路径
location ^~ /wp-admin/ {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
另外建议每周巡检:last -i | head -20 查看登录会话、crontab -l 检查异常任务,并确认 fail2ban 正常运行。
总结
SSH 安全加固没有银弹,但「改端口 + 禁密码 + 上密钥 + fail2ban 自动封禁 + 云防护前置」这套组合拳,足以挡住 99% 的自动化爆破与扫描。记住一个原则:能不暴露的端口就不暴露,能不用的密码登录就不用。如果单台服务器扛不住持续大流量爆破,建议直接上速度网络云防护,把攻击拦在边缘。
