服务器被暴力破解?这个神器让黑客哭着回家!

365bet官网登录 📅 2026-10-21 16:05:19 👤 admin 👁️ 178 👑 551
服务器被暴力破解?这个神器让黑客哭着回家!

最近公司的服务器又被人扫了,看着日志里密密麻麻的SSH登录失败记录,我的心情就像吃了苍蝇一样难受。每天几千次的暴力破解尝试,虽然密码设置得比较复杂,但这种感觉就像有人在你家门口不停地试钥匙,让人很不爽。

image-20250901221127412image-20250901221127412

直到我遇到了fail2ban这个工具,才算是彻底解决了这个烦人的问题。今天就来跟大家分享一下这个"看门神器"的使用心得,相信看完之后你也能让那些不怀好意的家伙知难而退。

什么是fail2ban说白了,fail2ban就是一个自动化的防护工具,它会实时监控你的日志文件,一旦发现有人在进行暴力破解或者其他可疑行为,就会自动把对方的IP地址加入到防火墙的黑名单中。

这个工具最初是用Python写的,现在已经发展得相当成熟了。它的工作原理其实很简单:监控→检测→封禁→解封,就是这么一个循环过程。

我第一次接触fail2ban是在三年前,那时候手里有一台阿里云的服务器,每天都有来自全世界各地的IP在尝试SSH登录。有时候一个IP一分钟能尝试几十次,看得我头皮发麻。

安装fail2ban在CentOS/RHEL系统上安装还是比较简单的:

代码语言:javascript复制# 先安装EPEL源

yum install epel-release -y

# 安装fail2ban

yum install fail2ban -yimage-20250901221318537image-20250901221318537

image-20250901221340199image-20250901221340199

Ubuntu/Debian系统就更简单了:

代码语言:javascript复制apt update

apt install fail2ban -y安装完成后,fail2ban的配置文件主要在/etc/fail2ban/目录下。这里有个小坑需要注意,不要直接修改jail.conf文件,因为软件更新的时候会覆盖掉你的配置。正确的做法是创建一个jail.local文件来覆盖默认配置。

image-20250901221410357image-20250901221410357

基础配置我习惯先备份一下原始配置文件,虽然大部分时候用不上,但养成这个习惯总是好的:

代码语言:javascript复制cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.bak然后创建我们自己的配置文件:

代码语言:javascript复制vim /etc/fail2ban/jail.local最基本的配置大概是这样的:

代码语言:javascript复制[DEFAULT]

# 封禁时间,单位是秒

bantime = 3600

# 在多长时间内

findtime = 600

# 失败多少次就封禁

maxretry = 3

# 忽略的IP地址,一般把自己的IP加进去

ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

[sshd]

enabled = true

port = ssh

filter = sshd

logpath = /var/log/auth.log

maxretry = 3

bantime = 3600image-20250901221506207image-20250901221506207

这个配置的意思是:如果有人在10分钟内SSH登录失败3次,就封禁这个IP 1小时。

不过我觉得这个设置还是太宽松了,毕竟正常用户不太可能连续输错3次密码。我一般会把maxretry设置为2,bantime设置为86400(24小时)。

Fail2ban 与 Firewalld 的关系Firewalld 不是必须的Fail2ban 不一定需要 Firewalld 开启。Fail2ban 可以与多种防火墙后端配合使用:

1. iptables:最常用的配置,即使不开启 Firewalld,Fail2ban 也可以直接操作 iptables 规则2. nftables:较新的防火墙框架3. firewalld:基于 iptables/nftables 的前端管理工具4. 其他:如 ipfw (FreeBSD)、pf (OpenBSD) 等配置选择在 Fail2ban 的配置文件中(通常在 /etc/fail2ban/jail.conf 或 /etc/fail2ban/jail.local),可以指定使用的防火墙后端:

代码语言:javascript复制[DEFAULT]

# 指定防火墙后端

banaction = iptables-multiport

# 或者

# banaction = firewallcmd-ipset注意事项• 如果系统已经启用 Firewalld,建议配置 Fail2ban 使用 firewallcmd-* 作为 banaction• 如果未使用 Firewalld,可以使用 iptables-* 作为 banaction• 不要同时使用两种不同的防火墙管理工具管理同一防火墙,可能导致规则冲突SSH防护配置详解SSH是最容易被攻击的服务,所以我们重点来说说SSH的防护配置。

