SSH 端口一直被暴力破解怎么办:fail2ban 与密钥登录加固步骤 核心要点图解,SSH 被爆破先看日志确认来源与频率,再上 fail2ban 自动封禁。;密钥登录可用后再禁用密码认证,避免把自己锁在门外。;sshd 加固核心是禁 root 直登、降尝试次数、限用户与来源。;加固后必须新开终端验证登录,再关闭旧会话。
SSH 端口一直被暴力破解怎么办:fail2ban 与密钥登录加固步骤 · 核心要点一图读懂(AegisX)

核心要点(TL;DR)

  • SSH 被爆破先看日志确认来源与频率,再上 fail2ban 自动封禁。
  • 密钥登录可用后再禁用密码认证,避免把自己锁在门外。
  • sshd 加固核心是禁 root 直登、降尝试次数、限用户与来源。
  • 加固后必须新开终端验证登录,再关闭旧会话。

先别急着改配置:确认爆破的真实规模

SSH 端口被暴力破解几乎是所有公网服务器的日常。真正要做的不是慌,而是先量化:谁在打、打多频繁、有没有已经成功的痕迹。先看失败记录:

sudo grep "Failed password" /var/log/auth.log | tail -n 20
# CentOS/RHEL 系为 /var/log/secure
sudo grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head

再确认是否存在成功登录的异常来源:

sudo grep "Accepted" /var/log/auth.log | tail -n 20
lastb | head -n 20

如果失败量每天上万、来源 IP 分散,说明已被自动化字典扫描;若出现陌生 IP 的 Accepted 记录,要按入侵事件处理,先隔离再加固。

第一步:用 fail2ban 自动封禁爆破源

fail2ban 读取认证日志,按规则触发防火墙封禁,是止血最快的手段。安装并启用 sshd jail:

sudo apt install fail2ban -y        # Debian/Ubuntu
sudo yum install fail2ban -y        # CentOS/RHEL
sudo systemctl enable --now fail2ban

不要直接改 jail.conf,新建覆盖文件 /etc/fail2ban/jail.local:

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 你的办公IP

[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
backend = auto

重载并验证:

sudo fail2ban-client reload
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd banip 1.2.3.4   # 手动封禁测试

如果 status 显示日志文件读取失败,多半是 logpath 与系统实际路径不符,或 sshd 走了 journald,此时把 backend 改为 systemd 并确认日志源。

第二步:改造为 SSH 密钥登录

fail2ban 只是拦截,密钥认证才是根治。本地生成密钥并上传:

ssh-keygen -t ed25519 -C "ops@example"
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server

服务器端确认权限,权限过松会导致密钥被拒:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R $USER:$USER ~/.ssh

关键顺序:先新开一个终端用密钥登录成功,再改 sshd 配置。编辑 /etc/ssh/sshd_config:

PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no
MaxAuthTries 3
LoginGraceTime 30
AllowUsers deploy ops
ClientAliveInterval 300

校验并重载,切勿直接 restart 掉线:

sudo sshd -t
sudo systemctl reload sshd

保留当前会话不关,另开终端验证密钥登录与密码登录均符合预期后再退出。

第三步:收紧暴露面与来源限制

在云安全组或本机防火墙上只放行必要来源,能直接砍掉大部分扫描流量。以 ufw 为例:

sudo ufw allow from 203.0.113.0/24 to any port 22 proto tcp
sudo ufw enable

若使用非标准端口,记得同步 fail2ban 的 port 与防火墙规则。对必须保留密码登录的过渡期,可叠加 AllowUsers 与来源白名单,把攻击面压到最小。需要集中管理多台机器时,可考虑 AegisX 的主机安全基线核查与登录审计能力,把配置漂移和异常登录统一纳入监控。

上线检查清单与验证方法

检查项期望结果
fail2ban 状态sshd jail 为 enabled,封禁计数增长
密钥登录新终端可免密登录
密码登录被拒绝,提示 publickey
root 直登被拒绝
日志异常无陌生 Accepted 记录

验证命令:ssh -o PreferredAuthentications=password user@server 应失败;sudo fail2ban-client status sshd 应看到 Banned IP list。最后把 fail2ban 与 sshd 配置纳入版本管理,定期复查 lastb 与封禁趋势。

行动建议

今天就做三件事:先用日志确认爆破规模与是否有成功入侵;再上 fail2ban 止血并调大 bantime;最后完成密钥登录改造并禁用密码认证。加固不是一次性动作,建议每月复查一次 sshd 配置与登录审计,把最小权限和来源限制固化为基线。

常见问题(FAQ)

fail2ban 装了但 IP 还是被爆破,怎么回事?

多数是日志路径或后端不匹配导致 fail2ban 没读到记录。先执行 fail2ban-client status sshd 看当前封禁数与日志文件,确认 jail 里 logpath 与系统实际日志一致(如 /var/log/auth.log 或 /var/log/secure),再检查 sshd 是否用了非标准端口或 systemd 日志。改完执行 fail2ban-client reload 并观察封禁计数是否增长。

禁用密码登录后会不会把自己锁死?

只要先验证密钥能登录再禁用就不会。正确顺序是:上传公钥到 ~/.ssh/authorized_keys、设 600 权限、新开一个终端用密钥登录成功,然后才在 sshd_config 设 PasswordAuthentication no 并 reload。保留当前已登录会话不要关,验证失败可立即改回配置恢复。

SSH 换成非标准端口有用吗?

有用但只是降噪,不是安全边界。改端口能过滤大部分自动化扫描,显著减少日志噪音和爆破量,但针对性扫描仍能找到。建议与密钥登录、fail2ban 一起用,且改端口后记得同步防火墙规则与 fail2ban 的 port 配置,否则封禁规则可能不生效。

fail2ban 封禁的 IP 多久解封,能永久封吗?

默认 bantime 为 10 分钟,可按需调大。在 jail.local 中设 bantime = 1d 或 -1(永久),配合 findtime 与 maxretry 控制触发条件。永久封禁需注意误封风险,建议先设较长时限并开启 ignoreip 白名单,把自己的办公 IP 加入,避免运维入口被误封。

云服务器安全组和 fail2ban 需要都配吗?

建议都配,职责不同。安全组是网络层第一道门,可只放行必要来源与端口;fail2ban 在主机层根据日志动态封禁,能应对已放行端口上的爆破。两者叠加可减少主机负载与日志噪音,但安全组规则变更频繁时注意别把管理入口关掉。