惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Engineering at Meta
Engineering at Meta
腾讯CDC
宝玉的分享
宝玉的分享
H
Help Net Security
I
InfoQ
博客园 - Franky
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Microsoft Security Blog
Microsoft Security Blog
M
MIT News - Artificial intelligence
博客园_首页
美团技术团队
Recent Announcements
Recent Announcements
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
雷峰网
雷峰网
The Cloudflare Blog
博客园 - 司徒正美
Vercel News
Vercel News
MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
爱范儿
爱范儿
月光博客
月光博客

沉迷在 - Java.li - 无法自拔

Spring Boot 整合 MyBatis DeepSeek Harness 深入解读 Spring Boot 连接 MySQL GitHub发生故障,崩了7个小时 Spring Boot 配置文件怎么写 SpringBoot 教程 MyBatis Invalid bound statement 怎么处理 Spring Boot 端口被占用怎么处理 Qdrant 向量数据库入门 Spring Boot 接收 JSON 参数 Spring Boot启动报错 Failed to configure a DataSource 解决办法 Maven依赖冲突怎么排查?dependency:tree、exclusions与版本统一完整教程 - 沉迷在 - Java.li - 无法自拔 给网站加一条会动的人群横幅:Little People 动画组件 Demo - 沉迷在 - Java.li - 无法自拔 【soso.re】聚合热榜 | CloudflareWorkers部分接口失效的排查与代理方案 - 沉迷在 - Java.li - 无法自拔 Spring Boot 2升级到Spring Boot 3完整指南:JDK17、javax迁移jakarta、依赖兼容与常见报错 - 沉迷在 - Java.li - 无法自拔 随机小姐姐视频 - 沉迷在 - Java.li - 无法自拔 Spring Boot与JDK版本兼容表:Spring Boot 2.x / 3.x / 4.x应该用哪个Java版本? - 沉迷在 - Java.li - 无法自拔 No compiler is provided in this environment解决办法:JDK、JRE、Maven与IDEA排查 - 沉迷在 - Java.li - 无法自拔 置身钉内|含全文 PDF - 沉迷在 - Java.li - 无法自拔 javac不是内部或外部命令怎么解决?JDK、JAVA_HOME和Path完整排查 Windows配置JAVA_HOME后不生效怎么办?java -version显示旧版本解决办法 Maven Could not transfer artifact 下载失败解决:settings.xml、国内镜像、本地缓存与代理排查 JSON转Java实体类完整教程:对象、数组、嵌套结构与LocalDateTime处理 Windows安装JDK 8 / 17 / 21 / 25完整教程:JAVA_HOME环境变量配置与验证 IDEA下载JDK很慢怎么办?手动配置本地JDK完整教程 Java版本号与class文件major version对照表:Unsupported class file major version 52 / 55 / 61 / 65 / 69 / 70 Gradle国内镜像配置教程:init.gradle、repositories与Wrapper加速完整指南 Maven国内镜像settings.xml配置大全:阿里云、腾讯云、华为云、清华源 Java开发者必备工具箱 2026年Java行情深度解读:就业真实现状、语言排名与开发者破局指南
如何防止服务器被暴力破解?2026年最全的5层防护实战指南
HiF · 2026-04-21 · via 沉迷在 - Java.li - 无法自拔

服务器总被暴力破解骚扰?本文基于亲身实战,从修改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步开始。