雅安市网站建设_网站建设公司_Java_seo优化
2025/12/17 16:00:13 网站建设 项目流程

Fail2Ban 安装及使用指南

Fail2Ban 是一个入侵防御系统,通过监控日志文件来检测恶意行为(如暴力破解、扫描攻击),并自动更新防火墙规则来阻止攻击者IP地址。


第一部分:安装

1. Ubuntu/Debian 系统

bash
# 更新包列表
sudo apt update# 安装 Fail2Ban
sudo apt install fail2ban -y# 安装可选的邮件功能(用于接收通知)
sudo apt install sendmail -y  # 或者 postfix

2. CentOS/RHEL 7/8/9 系统

bash
# CentOS/RHEL 7
sudo yum install epel-release -y
sudo yum install fail2ban -y# CentOS/RHEL 8/9
sudo dnf install epel-release -y
sudo dnf install fail2ban -y# 安装邮件通知功能(可选)
sudo yum install sendmail -y  # 或 postfix

3. macOS(使用 Homebrew)

bash
brew install fail2ban

第二部分:基本配置

1. 核心配置文件结构

text
/etc/fail2ban/
├── fail2ban.conf          # 主配置文件(全局设置)
├── jail.conf             # 监狱规则主配置文件(不要修改!)
├── jail.d/               # 自定义监狱配置目录
│   └── local.conf        # 推荐的自定义配置
├── filter.d/             # 过滤器规则目录
│   ├── sshd.conf
│   ├── apache-auth.conf
│   └── ...
├── action.d/             # 动作脚本目录
│   ├── iptables-multiport.conf
│   ├── sendmail.conf
│   └── ...
└── paths-common.conf     # 日志路径等通用配置

2. 创建自定义配置文件(推荐)

永远不要直接修改 jail.conf,而是创建 jail.local 或使用 jail.d/ 目录:

bash
# 复制模板配置文件
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local# 或者创建一个新文件(推荐)
sudo nano /etc/fail2ban/jail.local

3. 基础配置示例

ini
[DEFAULT]
# 禁止IP地址的时长(秒)
bantime = 3600  # 1小时,-1 表示永久封禁# 检测时间窗口(秒)
findtime = 600   # 10分钟内# 最大失败次数
maxretry = 5     # 10分钟内失败5次则封禁# 监听的IP地址(留空表示所有接口)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24# 使用的封禁动作
banaction = iptables-multiport
banaction_allports = iptables-allports# 邮件通知设置
mta = sendmail
destemail = admin@yourdomain.com
sender = fail2ban@yourdomain.com
sendername = Fail2Ban# 动作类型
action = %(action_)s  # 仅封禁
# action = %(action_mwl)s  # 封禁并发送邮件(包含日志)# 日志级别
loglevel = INFO
logtarget = /var/log/fail2ban.log

第三部分:配置保护服务(监狱)

1. SSH 保护(最常用)

ini
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log  # Debian/Ubuntu
# logpath = /var/log/secure   # CentOS/RHEL
maxretry = 3
bantime = 86400  # 24小时

2. Apache/Nginx 保护

ini
# Apache 认证失败
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/*error.log  # Debian/Ubuntu
# logpath = /var/log/httpd/*error_log   # CentOS/RHEL
maxretry = 3# Nginx 认证失败
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3# Nginx Bot 防护(防止扫描)
[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 86400

3. MySQL/MariaDB 保护

ini
[mysqld-auth]
enabled = true
port = 3306
filter = mysqld-auth
logpath = /var/log/mysql/error.log  # 根据实际路径调整
maxretry = 3
bantime = 3600

4. WordPress 保护

ini
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/www/html/*/logs/access.log  # 根据实际路径调整
maxretry = 3
bantime = 86400

5. 自定义规则:防止端口扫描

ini
[portscan]
enabled = true
filter = portscan
logpath = /var/log/syslog  # 或 /var/log/messages
maxretry = 1  # 发现一次就封
bantime = 604800  # 7天
action = iptables-allports[name=PORTSCAN]

第四部分:管理和监控

1. 启动和启用服务

bash
# 启动服务
sudo systemctl start fail2ban# 设置开机自启
sudo systemctl enable fail2ban# 查看服务状态
sudo systemctl status fail2ban# 重启服务(修改配置后)
sudo systemctl restart fail2ban# 重新加载配置(不重启)
sudo fail2ban-client reload

2. 常用命令行操作

