暴露在公网上的外网服务器,无时无刻不在遭受各种自动化扫描和攻击尝试,其中最常见的就是针对SSH、FTP、邮件服务以及Web应用登录界面的暴力破解(Brute-force Attack)。攻击者利用程序自动尝试大量用户名和密码组合,试图猜中正确的登录凭证。一旦成功,服务器将完全沦陷。Fail2ban是一款非常流行且有效的开源入侵防御软件,通过监控服务器上的日志文件,识别恶意的、重複的登录失败尝试,并在达到预设阈值后,自动调用系统防火牆(如iptables, nftables, firewalld)或特定服务(如Cloudflare API)来临时(或永久)禁止攻击者的IP地址访问。在外网服务器上正确配置和使用Fail2ban,可以极大地增强抵御暴力破解攻击的能力。
Fail2ban工作原理
1.监控日志文件: Fail2ban持续扫描指定的日志文件(如SSH的/var/log/auth.log,Nginx的错误日志等)。
2.匹配过滤规则 (Filter): 使用预定义或自定义的过滤规则(正则表达式)在日志中查找匹配特定模式的行(如“Failed password for invalid user”、“authentication failure”)。
3.触发动作 (Action): 当来自同一个IP地址的匹配失败次数在指定时间窗口内(findtime)达到了最大重试次数(maxretry)时,Fail2ban就会触发一个预定义的动作。
4.执行禁止动作: 最常见的动作是调用防火牆命令(如iptables -I INPUT ... -j DROP)将该攻击IP加入禁止访问列表,持续一段时间(bantime)。也可以配置发送邮件通知、调用API等其他动作。
在外网服务器上安装和配置Fail2ban(以Debian/Ubuntu为例)
1. 安装Fail2ban:Bash
sudo apt update
sudo apt install fail2ban -y
安装完成后,Fail2ban服务通常会自动启动。
2. 理解配置文件:
- /etc/fail2ban/fail2ban.conf:主配置文件,定义全局设置(如日志级别)。通常不建议直接修改此文件。
- /etc/fail2ban/jail.conf:包含了所有预定义的监狱(Jail)配置和默认参数。同样不建议直接修改此文件,因为软件包更新时可能会覆盖您的更改。
- /etc/fail2ban/jail.d/目录:用于存放本地自定义配置。推荐在此目录下创建.local文件(如defaults-debian.local或自定义名称的.conf文件)来覆盖jail.conf中的默认设置或定义新的Jail。 .local文件的配置会优先于.conf文件。
- /etc/fail2ban/filter.d/目录:存放过滤规则(正则表达式)。
- /etc/fail2ban/action.d/目录:存放动作脚本。
3. 配置本地覆盖文件 (jail.local):
- 创建(或複製jail.conf为jail.local)并编辑/etc/fail2ban/jail.local文件。
- 全局设置([DEFAULT]段):Ini, TOML
[DEFAULT]
# 忽略的IP地址(白名单),可以是IP或CIDR,空格分隔。务必加入您自己的可信IP!
ignoreip = 127.0.0.1/8 ::1 YOUR_TRUSTED_IP1 YOUR_TRUSTED_IP2
# 禁止时间(秒),-1表示永久禁止
bantime = 1h # 禁止1小时
# 查找时间窗口(秒)
findtime = 10m # 在10分钟内查找失败次数
# 最大重试次数
maxretry = 5 # 失败5次触发禁止
# 后端(用于监控日志文件变化,通常自动检测)
# backend = auto
# 禁止动作,常见的有:
# %(action_)s 使用默认动作(通常是iptables-multiport)
# %(action_mw)s 禁止并发送带whois信息的邮件
# %(action_mwl)s 禁止并发送带whois和日志信息的邮件
# %(action_cf_api)s 使用Cloudflare API禁止 (需要额外配置)
# 推荐使用最简单的禁止动作,避免邮件通知过多
banaction = iptables-multiport # 或 firewallcmd-ipset / nftables-multiport
action = %(action_)s
# 发送邮件通知设置(可选)
destemail = your_email@example.com
sender = fail2ban@your_server_hostname
mta = sendmail
- 启用和配置特定的Jail:
- SSH防护(默认通常已启用,但需检查):Ini, TOML
[sshd]
enabled = true
port = ssh # 可以指定端口,如 port = 2222
# filter = sshd # 使用内置的sshd过滤规则
logpath = %(sshd_log)s # 通常是 /var/log/auth.log
maxretry = 3 # 可以为特定Jail覆盖默认值
bantime = 1d # SSH失败禁止1天
- Nginx HTTP认证防护(示例):Ini, TOML
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth # 内置过滤规则
logpath = /var/log/nginx/error.log # Nginx错误日志路径
maxretry = 6
- Nginx恶意脚本/爬虫防护(示例):Ini, TOML
[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots # 内置过滤规则
logpath = /var/log/nginx/access.log
maxretry = 2
[nginx-noscript]
enabled = true
port = http,https
filter = nginx-noscript # 内置过滤规则 (查找请求不存在的脚本)
logpath = /var/log/nginx/access.log
maxretry = 6
- WordPress登录防护(需要自定义或第三方filter):
- 需要创建一个filter.d/wordpress.conf文件,包含匹配WordPress登录失败日志的正则表达式。
- 在jail.local中定义一个[wordpress] Jail,指定enabled = true, filter = wordpress, logpath (指向Nginx/Apache访问日志或WP安全插件日志),以及port, maxretry, bantime。
4. 重启Fail2ban服务:Bash
sudo systemctl restart fail2ban
5. 验证与监控:
- 查看状态: sudo fail2ban-client status (查看已启用的Jail列表)
- 查看特定Jail状态: sudo fail2ban-client status sshd (查看sshd Jail的状态,包括当前被禁止的IP列表)
- 手动禁止IP: sudo fail2ban-client set sshd banip
- 手动解禁IP: sudo fail2ban-client set sshd unbanip
- 检查防火牆规则: 使用sudo iptables -L -n查看iptables规则,确认Fail2ban创建的链(如f2b-sshd)和禁止规则是否存在。
注意事项
- 白名单(ignoreip)至关重要: 务必将您自己固定、可信的IP地址加入白名单,否则可能因为输错密码把自己锁在外面。
- bantime设置: 禁止时间不宜过短(否则攻击者很快就能再次尝试),但也无需永久禁止(IP可能是动态的或被盗用的)。几小时到几天是常见设置。
- maxretry和findtime平衡: maxretry设置过低可能误伤正常输错密码的用户,过高则给攻击者太多尝试机会。findtime定义了统计失败次数的时间窗口。
- 日志路径准确性: logpath必须指向正确的日志文件。
- 过滤规则的准确性: 内置规则通常可用,自定义规则需要仔细编写正则表达式,避免误匹配。
- 防火牆动作兼容性: 确保banaction和action设置与您服务器使用的防火牆工具(iptables, nftables, firewalld)兼容。
在外网服务器上部署和配置Fail2ban是防御自动化暴力破解攻击的有效且基础的措施。通过仔细配置jail.local文件,启用对关键服务(如SSH、Web登录)的监控,并设置合理的禁止策略,可以显著提高服务器的安全性,减少被入侵的风险。
一万网络专业提供外网服务器租用/外网云服务器/外网服务器/外网vps/外网原生ip/外网虚拟主机/外网服务器地址(全国统一服务热线:4000-968-869)。
Copyright © 2013-2020 idc10000.net. All Rights Reserved. 一万网络 朗玥科技有限公司 版权所有 深圳市朗玥科技有限公司 粤ICP备07026347号
本网站的域名注册业务代理北京新网数码信息技术有限公司的产品