腾讯云账号等级认证 利用 fail2ban 自动封禁恶意 IP
为什么你需要fail2ban?
想象一下,你的服务器像一个无人看守的糖果店,每天都有无数‘熊孩子’试图砸门进来。SSH暴力破解、WordPress后台爆破、邮件服务疯狂尝试……这些攻击者可能来自全球各地,他们不眠不休地尝试用各种密码组合。你的服务器?它可能在默默承受着每分钟数百次的无效登录请求,而你却浑然不知。
这时候,fail2ban就像个超级保安,24小时盯着日志文件。一旦发现可疑行为,立刻触发‘一键封禁’机制,把恶意IP送进‘小黑屋’。它不哭不闹,不吵不闹,就默默守护你的服务器,让你省心又省力。
安装fail2ban的正确姿势
Ubuntu/Debian:三步搞定
打开终端,先来一句:
sudo apt update && sudo apt install fail2ban -y
这就像给服务器请了个保镖,简单又高效。安装完成后,别急着让它上岗,先去/etc/fail2ban/jail.local配置文件里给它布置任务。记住,千万别直接改jail.conf,否则下次更新系统时你的配置就gg了——毕竟jail.local才是你的私人定制地盘。
CentOS/RHEL:yum也简单
在CentOS上,命令稍有不同:
sudo yum install epel-release -y
sudo yum install fail2ban -y
安装完成后,配置路径和Ubuntu一样。不过要注意,CentOS的日志路径通常是/var/log/secure,而不是auth.log。这点容易搞错,建议安装完立刻检查日志位置,否则fail2ban会像没带眼镜的保安,根本看不见坏人!
配置规则:让fail2ban真正‘动起来’
SSH保护:守护你的‘大门’
编辑/etc/fail2ban/jail.local,加入以下配置:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h
findtime = 10m
这里maxretry=3,意思就是允许三次错误登录,之后就封1小时。findtime=10m表示在10分钟内累计3次错误就算违规。这就像超市的防贼系统:10分钟内偷三次东西,立刻拉黑一小时。
别忘了把你的IP加到白名单!比如:
ignoreip = 192.168.1.100 127.0.0.1
这样,无论你怎么输错密码,自己的IP都安全。否则,某天手抖输错三次,结果发现自己被关在服务器门外——这可真是‘搬起石头砸自己的脚’。
Nginx 404防刷策略
有时候,某些IP疯狂访问不存在的页面,可能是扫描漏洞或者爬虫。我们可以新建一个过滤器:
# 创建文件:/etc/fail2ban/filter.d/nginx-404.conf
内容如下:
[Definition]
failregex = ^<HOST> -.*'(GET|POST).*HTTP.*' 404 .*$
然后在jail.local里添加:
[nginx-404]
enabled = true
port = http,https
filter = nginx-404
logpath = /var/log/nginx/access.log
maxretry = 10
bantime = 1h
腾讯云账号等级认证 这样,10分钟内10次404,IP就被封了。虽然有点严苛,但总比让攻击者在你网站上‘逛商场’强。当然,如果你的网站有很多404页面,可以适当调高maxretry,比如20次再封。
进阶技巧:自定义过滤器和动作
让fail2ban‘说话’
默认情况下,fail2ban只是封禁IP,但你可以让它发邮件提醒你。比如在jail.local里:
[sshd]
action = %(action_)s
mail-whois[name=SSH, [email protected]]
这样每次封禁时,邮箱就会收到通知。但要注意,配置邮件服务可能有点复杂,记得先测试你的邮件是否能正常发送,不然你可能会收到‘fail2ban发送失败’的邮件,那就尴尬了。
如果想更详细,可以装个sendmail或者postfix,然后配置好发信功能。不过这一步对新手有点难,建议先用简单的测试命令:
echo '测试邮件' | mail -s 'fail2ban测试' [email protected]
如果能收到,说明邮件服务没问题,再配置fail2ban的邮件功能。
使用ipset提升效率
当需要封禁大量IP时,直接用iptables可能效率低下。这时候可以用ipset:
sudo apt install ipset -y # Ubuntu
sudo yum install ipset -y # CentOS
然后修改jail.local里的action:
action = ipset[proto=all, name=banlist, action=ban]
这样,所有被封的IP都会加入ipset,防火墙规则只需要一条,大大提升性能。尤其适合高流量的服务器,避免iptables规则爆炸。
实战案例:我的服务器这样玩
去年我的博客被WordPress暴力破解攻击,每天有几千次登录尝试。我配置了fail2ban的wp-login过滤器:
[wp-login]
enabled = true
port = http,https
filter = wp-login
logpath = /var/log/nginx/access.log
maxretry = 5
bantime = 1d
然后写了个filter文件:
# /etc/fail2ban/filter.d/wp-login.conf
[Definition]
failregex = ^<HOST> -.*'POST /wp-login.php.* HTTP/.*' 200 .*$
结果?攻击者在5次错误后被封一天,第二天又来,继续封。后来发现有个IP连续封禁了3天,我一看是某国家的某IP段,果断用ipset封整个段。现在我的博客再也没被成功破解过,连WordPress更新都安心多了!
常见问题与避坑指南
'我把自己封了怎么办?'
这绝对是新手必犯的错误!比如你连续输错SSH密码三次,结果IP被封。这时候,如果你没有其他方式访问服务器,就只能找机房人员帮忙解封。为了避免这种情况,可以先在白名单里加上自己的IP:
ignoreip = 192.168.1.100 127.0.0.1
这样,无论你怎么折腾,自己的IP都不会被封。记住:白名单是你的救命稻草,千万别忘了加!
日志路径搞错了?
不同系统的日志位置可能不同。比如Ubuntu的SSH日志是/var/log/auth.log,而CentOS是/var/log/secure。如果你发现fail2ban没生效,先检查日志路径是否正确。可以用以下命令确认:
grep 'Failed password' /var/log/auth.log # Ubuntu
grep 'Failed password' /var/log/secure # CentOS
如果找不到记录,说明日志路径不对,赶紧修正。
防火墙没开?
有些服务器默认不启用防火墙,比如ufw未开启,或者iptables未运行。fail2ban需要防火墙支持才能封禁IP。检查防火墙状态:
sudo ufw status # 如果使用ufw
sudo iptables -L # 检查iptables规则
如果没开,先启用再配置fail2ban。否则它再努力也白搭——就像一个没有武器的保安,只能干瞪眼。
腾讯云账号等级认证 总结:把fail2ban变成你的‘守护神’
fail2ban不是银弹,但它是服务器安全的基石之一。通过合理配置,它可以自动识别并封禁绝大多数恶意IP,让你从繁琐的监控工作中解放出来。记住几个关键点:白名单一定要设、日志路径要确认、定期检查规则是否生效。把它当作24小时在线的守护神,而不是随便装个工具就不管了。毕竟,网络安全无小事,你的服务器值得更好的保护。