bash
# 查看所有监狱状态
sudo fail2ban-client status# 查看特定监狱状态(如 sshd)
sudo fail2ban-client status sshd# 解封特定IP
sudo fail2ban-client set sshd unbanip 192.168.1.100# 手动封禁IP
sudo fail2ban-client set sshd banip 192.168.1.100# 查看被禁止的IP列表
sudo fail2ban-client get sshd banned# 暂停/恢复监狱
sudo fail2ban-client set sshd stop
sudo fail2ban-client set sshd start

3. 查看日志和调试

bash
# 查看 fail2ban 日志
sudo tail -f /var/log/fail2ban.log# 查看封禁记录
sudo grep 'Ban' /var/log/fail2ban.log# 查看解封记录
sudo grep 'Unban' /var/log/fail2ban.log# 测试过滤器规则
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

第五部分:高级配置和技巧

1. 自定义过滤器规则

创建自定义过滤器 /etc/fail2ban/filter.d/myapp.conf

ini
[Definition]
failregex = ^.*Failed login from <HOST>.*$^.*Authentication failure for <HOST>.*$
ignoreregex =  # 忽略某些模式

2. 使用数据库后端(替代文件日志)

ini
[DEFAULT]
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 7d  # 清理7天前的记录

3. 邮件通知配置

ini
[DEFAULT]
destemail = admin@example.com
sender = fail2ban@example.com# 发送邮件(包含日志)
action = %(action_mwl)s# 或自定义动作
action = iptables-multiport[name=SSH, port="ssh"]sendmail[name=SSH, dest="admin@example.com", sender="fail2ban@example.com"]

4. 使用 Cloudflare API 自动封禁

ini
[cloudflare]
action = cloudflare

创建动作文件 /etc/fail2ban/action.d/cloudflare.conf

ini
[Definition]
actionstart = 
actionstop = 
actioncheck = 
actionban = curl -s -X POST "https://api.cloudflare.com/client/v4/zones/<ZONE_ID>/firewall/access_rules/rules" \-H "X-Auth-Email: <EMAIL>" \-H "X-Auth-Key: <API_KEY>" \-H "Content-Type: application/json" \--data '{"mode":"block","configuration":{"target":"ip","value":"<ip>"},"notes":"Banned by Fail2Ban"}'
actionunban = curl -s -X DELETE "https://api.cloudflare.com/client/v4/zones/<ZONE_ID>/firewall/access_rules/rules/<RULE_ID>" \-H "X-Auth-Email: <EMAIL>" \-H "X-Auth-Key: <API_KEY>"

第六部分:故障排除

常见问题及解决方案

  1. Fail2Ban 不封禁IP

    bash
    # 1. 检查服务状态
    sudo systemctl status fail2ban# 2. 检查监狱是否启用
    sudo fail2ban-client status# 3. 检查日志路径是否正确
    sudo ls -la /var/log/auth.log# 4. 测试过滤器
    sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
  2. 无法连接到防火墙

    bash
    # 检查防火墙服务
    sudo systemctl status iptables  # 或 firewalld、ufw# 确保 Fail2Ban 有权限
    sudo setcap cap_net_raw,cap_net_admin+eip /usr/bin/fail2ban-server
  3. 误封自己的IP

    bash
    # 立即解封
    sudo fail2ban-client set sshd unbanip <你的IP># 添加到忽略列表
    # 修改 /etc/fail2ban/jail.local
    ignoreip = 127.0.0.1/8 ::1 <你的IP># 重启服务
    sudo systemctl restart fail2ban
  4. 性能问题

    ini
    # 在 jail.local 中调整
    usedns = no  # 不进行DNS反向解析
    logencoding = auto

第七部分:安全建议

  1. 白名单重要IP:确保自己的IP在 ignoreip 列表中

  2. 合理设置封禁时间:生产环境建议 bantime = 86400(24小时)

  3. 监控 Fail2Ban 日志:定期检查封禁情况

  4. 使用强密码:Fail2Ban 是辅助措施,不能替代强密码策略

  5. 更改默认端口:SSH 使用非22端口可以减少暴力破解尝试

  6. 定期更新规则:关注 Fail2Ban 社区的新规则


快速验证安装

bash
# 1. 安装后检查
sudo fail2ban-client --version# 2. 查看运行状态
sudo fail2ban-client status# 3. 模拟攻击测试(从另一台机器)
# 连续输错SSH密码多次,然后检查是否被封
ssh user@your-server  # 故意输错密码# 4. 查看封禁列表
sudo fail2ban-client status sshd# 5. 查看防火墙规则
sudo iptables -L -n  # 或 sudo ufw status