代码语言:javascript复制[sshd]

enabled = true

port = 22

filter = sshd

logpath = /var/log/auth.log

maxretry = 2

findtime = 300

bantime = 86400这里有几个参数需要特别注意:

port参数要根据你实际的SSH端口来设置。如果你把SSH端口改成了2222,那这里就要写2222。

logpath在不同的系统上可能不一样,CentOS通常是/var/log/secure,Ubuntu是/var/log/auth.log。

有一次我配置的时候就是因为logpath写错了,导致fail2ban根本监控不到SSH的登录日志,白白被人扫了好几天才发现。

Web服务防护除了SSH,Web服务也是重灾区。如果你运行着Apache或者Nginx,也可以配置相应的防护规则。

对于Apache:

代码语言:javascript复制[apache-auth]

enabled = true

port = http,https

filter = apache-auth

logpath = /var/log/apache2/error.log

maxretry = 3

findtime = 600

bantime = 3600

[apache-badbots]

enabled = true

port = http,https

filter = apache-badbots

logpath = /var/log/apache2/access.log

maxretry = 2

findtime = 600

bantime = 86400对于Nginx:

代码语言:javascript复制[nginx-http-auth]

enabled = true

filter = nginx-http-auth

port = http,https

logpath = /var/log/nginx/error.log

maxretry = 3

findtime = 600

bantime = 3600

[nginx-limit-req]

enabled = true

filter = nginx-limit-req

port = http,https

logpath = /var/log/nginx/error.log

maxretry = 10

findtime = 600

bantime = 600我之前接触过一个WordPress站点,经常有人尝试暴力破解wp-admin的登录页面。配置了nginx的防护规则之后,这种攻击基本上就消失了。

自定义过滤规则fail2ban的强大之处在于可以自定义过滤规则。比如说,我想监控某个特定的应用日志,就可以创建自己的filter。

在/etc/fail2ban/filter.d/目录下创建一个新的filter文件:

代码语言:javascript复制vim /etc/fail2ban/filter.d/myapp.conf内容大概是这样:

代码语言:javascript复制[Definition]

failregex = ^.*Failed login attempt from .*$

ignoreregex =这个正则表达式会匹配包含"Failed login attempt from"的日志行,并提取出IP地址。

然后在jail.local中添加对应的jail:

代码语言:javascript复制[myapp]

enabled = true

filter = myapp

logpath = /var/log/myapp.log

maxretry = 3

findtime = 600

bantime = 3600说实话,写正则表达式这块刚开始确实有点头疼,特别是要准确匹配各种不同格式的日志。我建议先用fail2ban-regex这个工具来测试你的正则表达式:

代码语言:javascript复制fail2ban-regex /var/log/myapp.log /etc/fail2ban/filter.d/myapp.conf启动和管理配置完成后,就可以启动fail2ban了:

代码语言:javascript复制systemctl start fail2ban

systemctl enable fail2ban检查运行状态:

代码语言:javascript复制systemctl status fail2ban查看当前的jail状态:

代码语言:javascript复制fail2ban-client status查看特定jail的详细信息:

代码语言:javascript复制fail2ban-client status sshd这个命令会显示当前被封禁的IP列表,以及总的封禁次数等信息。

如果需要手动解封某个IP:

代码语言:javascript复制fail2ban-client set sshd unbanip 192.168.1.100手动封禁某个IP:

代码语言:javascript复制fail2ban-client set sshd banip 192.168.1.100日志监控和调试fail2ban的日志默认记录在/var/log/fail2ban.log中,这个文件对于调试配置问题非常有用。

代码语言:javascript复制tail -f /var/log/fail2ban.log如果发现fail2ban没有按预期工作,通常问题出在以下几个方面:

1. 日志路径配置错误2. 正则表达式匹配不准确3. 防火墙规则冲突4. 时区设置问题我遇到过一次很奇怪的问题,fail2ban明明检测到了攻击行为,但就是不封禁IP。后来发现是因为服务器的时区设置有问题,导致日志时间和系统时间不匹配。

高级配置技巧随着使用经验的积累,我总结了一些比较实用的高级配置技巧。

白名单配置

除了在DEFAULT部分设置ignoreip,还可以为特定的jail设置白名单:

