上一篇 下一篇 分享链接 返回 返回顶部

SSH被暴力破解怎么办?别只改端口,这几步才是真正止损

发布人:Minchunlin 发布时间:2026-05-02 09:38 阅读量:502

一、SSH 被暴力破解,不等于服务器已经被入侵

很多用户看到服务器日志里出现大量:

Failed password for root from x.x.x.x port xxxxx ssh2
Invalid user admin from x.x.x.x
authentication failure

第一反应是:服务器是不是被黑了?

实际上,SSH 被扫、被暴力尝试,在公网服务器上非常常见。尤其是香港服务器、美国服务器、日本服务器这类海外物理服务器,只要公网 IP 暴露,22 端口开放,几乎都会被全球扫描器反复尝试登录。

真正要判断的不是“有没有人尝试登录”,而是:

  1. 有没有成功登录记录?
  2. 有没有异常用户被创建?
  3. 有没有异常进程、计划任务、后门文件?
  4. SSH 是否还在使用弱密码、root 直登、默认端口?
  5. 业务服务器和管理入口是否混在一起暴露?

所以,处理 SSH 暴力破解不能只做一件事,比如“改端口”。正确做法应该是:先确认有没有被打进去,再分层加固 SSH 登录入口。

二、适用服务器配置:不同业务场景下,SSH 安全策略也不一样

以我们常见的香港物理服务器业务为例,SSH 被暴力破解的问题,不只发生在低配服务器上,高性能服务器同样会遇到。

业务类型 推荐服务器配置 常见用途 SSH 风险点
普通企业官网 / WordPress Intel Xeon E3-1271 v3 / 16GB 内存 / 1TB HDD / 100M BGP 含 25M CN2 企业站、博客、展示站 默认 22 端口、root 密码登录
外贸独立站 / 跨境电商 Intel Xeon Gold 6138 / 32GB 内存 / 960GB NVMe SSD / 100M BGP 含 25M CN2 WooCommerce、Shopify 独立站后端、ERP 接口 运维人员多,密码泄露风险高
高并发 Web / API 服务 AMD EPYC 4585PX / 64GB 内存 / 960GB NVMe SSD / 100M BGP + CN2 优化 API、支付回调、会员系统、后台管理 SSH 暴露公网,攻击频率高
游戏 / 视频 / 高带宽业务 AMD EPYC 7402P / 64GB 内存 / NVMe SSD / 1G 国际带宽 游戏服、视频站、下载站 大带宽 IP 更容易被扫描和撞库

很多人以为“服务器性能越高,安全性越强”,其实不是。
SSH 暴力破解主要攻击的是登录入口,不是 CPU 性能。哪怕你用的是 64 核服务器,只要 SSH 密码弱、root 可以直接登录、22 端口裸露公网,一样会被扫。

三、第一步:先判断是否已经被成功登录

1. Ubuntu 22.04 查看 SSH 登录日志

grep "Failed password" /var/log/auth.log | tail -50
grep "Accepted password" /var/log/auth.log
grep "Accepted publickey" /var/log/auth.log

如果只看到大量 Failed password,说明只是有人尝试登录。

如果看到:

Accepted password for root from x.x.x.x

就要高度警惕,尤其是这个 IP 不是你自己的办公 IP。

2. CentOS 7 查看 SSH 登录日志

grep "Failed password" /var/log/secure | tail -50
grep "Accepted password" /var/log/secure
grep "Accepted publickey" /var/log/secure

CentOS 7 常见日志路径是:

/var/log/secure

Ubuntu / Debian 常见日志路径是:

/var/log/auth.log

3. 查看最近登录用户

last -a

查看失败登录记录:

lastb -a | head -50

如果 lastb 很多,不一定代表被入侵,只代表失败尝试很多。

但如果 last 里面出现陌生 IP 成功登录,就要继续排查。

四、第二步:快速止血,不要一上来就重装系统

如果发现 SSH 正在被大量暴力破解,建议先做临时止血。

