Fail2Ban,自动化封禁异常IP
在 CentOS Linux release 7.9.2009 (Core) 上部署 Fail2Ban,实现对 SSH 和 Nginx 异常请求的自动拦截,可以分为以下几个步骤——涵盖安装、配置、过滤器(filters)、jail 设置及验证。
一、安装 Fail2Ban
启动并设置 Fail2Ban 开机自启:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
首先启用 EPEL 源并安装 Fail2Ban:
sudo yum install epel-release
sudo yum install fail2ban
这确保从 EPEL 安装最新可用的包。(DigitalOcean, UpCloud)
在centos8.5上,可能会因为8.5不在维护而找不到安装包的情况,这时只能从官方官网下载源码安装,但是安装后可能会出现找不到python依赖包的错误,此时需要修改服务的python环境变量:
vi /etc/systemd/system/fail2ban.service
[Service]
Environment="PYTHONPATH=/usr/local/lib/python3.6/site-packages/"
然后
systemctl daemon-reload
systemctl restart fail2ban
二、配置基础设置
编辑 jail.local,设置默认策略,比如:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
bantime = 3600 # 封禁 1 小时
findtime = 600 # 10 分钟内
maxretry = 5 # 最多失败 5 次
banaction = iptables-multiport
(UpCloud, plesk.com, Evoluso Blog)
复制默认配置,避免直接修改 jail.conf,以防升级被覆盖:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
三、添加 SSH Jail
在 jail.d/ 下创建独立配置文件,比如 sshd.local:
[sshd]
enabled = true
port = ssh
logpath = /var/log/secure
maxretry = 5
bantime = 3600
然后重启 Fail2Ban:
sudo systemctl restart fail2ban
(Evoluso Blog, CloudCone, UpCloud)
四、配置 Nginx 异常请求拦截策略
- Fail2Ban 自带多种 nginx 过滤器文件,存放于
/etc/fail2ban/filter.d/,常见包括:nginx-4xx.conf:拦截 HTTP 4xx 请求(404、403 等)nginx-forbidden.conf:拦截目录索引被禁止访问nginx-botsearch.conf:拦截恶意 bot 搜索行为nginx-http-auth.conf、nginx-sslerror.conf等(Scalastic)
- 创建 jail 配置文件(例如
jail.d/nginx.local或custom.conf),启用需要的规则:
[nginx-4xx]
enabled = true
port = http,https
filter = nginx-4xx
logpath = %(nginx_error_log)s
[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = %(nginx_access_log)s
[nginx-forbidden]
enabled = true
port = http,https
filter = nginx-forbidden
logpath = %(nginx_error_log)s
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = %(nginx_error_log)s
[nginx-sslerror]
enabled = true
port = http,https
filter = nginx-sslerror
logpath = %(nginx_error_log)s
然后重启 Fail2Ban 服务:
sudo systemctl restart fail2ban
五、验证与管理
- 若防火墙使用的是
firewalld,确保相应端口规则正确,或者直接使用iptables以避免冲突。(Server Fault)
若误封 IP,可手动解封:
sudo fail2ban-client set <jail> unbanip <IP地址>
查看 iptables 封禁规则:
sudo iptables -L -n
查看启用的 jail 列表:
sudo fail2ban-client status
同时可以查看特定 jail 的详细状态和被封禁的 IP:
sudo fail2ban-client status sshd
sudo fail2ban-client status nginx-4xx
六、完整流程示例脚本
sudo yum install epel-release
sudo yum install fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
cat << EOF | sudo tee /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
bantime = 3600
findtime = 600
maxretry = 5
banaction = iptables-multiport
EOF
cat << EOF | sudo tee /etc/fail2ban/jail.d/sshd.local
[sshd]
enabled = true
port = ssh
logpath = /var/log/secure
maxretry = 5
bantime = 3600
EOF
cat << EOF | sudo tee /etc/fail2ban/jail.d/nginx.local
[nginx-4xx]
enabled = true
port = http,https
filter = nginx-4xx
logpath = %(nginx_error_log)s
[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = %(nginx_access_log)s
EOF
sudo systemctl restart fail2ban
sudo fail2ban-client status
小结
- 安装 EPEL 并安装 Fail2Ban
- 使用
jail.local覆盖默认配置 - 分别为 SSH 和 Nginx 创建独立 jail 文件
- 启用常见 Nginx 过滤规则(如 4xx、bot 搜索等)
- 重启服务后通过命令验证状态与封禁情况