代码语言:javascript复制[sshd]

enabled = true

ignoreip = 127.0.0.1/8 192.168.1.0/24 10.0.0.0/8

# 其他配置...动态封禁时间

可以配置递增的封禁时间,让重复犯罪的IP被封得更久:

代码语言:javascript复制[DEFAULT]

bantime.increment = true

bantime.factor = 2

bantime.maxtime = 604800这样配置后,第一次封禁1小时,第二次2小时,第三次4小时,以此类推,最长不超过7天。

邮件通知

当有IP被封禁时,可以配置邮件通知:

代码语言:javascript复制[DEFAULT]

destemail = admin@example.com

sender = fail2ban@example.com

mta = sendmail

action = %(action_mwl)s不过说实话,如果攻击比较频繁的话,邮件通知会让你的邮箱爆炸,所以我一般不开启这个功能。

性能优化fail2ban在处理大量日志时可能会消耗较多的系统资源,特别是在高并发的Web服务器上。

可以通过以下方式优化性能:

代码语言:javascript复制[DEFAULT]

# 减少日志扫描的频率

logtimezone = auto

# 使用系统时区

backend = systemd如果你的系统支持systemd,使用systemd backend通常比auto backend性能更好。

另外,定期清理fail2ban的数据库也很重要:

代码语言:javascript复制fail2ban-client reload与其他安全工具的配合fail2ban虽然很强大,但它不是万能的。我通常会配合其他安全工具一起使用。

比如说,可以配合DenyHosts、CSF等工具,或者在云服务器上配合安全组规则。不过要注意避免规则冲突,我就遇到过fail2ban和云服务商的安全组规则互相冲突的情况。

还有一点需要注意的是,fail2ban主要是被动防护,它只能在攻击发生后进行封禁。对于更主动的防护,还需要配合其他手段,比如修改默认端口、使用密钥认证等。

常见问题排查在使用过程中,我遇到过各种各样的问题,这里分享几个比较常见的:

问题1:fail2ban启动失败

通常是配置文件语法错误导致的,可以用这个命令检查:

代码语言:javascript复制fail2ban-client -t问题2:IP没有被封禁

检查日志路径是否正确,正则表达式是否匹配:

代码语言:javascript复制fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf问题3:自己的IP被误封

这种情况比较尴尬,特别是在远程管理服务器的时候。可以通过其他方式登录服务器,然后手动解封:

代码语言:javascript复制fail2ban-client set sshd unbanip your_ip_address为了避免这种情况,一定要把自己的IP加入白名单。

监控和维护fail2ban部署完成后,日常的监控和维护也很重要。我一般会定期检查以下几个方面:

1. 查看封禁统计,了解攻击趋势2. 检查日志文件大小,避免占用过多磁盘空间3. 更新过滤规则,应对新的攻击模式4. 备份配置文件可以写个简单的脚本来自动化这些检查:

代码语言:javascript复制#!/bin/bash

echo "=== Fail2ban Status ==="

fail2ban-client status

echo "=== SSH Jail Status ==="

fail2ban-client status sshd

echo "=== Log Size ==="

ls -lh /var/log/fail2ban.log总的来说,fail2ban确实是一个非常实用的安全工具。虽然配置起来需要花点时间,但一旦配置好了,基本上就可以高枕无忧了。当然,网络安全是一个持续的过程,不能指望一个工具解决所有问题,但fail2ban绝对是你安全工具箱中不可缺少的一件利器。

现在我管理的几十台服务器都部署了fail2ban,每天都能看到它在默默地工作着,把那些不怀好意的访问者拒之门外。虽然网络上的恶意攻击永远不会停止,但至少我们可以让自己的服务器变得更加安全。

如果你也在为服务器安全头疼,不妨试试fail2ban,相信它不会让你失望的。记得根据自己的实际情况调整配置参数,毕竟每个环境都有自己的特点。

如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!

公众号:运维躬行录

个人博客:躬行笔记

皇家推荐

毫升換算立方厘米
西藏的秘密战争,究竟发生了什么?(上)
基于bootstrap的主流框架有哪些
苹果6售后换屏幕多少钱
网络交换机有那些类型,干了10年网络工程师不一定能总结出来!
球迷谈“进击的日本队”:实力、意志力和执行力是关键