1. 立即修改 root 密码

密码不要使用:

admin123
root123
password
公司名+年份
域名+123
手机号后几位

建议密码长度至少 16 位以上,包含大小写、数字、特殊符号。

例如:

S7@kLm9#Qz28_xP!

但要注意:强密码只是底线,不是最终方案。


2. 临时修改 SSH 端口

编辑配置文件:

vim /etc/ssh/sshd_config

找到:

#Port 22

修改为:

Port 20222

然后重启 SSH:

Ubuntu / Debian:

systemctl restart ssh

CentOS 7:

systemctl restart sshd

查看是否监听成功:

ss -lntp | grep ssh

注意:修改端口不是绝对安全,只是可以减少大量低级扫描流量。真正安全还是要结合密钥登录、禁用 root、白名单、防火墙和 Fail2ban。

3. 不要立刻关闭当前 SSH 窗口

这是很多新手容易踩的坑。

修改 SSH 端口、防火墙、密钥登录后,不要马上退出当前连接
先新开一个 SSH 窗口测试新端口能否登录:

ssh -p 20222 user@服务器IP

确认可以登录后,再关闭原来的窗口。

否则一旦配置写错,可能把自己锁在服务器外面。

五、第三步:关闭 root 直接登录

暴力破解最常攻击的用户名就是:

root
admin
test
user
ubuntu
mysql
oracle

其中 root 是最危险的,因为 root 一旦被猜中密码,攻击者直接拥有最高权限。

1. 创建普通运维用户

adduser ops

给用户设置密码:

passwd ops

加入 sudo 权限。

Ubuntu:

usermod -aG sudo ops

CentOS 7:

usermod -aG wheel ops

2. 禁止 root 远程登录

编辑:

vim /etc/ssh/sshd_config

修改为:

PermitRootLogin no

重启 SSH:

systemctl restart sshd

Ubuntu 某些系统服务名是:

systemctl restart ssh
 

六、第四步:关闭密码登录,改用 SSH 密钥登录

这是 SSH 加固里最关键的一步。

只要还允许密码登录,攻击者就可以不断尝试。
改成密钥登录后,攻击者即使知道用户名,也很难靠暴力破解登录进去。

1. 在本地电脑生成密钥

Linux / macOS / Windows PowerShell 都可以:

ssh-keygen -t ed25519 -C "ops-server"

生成后一般会有:

~/.ssh/id_ed25519
~/.ssh/id_ed25519.pub

其中:

id_ed25519

是私钥,不能泄露。

id_ed25519.pub

是公钥,可以放到服务器。

2. 把公钥写入服务器

在服务器上执行:

mkdir -p /home/ops/.ssh
vim /home/ops/.ssh/authorized_keys

把本地的公钥内容粘贴进去。

设置权限:

chown -R ops:ops /home/ops/.ssh
chmod 700 /home/ops/.ssh
chmod 600 /home/ops/.ssh/authorized_keys
 

3. 修改 SSH 配置

编辑:

vim /etc/ssh/sshd_config

建议配置如下:

Port 20222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
MaxAuthTries 3
LoginGraceTime 30
AllowUsers ops

配置说明:

参数 作用
Port 20222 避开默认 22 端口扫描
PermitRootLogin no 禁止 root 直接登录
PasswordAuthentication no 禁止密码登录
PubkeyAuthentication yes 启用密钥登录
PermitEmptyPasswords no 禁止空密码
MaxAuthTries 3 限制单次连接尝试次数
LoginGraceTime 30 缩短认证等待时间
AllowUsers ops 只允许指定用户登录

修改后先检查配置是否有语法错误:

sshd -t

没有输出一般表示配置正常。

然后重启:

systemctl restart sshd
 

七、第五步:用防火墙限制 SSH 来源 IP

如果服务器是公司内部运维,SSH 没必要对全网开放。

例如你的办公出口 IP 是:

1.2.3.4

SSH 端口是:

20222

Ubuntu 使用 UFW

