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

一、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 端口开放,几乎都会被全球扫描器反复尝试登录。
真正要判断的不是“有没有人尝试登录”,而是:
- 有没有成功登录记录?
- 有没有异常用户被创建?
- 有没有异常进程、计划任务、后门文件?
- SSH 是否还在使用弱密码、root 直登、默认端口?
- 业务服务器和管理入口是否混在一起暴露?
所以,处理 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 经常变化,可以使用:
- VPN 后再登录 SSH;
- 跳板机登录;
- IDC 控制台临时开白名单;
- 使用动态 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
重点关注:
- CPU 长期跑满的陌生进程;
- 监听奇怪端口的程序;
- 路径位于
/tmp、/dev/shm、/var/tmp的可执行文件; - 伪装成系统服务的进程名。
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 登录口被弱密码、默认配置和裸露公网拖垮了。