通过以上步骤,你可以有效地使用 Fail2Ban 保护服务器免受暴力破解和扫描攻击。记得根据实际需求调整配置,并定期审查日志以确保安全策略有效。

以下是 fail2ban 的完整安装与使用示例,包含 SSH 防暴力破解、Nginx 防 Web 登录爆破 两个典型场景,步骤清晰、可直接用于生产环境。


一、安装 fail2ban

✅ Ubuntu / Debian

bash
编辑
sudo apt update
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban

✅ CentOS / Rocky Linux / RHEL

bash
编辑
# 启用 EPEL(如未启用)
sudo dnf install -y epel-release# 安装
sudo dnf install -y fail2ban
sudo systemctl enable --now fail2ban

🔍 验证:

bash
编辑
sudo fail2ban-client status
# 应显示 "Status: Running"

二、基础配置原则

  • 不要修改 /etc/fail2ban/jail.conf
  • 所有自定义配置写入 /etc/fail2ban/jail.local
bash
编辑
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

三、使用示例 1:保护 SSH(防暴力破解)

1. 编辑配置文件

bash
编辑
sudo vim /etc/fail2ban/jail.local

[sshd] 区块下添加或修改:

ini
编辑
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 5        # 5 次失败
findtime = 600      # 10 分钟内
bantime = 3600      # 封禁 1 小时(秒)
ignoreip = 127.0.0.1/8 192.168.1.0/24  # 白名单(替换为你的管理网段)

2. 重载配置

bash
编辑
sudo fail2ban-client reload

3. 验证效果

  • 从另一台机器故意输错 SSH 密码 5 次
  • 查看状态:
    bash
    编辑
    sudo fail2ban-client status sshd
    输出示例:
    text
    编辑
    Status for the jail: sshd
    |- Filter
    |  |- Currently failed: 0
    |  `- Total failed:     5
    `- Actions|- Currently banned: 1`- Total banned:     1
  • 查看被封 IP:
    bash
    编辑
    sudo iptables -L f2b-sshd -n  # 或 nft list chain inet f2b-table f2b-sshd

四、使用示例 2:保护 Nginx(防 Web 登录爆破)

假设你的网站有 /login 页面,攻击者频繁尝试登录。

步骤 1:创建日志过滤规则

bash
编辑
sudo vim /etc/fail2ban/filter.d/nginx-login.conf

内容:

ini
编辑
[Definition]
# 匹配访问 /login 且返回 401/403/404 的请求(表示登录失败)
failregex = ^<HOST>.*"(GET|POST).*\/login.* HTTP\/.*" (401|403|404)
ignoreregex =

💡 测试正则是否匹配日志:

bash
编辑
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-login.conf

步骤 2:在 jail.local 中启用

ini
编辑
[nginx-login]
enabled = true
port = http,https
filter = nginx-login
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 300      # 5 分钟内
bantime = 7200      # 封禁 2 小时

步骤 3:重载并验证

bash
编辑
sudo fail2ban-client reload
sudo fail2ban-client status nginx-login

五、常用运维命令

功能命令
查看所有监控项 sudo fail2ban-client status
查看某服务状态 sudo fail2ban-client status sshd
手动封禁 IP sudo fail2ban-client set sshd banip 1.2.3.4
手动解封 IP sudo fail2ban-client set sshd unbanip 1.2.3.4
查看日志 tail -f /var/log/fail2ban.log
检查规则匹配 sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

六、安全建议

  1. 务必设置白名单(避免把自己锁在外面):

    ini
    编辑
    [DEFAULT]
    ignoreip = 127.0.0.1/8 192.168.0.0/16 203.0.113.10
  2. 不要永久封禁(bantime = -1),建议 1~24 小时。

  3. 定期检查日志,防止误封:

    bash
    编辑
    grep "Ban" /var/log/fail2ban.log
  4. 结合系统防火墙:确保 iptables/nftables/firewalld 正常工作。


七、扩展:邮件告警(可选)

jail.local 中为某个服务添加邮件通知:

ini
编辑
[sshd]
enabled = true
action = %(action_mwl)s
  • m = 发邮件
  • w = 附带 whois 信息
  • l = 附带日志片段

需提前配置好邮件服务(如 Postfix + Sendmail)。


总结:快速上手 checklist

✅ 安装 fail2ban
✅ 创建 jail.local
✅ 配置 [sshd](必做)
✅ (可选)配置 Web 保护(如 nginx-login)
✅ 设置 ignoreip 白名单
fail2ban-client reload
✅ 用 status 命令验证

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询