ufw allow from 1.2.3.4 to any port 20222 proto tcp
ufw deny 20222/tcp
ufw enable
ufw status

这表示只有 1.2.3.4 可以访问 SSH,其他 IP 都不能连接。

CentOS 7 使用 firewalld

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4" port protocol="tcp" port="20222" accept'
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload
firewall-cmd --list-all

如果你的办公 IP 经常变化,可以使用:

  1. VPN 后再登录 SSH;
  2. 跳板机登录;
  3. IDC 控制台临时开白名单;
  4. 使用动态 DNS 配合脚本更新防火墙规则。

对于正式生产服务器,最理想的方式是:
SSH 不直接暴露公网,只允许固定管理网络访问。

八、第六步:安装 Fail2ban 自动封禁暴力破解 IP

Fail2ban 的作用是:
当某个 IP 连续登录失败多次,就自动把它加入防火墙封禁列表。

Ubuntu 安装

apt update
apt install fail2ban -y

CentOS 7 安装

yum install epel-release -y
yum install fail2ban -y

创建 SSH 防护规则

vim /etc/fail2ban/jail.local

写入:

[sshd]
enabled = true
port = 20222
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
findtime = 600
bantime = 3600

CentOS 7 把日志路径改成:

logpath = /var/log/secure

启动:

systemctl enable fail2ban
systemctl restart fail2ban

查看状态:

fail2ban-client status
fail2ban-client status sshd

常见参数解释:

参数 含义
maxretry = 5 10 分钟内失败 5 次就封禁
findtime = 600 统计窗口为 600 秒
bantime = 3600 封禁 3600 秒
port = 20222 监控新的 SSH 端口

Fail2ban 适合大部分服务器,但它不是替代密钥登录的方案。
正确顺序应该是:密钥登录优先,Fail2ban 辅助。

九、第七步:检查是否已经留下后门

如果日志里发现陌生 IP 成功登录过,就不能只改密码了,还要排查系统是否被动过。

1. 检查系统用户

cat /etc/passwd

重点看有没有陌生用户,例如:

test
admin
backup
mysql1
systemd-update

查看具有 sudo 权限的用户:

grep -E "sudo|wheel" /etc/group
 

2. 检查 SSH 公钥

cat /root/.ssh/authorized_keys
cat /home/ops/.ssh/authorized_keys

如果里面出现你不认识的公钥,要立即备份后删除。

3. 检查计划任务

crontab -l
ls -al /var/spool/cron/
ls -al /etc/cron.d/
ls -al /etc/cron.hourly/

攻击者常用计划任务做持久化,比如定时下载脚本、反弹连接、启动挖矿程序。

4. 检查异常进程和端口

ps aux --sort=-%cpu | head -20
ps aux --sort=-%mem | head -20
ss -lntup

重点关注:

  1. CPU 长期跑满的陌生进程;
  2. 监听奇怪端口的程序;
  3. 路径位于 /tmp/dev/shm/var/tmp 的可执行文件;
  4. 伪装成系统服务的进程名。

5. 检查最近修改文件

find /etc -mtime -3 -type f
find /root -mtime -3 -type f
find /tmp -mtime -3 -type f
find /var/tmp -mtime -3 -type f

如果服务器是生产环境,不建议直接乱删。
先备份证据,再判断是否需要隔离、迁移业务或重装系统。

十、比较完整的 SSH 安全配置模板

下面是一份比较适合生产服务器的 sshd_config 配置思路:

Port 20222
Protocol 2

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no

MaxAuthTries 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2

X11Forwarding no
AllowTcpForwarding no

AllowUsers ops

注意:
AllowTcpForwarding no 可能会影响某些通过 SSH 隧道工作的业务,如果你确实需要端口转发,不要盲目关闭。

修改配置前,建议先备份:

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)
 

十一、不同业务场景下,我建议这样设计 SSH 管理入口

1. 普通企业网站

适合配置:

普通用户 + SSH 密钥 + 禁止 root + Fail2ban + 非 22 端口

