服务器被暴力ssh爆破,如何防护与封禁IP

前言

刚装好的服务器没几天,一看登录日志吓一跳——全是各种IP在尝试SSH登录,用户名猜遍了root、admin、test,密码也是暴力破解。这就是典型的SSH暴力破解攻击。如果你的服务器密码又简单,很容易被破解进来。本文就讲一下怎么发现暴力破解、怎么封禁恶意IP,以及怎么从根本上防护。

第一步:查看SSH登录日志

先看看有没有被爆破。CentOS7 的SSH日志在 /var/log/secure:

tail -100 /var/log/secure

如果看到大量类似这样的记录,就是被爆破了:

Failed password for root from 1.2.3.4 port 12345 ssh2
Failed password for admin from 5.6.7.8 port 23456 ssh2

统计一下尝试登录的次数最多的IP:

grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -rn | head -10

输出会列出尝试登录次数最多的10个IP。

防护方案一:使用 fail2ban 自动封禁

手动封禁太慢了,用 fail2ban 可以自动检测并封禁恶意IP。

1. 安装 EPEL 源

yum install epel-release -y

2. 安装 fail2ban

yum install fail2ban -y

3. 配置 fail2ban

vi /etc/fail2ban/jail.local

写入以下内容:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 86400
findtime = 600

参数说明:

  • enabled = true:启用这个规则
  • maxretry = 3:最多尝试3次
  • bantime = 86400:封禁24小时(单位秒)
  • findtime = 600:10分钟内的失败次数

4. 启动 fail2ban

systemctl start fail2ban
systemctl enable fail2ban

5. 查看封禁状态

fail2ban-client status sshd

防护方案二:手动封禁恶意IP

如果不想装 fail2ban,也可以手动用 firewall-cmd 封禁IP:

封禁单个IP

firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='1.2.3.4' reject"
firewall-cmd --reload

查看已封禁的规则

firewall-cmd --list-rich-rules

解除封禁

firewall-cmd --permanent --remove-rich-rule="rule family='ipv4' source address='1.2.3.4' reject"
firewall-cmd --reload

防护方案三:修改SSH默认端口

SSH默认端口是22,所有人都知道,扫端口的机器人都会先扫22。改成一个不常见的端口能挡住90%的自动扫描。

1. 编辑SSH配置

vi /etc/ssh/sshd_config

找到 #Port 22,改成:

Port 22222

2. 防火墙开放新端口

firewall-cmd --permanent --add-port=22222/tcp
firewall-cmd --reload

3. 重启SSH服务

systemctl restart sshd

注意: 改完端口后,连接时要指定新端口:ssh -p 22222 root@你的服务器IP。千万不要关掉当前SSH窗口!新开一个窗口测试,确认新端口能连上了再关旧窗口。

防护方案四:禁止root密码登录,改用密钥登录

最彻底的防护就是不让密码登录,只用SSH密钥登录。

1. 生成SSH密钥对

在你本地电脑上执行:

ssh-keygen -t rsa -b 4096

一路回车,会生成两个文件:

  • ~/.ssh/id_rsa:私钥,放在你本地
  • ~/.ssh/id_rsa.pub:公钥,上传到服务器

2. 上传公钥到服务器

ssh-copy-id -p 22222 root@你的服务器IP

3. 配置SSH禁用密码登录

vi /etc/ssh/sshd_config

找到并修改:

PasswordAuthentication no
PermitRootLogin yes
PubkeyAuthentication yes

4. 重启SSH服务

systemctl restart sshd

注意: 改之前一定要确认密钥登录能正常用!不然改完就连不上了。

防护方案五:限制只允许特定IP登录

如果你自己的IP是固定的,可以只允许自己的IP登录SSH:

firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='你的IP/24' port protocol='tcp' port='22' accept"
firewall-cmd --permanent --remove-port=22/tcp
firewall-cmd --reload

这样只有你指定的IP段才能连SSH,其他IP直接拒绝。

常见坑

坑1:改了SSH端口忘了开防火墙

改完SSH端口后,忘了在防火墙里开放新端口,结果新端口连不上,旧端口也关了,直接把自己锁在外面。

解决: 改完端口后,一定要先开防火墙再重启SSH,而且要新开窗口测试。

坑2:用fail2ban把自己封了

测试的时候故意输错几次密码,结果被fail2ban封了自己的IP。

解决: 把自己的IP加到 fail2ban 的忽略列表里:

ignoreip = 127.0.0.1/8 你的IP

坑3:禁用密码登录前没测试密钥

直接就把 PasswordAuthentication no 了,结果密钥没配好,连不上服务器了。

解决: 先测试密钥登录能正常用,再禁用密码登录。千万不要关当前窗口,新开窗口测试。

总结

SSH暴力破解防护的优先级:

  1. 改SSH端口:从22改成其他端口,挡住大部分自动扫描
  2. 用fail2ban:自动封禁多次失败的IP
  3. 用密钥登录:禁用密码登录,这是最彻底的防护
  4. 限制IP:只允许自己的IP段登录

防护措施不是越多越好,够用就行。最推荐的组合是:改端口 + fail2ban + 密钥登录,这一套下来基本就很安全了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:32