服务器总被暴力破解骚扰?本文基于亲身实战,从修改SSH端口、密钥登录,到配置Fail2ban自动封禁、设置防火墙规则,最终实现监控告警,提供一套5层递进式防护终极方案,并附赠累积的黑名单IP,让你的服务器固若金汤。

如何防止服务器被暴力破解?2026年5层防护终极指南

你是否在 /var/log/auth.log/var/log/secure 里见过满屏的 Failed password for root from ?这可不是什么行为艺术,而是你的服务器正在被黑客“暴力破解”——他们用成千上万的密码组合,试图撞开你的大门。轻则浪费资源,重则服务器沦陷,数据被盗,网站被挂黑页。

就在不久前,我的服务器也经历了这场风暴。在记一次处理服务器被暴力破解一文中,我记录了当时的应急处理过程。但亡羊补牢不如未雨绸缪。今天,我将这次实战经验系统化,为你梳理出一套从外到内、从基础到进阶的 「5层服务器防护体系」。遵循这个指南,你可以极大提升服务器的攻击门槛,让暴力破解徒劳无功。

第一层:基础加固 - 告别“出厂设置”

黑客攻击往往从最简单的默认配置开始。第一步就是改变这些“众所周知”的设定。

1. 修改SSH默认端口(22)
将SSH端口从22改为一个大于1024的非知名端口,能立刻过滤掉绝大部分漫无目的的扫描流量。

# 编辑SSH配置文件
sudo vim /etc/ssh/sshd_config
# 找到 #Port 22, 去掉注释,并修改端口号,例如:
Port 58234
# 保存后重启SSH服务
sudo systemctl restart sshd

⚠️ 重要:修改前,务必确保新端口已在防火墙中放行,并且不要关闭当前连接,建议开两个会话测试新端口连通性后再退出。

2. 禁止Root用户直接登录
Root账户权限太大,禁止其直接登录,能迫使攻击者必须同时猜中用户名和密码。

# 同样在 /etc/ssh/sshd_config 中修改
PermitRootLogin no

3. 禁用密码登录,强制使用SSH密钥对
这是最重要、最有效的一步。密钥认证的加密强度远超任何密码。

  • 生成密钥对(在本地电脑):
    ssh-keygen -t rsa -b 4096
    
  • 上传公钥到服务器
    ssh-copy-id -p 你的端口 -i ~/.ssh/id_rsa.pub 用户名@服务器IP
    
  • 禁用密码登录
    # 在 /etc/ssh/sshd_config 中设置
    PasswordAuthentication no
    ChallengeResponseAuthentication no
    
    重启SSH服务后,你的服务器将只认密钥不认密码。

第二层:主动防御 - 用Fail2ban自动封禁“惯犯”

基础操作能防“懒”黑客,但对于持续的暴力破解,我们需要一个自动警察——Fail2ban。它会监控日志,当同一IP在短时间内多次认证失败,就自动将其IP加入防火墙黑名单。

1. 安装Fail2ban

# Ubuntu/Debian
sudo apt update && sudo apt install fail2ban -y
# CentOS/RHEL
sudo yum install epel-release && sudo yum install fail2ban -y

2. 配置防护策略
Fail2ban的配置位于 /etc/fail2ban/jail.local(推荐覆盖jail.conf)。

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local

找到 [sshd] 部分并进行如下配置(这是关键):

[sshd]
enabled = true
port = 你的SSH端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 300
bantime = 604800
  • maxretry = 3:允许的最大失败次数。
  • findtime = 300:在300秒(5分钟)内的失败计入。
  • bantime = 604800:违规IP将被封禁604800秒(一周)。可以设置为 -1 永久封禁,但需谨慎。

3. 启动与查看

sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
# 查看sshd监狱的封禁状态
sudo fail2ban-client status sshd

第三层:网络隔离 - 用防火墙构筑“护城河”

即使端口改了,也应该用防火墙严格限制访问来源。

使用UFW(简单)

# 允许特定IP段(如你的办公网IP)访问SSH端口
sudo ufw allow from 203.0.113.0/24 to any port 58234
# 默认拒绝所有入站
sudo ufw default deny incoming
sudo ufw enable

使用iptables(通用)

# 允许特定IP,拒绝其他所有对SSH端口的访问
sudo iptables -A INPUT -s 203.0.113.100 -p tcp --dport 58234 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 58234 -j DROP
# 记得保存规则(取决于你的发行版)

云服务器安全组:在阿里云、腾讯云等控制台,设置安全组规则,只放行你的IP地址到SSH端口,这是最外一层也是最有效的防护。

第四层:深度监控 - 设立“预警哨所”

防护体系需要眼睛。我们需要知道谁在试探,以及何时该提高警戒。

1. 增强日志
确保SSH日志级别足够。在/etc/ssh/sshd_config中可设置 LogLevel VERBOSE

2. 设置日志告警
可以写一个简单的脚本,用cron定时任务扫描日志,发现大量失败尝试就发邮件或通过Server酱、Telegram Bot通知你。

#!/bin/bash
# 简易日志监控脚本示例
FAILED_COUNT=$(sudo tail -100 /var/log/auth.log | grep "Failed password" | wc -l)
if [ $FAILED_COUNT -gt 10 ]; then
  echo "警告:过去100条日志中发现 $FAILED_COUNT 次SSH失败登录!" | mail -s "服务器安全告警" [email protected]
fi

第五层:进阶策略与工具

对于有更高安全需求的服务器,可以考虑:

  • 部署蜜罐(Honeypot):如用cowrie伪装成一个易攻破的SSH服务,引诱攻击者进入,记录其行为并浪费其时间,同时保护真实服务。
  • 使用现代替代品CrowdSec 可以看作是Fail2ban的“下一代”,它采用分布式情报共享,不仅基于本地日志,还能利用社区共享的攻击IP情报进行防护,更为智能。

实战附录:一份来自实战的黑名单IP段

在我的防御过程中,我积累了一些高频攻击的来源IP段。请注意,IP是动态的,此列表仅供参考,直接封禁整个段可能误伤,建议优先使用Fail2ban动态封禁。 你可以在服务器防火墙的“预置黑名单”中酌情使用。

IP段/国家备注
103.102.128.0/18 (某地区)SSH暴力破解高频源
45.95.0.0/16 (某网络)近期非常活跃的攻击段
185.174.136.0/22 (某地)常与Web漏洞扫描结合

(欢迎大家在评论区补充你遇到的可疑IP,我们一起维护这份清单!)

总结

服务器的安全防护是一个纵深体系,没有一劳永逸的银弹。让我们回顾一下这5层策略:

  1. 基础加固:改端口、禁root、用密钥——让攻击面最小化。
  2. 主动防御:部署Fail2ban——让持续攻击者自动上黑名单。
  3. 网络隔离:配置防火墙/安全组——只允许可信IP访问。
  4. 深度监控:设置日志告警——让自己对攻击态势心中有数。
  5. 进阶探索:考虑蜜罐或CrowdSec——从被动防御转向主动干扰。

按照从1到5的顺序逐步实施,你的服务器安全性将得到质的飞跃。安全是一个持续的过程,定期更新系统、检查日志、审视规则同样重要。

如果你在配置过程中遇到问题,或者有更好的工具推荐,欢迎在下方留言讨论。保护我们的数字资产,从今天这5步开始。