这类网站通常运维频率不高,安全目标是减少被扫和弱密码风险。

2. 外贸独立站 / 电商网站

适合配置:

SSH 密钥 + 固定办公 IP 白名单 + 运维用户分权 + 操作日志留存

电商网站涉及订单、客户、支付回调和后台数据,不能只靠一个 root 用户管理。

建议至少分成:

ops    运维用户
deploy 发布用户
backup 备份用户

不要所有人共用 root。

3. 游戏服务器 / 高并发业务

适合配置:

跳板机 + 内网管理 + 公网服务器关闭 SSH 暴露

游戏服、API 服务、下载站这类服务器经常暴露在公网,高带宽 IP 更容易被扫描。
如果条件允许,建议 SSH 只开放在内网或管理网,不直接挂公网。

4. 多台香港服务器集群

适合配置:

堡垒机 + 统一密钥管理 + 登录审计 + 最小权限

例如:

堡垒机:只允许公司 IP 登录
Web 服务器:只允许堡垒机 SSH
数据库服务器:只允许内网 SSH
备份服务器:只允许备份节点访问

这样即使一台 Web 服务器被扫,攻击面也不会扩散到整个集群。

十二、很多人会犯的几个错误

错误一:只改 SSH 端口

改端口能减少扫描日志,但不能解决弱密码问题。
真正关键的是关闭密码登录。

错误二:继续使用 root 登录

root 是攻击者默认撞库目标。
生产服务器应该使用普通用户登录,再通过 sudo 提权。

错误三:密码很复杂,但多人共用

多人共用一个 root 密码,最大问题不是密码强度,而是无法追踪责任。
谁登录过、谁改过配置、谁执行过危险命令,后面都很难查。

错误四:防火墙规则没测试就断开 SSH

很多服务器不是被攻击者锁死的,而是被管理员自己锁死的。
改 SSH、防火墙、密钥配置时,一定要保留当前会话,另开窗口测试。

错误五:发现成功登录后,只改密码继续用

如果已经有陌生 IP 成功登录,攻击者可能已经写入公钥、计划任务、后门程序。
这种情况下只改密码是不够的,必须做完整排查。严重时建议迁移业务数据后重装系统。

十三、一套实用的处理流程

当客户反馈“SSH 被暴力破解怎么办”时,我一般按这个顺序处理:

第一步:查看 auth.log / secure,确认是否有成功登录
第二步:确认当前在线用户和最近登录 IP
第三步:修改 SSH 端口,保留当前连接
第四步:创建普通运维用户
第五步:禁用 root 远程登录
第六步:启用 SSH 密钥登录
第七步:关闭密码登录
第八步:配置防火墙白名单
第九步:安装 Fail2ban
第十步:检查用户、公钥、计划任务、进程、端口
第十一步:根据业务重要性决定是否重装系统

这套流程看起来步骤多,但真正做熟以后,20 分钟左右就可以完成一台服务器的基础加固。

十四、SSH 安全不是“改个端口”,而是减少管理入口暴露

SSH 被暴力破解,本质上是公网服务器管理入口暴露后的常见风险。
对香港服务器、美国服务器这类海外物理服务器来说,只要公网 IP 长期开着,扫描和撞库几乎不可避免。

真正有效的防护不是某一个小技巧,而是一套组合策略:

禁用 root 登录
关闭密码登录
使用 SSH 密钥
限制登录用户
修改默认端口
配置防火墙白名单
安装 Fail2ban
定期检查日志和异常用户
重要业务使用跳板机或内网管理

如果服务器只是普通官网,用“密钥登录 + 禁止 root + Fail2ban”基本就能挡掉绝大多数低级暴力破解。

如果服务器承载的是跨境电商、游戏服务、数据库、支付接口或高并发 API,就应该把 SSH 当成核心安全入口来管理。

因为很多服务器事故,不是业务代码先出问题,而是最基础的 SSH 登录口被弱密码、默认配置和裸露公网拖垮了。

目录结构
全文