香港服务器使用Fail2ban防止SSH暴力破解,提升服务器安全

在香港服务器运维中,SSH暴力破解是最常见的安全威胁之一。攻击者通过自动化工具尝试大量用户名和密码组合,一旦成功就能完全控制服务器。Fail2ban作为一款轻量级的安全工具···

香港服务器运维中,SSH暴力破解是最常见的安全威胁之一。攻击者通过自动化工具尝试大量用户名和密码组合,一旦成功就能完全控制服务器。Fail2ban作为一款轻量级的安全工具,能够有效防范这类攻击,大幅提升服务器安全性。

一、Fail2ban工作原理与核心价值

Fail2ban的工作机制:

  • 实时监控系统日志文件(如/var/log/auth.log、/var/log/secure)

  • 使用正则表达式分析登录失败记录

  • 检测到异常行为后,自动修改防火墙规则封禁IP

  • 可配置的封禁时间,期满后自动解封

核心优势:

  • 自动化防御:无需人工干预,24小时自动防护

  • 灵活配置:支持自定义检测规则和封禁策略

  • 资源占用少:基于日志分析,对系统性能影响极小

  • 多服务支持:不仅保护SSH,还可防护FTP、HTTP等服务

  • 实时响应:发现攻击立即响应,减少攻击窗口期

二、Fail2ban安装与基础配置

安装Fail2ban:

Ubuntu/Debian系统:

bash

sudo apt updatesudo apt install fail2ban

CentOS/RHEL系统:

bash

sudo yum install epel-releasesudo yum install fail2ban# 或者使用dnfsudo dnf install fail2ban

启动并设置开机自启:

bash

# 启动服务sudo systemctl start fail2ban# 设置开机自启sudo systemctl enable fail2ban# 检查服务状态sudo systemctl status fail2ban# 查看Fail2ban版本fail2ban-client --version

三、SSH防护基础配置

Fail2ban的配置文件主要位于两个位置:

  • /etc/fail2ban/jail.conf - 主配置文件(不建议直接修改)

  • /etc/fail2ban/jail.local - 用户自定义配置(推荐使用)

创建基础SSH防护配置:

bash

# 复制默认配置作为自定义配置基础sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local# 编辑自定义配置sudo nano /etc/fail2ban/jail.local

配置SSH防护参数:

ini

[DEFAULT]# 全局配置bantime = 3600           # 封禁时长(秒),1小时findtime = 600           # 检测时间窗口(秒),10分钟内maxretry = 5             # 最大失败次数banaction = iptables-multiport  # 使用iptables进行封禁backend = auto           # 自动检测日志后端# 邮件通知配置(可选)destemail = admin@yourdomain.comsender = fail2ban@yourdomain.commta = sendmailaction = %(action_mwl)s  # 封禁并发送邮件通知[sshd]# SSH服务防护配置enabled = trueport = sshfilter = sshdlogpath = /var/log/auth.logmaxretry = 3             # SSH专用:3次失败即封禁bantime = 86400          # SSH专用:封禁24小时findtime = 300           # SSH专用:5分钟内ignoreip = 127.0.0.1/8   # 忽略本地回环地址

针对不同系统的日志路径配置:

Ubuntu/Debian:

ini

[sshd]enabled = trueport = sshfilter = sshdlogpath = /var/log/auth.log

CentOS/RHEL:

ini

[sshd]enabled = trueport = sshfilter = sshdlogpath = /var/log/secure

重启服务应用配置:

bash

# 重启Fail2ban服务sudo systemctl restart fail2ban# 检查服务状态sudo systemctl status fail2ban# 查看启用的jailsudo fail2ban-client status

四、高级防护策略配置

多层级防护策略:

ini

[sshd]# 基础防护enabled = trueport = sshfilter = sshdlogpath = /var/log/auth.logmaxretry = 3bantime = 3600           # 第一次封禁1小时[sshd-ddos]# DDoS攻击防护(频繁连接)enabled = truefilter = sshd-ddoslogpath = /var/log/auth.logmaxretry = 10            # 10分钟内findtime = 600bantime = 86400          # 封禁24小时[sshd-longterm]# 长期攻击者防护enabled = truefilter = sshdlogpath = /var/log/auth.logmaxretry = 15            # 24小时内findtime = 86400bantime = 604800         # 封禁一周

自定义过滤器规则:

创建自定义SSH过滤器:

bash

sudo nano /etc/fail2ban/filter.d/sshd-custom.conf

内容如下:

ini

[Definition]# 匹配密码失败failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from <HOST>$
            ^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>$
            ^%(__prefix_line)sFailed password for .* from <HOST> port \d+ ssh2$
            ^%(__prefix_line)sFailed password for invalid user .* from <HOST> port \d+ ssh2$
            ^%(__prefix_line)sReceived disconnect from <HOST>: 3: .*: Auth fail$
            ^%(__prefix_line)sConnection closed by authenticating user .* <HOST> port \d+ \[preauth\]$            
# 忽略规则(避免误封)ignoreregex =[Init]# 日志行前缀(根据系统调整)__prefix_line = \S+ \S+ \S+

五、白名单配置策略

配置信任IP白名单:

ini

[DEFAULT]# 忽略本地网络和信任IPignoreip = 127.0.0.1/8 ::1
           192.168.1.0/24
           10.0.0.0/8
           172.16.0.0/12# 添加办公室IP或VPN IP
           203.0.113.15
           198.51.100.23[sshd]# SSH专用白名单(覆盖全局设置)ignoreip = 127.0.0.1/8 ::1 192.168.1.100 192.168.1.101

动态白名单管理:

bash

# 临时添加IP到白名单sudo fail2ban-client set sshd addignoreip 192.168.1.200# 从白名单移除IPsudo fail2ban-client set sshd delignoreip 192.168.1.200# 查看当前白名单sudo fail2ban-client get sshd ignoreip

六、实时监控与状态检查

查看当前封禁状态:

bash

# 查看所有jail状态sudo fail2ban-client status# 查看SSH jail详细状态sudo fail2ban-client status sshd# 查看被封禁的IP列表sudo fail2ban-client status sshd# 查看详细的jail配置sudo fail2ban-client get sshd maxretrysudo fail2ban-client get sshd bantime

手动管理封禁IP:

bash

# 手动封禁IPsudo fail2ban-client set sshd banip 192.168.1.100# 手动解封IPsudo fail2ban-client set sshd unbanip 192.168.1.100# 解封所有IPsudo fail2ban-client set sshd unbanip --all# 查看特定IP的状态sudo fail2ban-client status sshd | grep 192.168.1.100

日志文件监控:

bash

# 实时查看Fail2ban日志sudo tail -f /var/log/fail2ban.log# 查看详细的封禁记录sudo grep "Ban" /var/log/fail2ban.log# 统计封禁数量sudo grep "Ban" /var/log/fail2ban.log | wc -l# 查看最近的活动sudo tail -f /var/log/fail2ban.log | grep -E "(WARNING|ERROR|Ban|Unban)"

七、性能优化配置

调整检测参数避免资源消耗:

ini

[DEFAULT]# 性能优化配置dbpurgeage = 86400       # 清理1天前的数据库记录# 日志检测间隔findtime = 300           # 5分钟检测窗口maxretry = 3             # 减少重试次数# 内存优化usedns = warn            # 减少DNS查询# 数据库优化dbfile = :memory:        # 使用内存数据库(重启后丢失)# 或者dbfile = /var/lib/fail2ban/fail2ban.sqlite3

针对高流量服务器优化:

ini

[sshd]# 高并发环境优化maxretry = 5findtime = 300bantime = 1800action = iptables-multiport[name=sshd, port="ssh", protocol=tcp]# 减少日志扫描频率maxlines = 100

八、邮件通知与报警配置

配置邮件报警:

ini

[DEFAULT]# 邮件通知配置destemail = security@yourcompany.comsender = fail2ban-alert@yourserver.commta = sendmailaction = %(action_mwl)s[sshd]# 详细邮件通知action = iptables-multiport[name=sshd, port="ssh"]
         sendmail-whois-lines[name=sshd, logpath=/var/log/auth.log]

自定义邮件模板:

bash

sudo nano /etc/fail2ban/action.d/sendmail-common.local

内容如下:

ini

[Definition]actionstart = actionstop = actioncheck = actionban = printf %%b "Hi,\n
            The IP <ip> has just been banned by Fail2ban after
            <failures> attempts against <name>.\n\n
            Here are more information about <ip>:\n
            `whois <ip>`\n\n
            Regards,\n
            Fail2ban" | /usr/bin/mail -s "[Fail2ban] <name>: banned <ip>" <dest>actionunban =

Telegram报警配置:

bash

sudo nano /etc/fail2ban/action.d/telegram.conf

内容如下:

ini

[Definition]actionstart = actionstop = actioncheck = actionban = curl -s -X POST "https://api.telegram.org/bot<YOUR_BOT_TOKEN>/sendMessage" \
             -d chat_id=<YOUR_CHAT_ID> \
             -d text="🚨 Fail2ban Alert: IP <ip> banned for <name> after <failures> attempts"actionunban =

九、集成防火墙配置

UFW集成配置:

ini

[sshd]enabled = trueport = sshfilter = sshdlogpath = /var/log/auth.logmaxretry = 3bantime = 3600action = ufw[name=SSH, port=ssh, protocol=tcp]

firewalld集成配置(CentOS/RHEL):

ini

[sshd]enabled = trueport = sshfilter = sshdlogpath = /var/log/securemaxretry = 3bantime = 3600action = firewallcmd-ipset[name=sshd, port="ssh", protocol=tcp]

十、故障排查与调试

常见问题诊断:

  1. 服务启动失败:

bash

# 检查配置文件语法sudo fail2ban-client -t# 查看详细错误信息sudo journalctl -u fail2ban -f# 调试模式启动sudo fail2ban-server -xf start

  1. 封禁不生效:

bash

# 检查iptables规则sudo iptables -L -n# 测试过滤器规则sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf# 检查日志文件权限sudo ls -la /var/log/auth.log

  1. 日志文件权限问题:

bash

# 检查日志文件权限sudo ls -la /var/log/auth.log# 确保fail2ban用户可以读取日志sudo usermod -a -G systemd-journal fail2ban# 检查AppArmor/SELinux限制sudo aa-statussudo getenforce

调试脚本示例:

bash

#!/bin/bash# fail2ban-debug.shecho "=== Fail2ban Debug Information ==="echo "时间: $(date)"echo ""echo "1. Fail2ban服务状态:"sudo systemctl status fail2ban --no-pager -lecho ""echo "2. 启用的Jail:"sudo fail2ban-client statusecho ""echo "3. SSH Jail状态:"sudo fail2ban-client status sshdecho ""echo "4. 最近封禁记录:"sudo grep "Ban" /var/log/fail2ban.log | tail -10echo ""echo "5. 防火墙规则:"sudo iptables -L -n | grep -E "(f2b|fail2ban)"echo ""echo "6. 系统日志检查:"sudo tail -20 /var/log/auth.log | grep -E "(Failed|Failure|Invalid)"echo ""echo "调试信息收集完成"

十一、定期维护任务

日志轮转配置:

bash

sudo nano /etc/logrotate.d/fail2ban

内容如下:

text

/var/log/fail2ban.log {
    weekly
    missingok
    rotate 4
    compress
    delaycompress
    notifempty
    postrotate
        systemctl reload fail2ban > /dev/null 2>&1 || true
    endscript
}

数据库清理:

bash

# 手动清理旧数据库记录sudo fail2ban-client set sshd dbfilepurge# 通过cron定期清理echo "0 3 * * * root /usr/bin/fail2ban-client set sshd dbfilepurge" | sudo tee /etc/cron.d/fail2ban-cleanup

监控脚本:

bash

#!/bin/bash# fail2ban-monitor.shINTERFACE="wg0"LOG_FILE="/var/log/fail2ban-monitor.log"echo "$(date): Fail2ban Status Check" >> $LOG_FILE# 检查服务状态if systemctl is-active --quiet fail2ban; then
    echo "Fail2ban服务运行正常" >> $LOG_FILEelse
    echo "ALERT: Fail2ban服务未运行" >> $LOG_FILE
    sudo systemctl start fail2banfi# 检查封禁数量BAN_COUNT=$(sudo fail2ban-client status sshd | grep "Currently banned" | awk '{print $4}')echo "当前封禁IP数量: $BAN_COUNT" >> $LOG_FILE# 检查日志文件大小LOG_SIZE=$(du -h /var/log/fail2ban.log | awk '{print $1}')echo "日志文件大小: $LOG_SIZE" >> $LOG_FILE

十二、安全最佳实践

SSH基础安全加固:

bash

# 修改SSH默认端口sudo nano /etc/ssh/sshd_config# 添加:Port 2222# 禁用root登录# 添加:PermitRootLogin no# 使用密钥认证# 添加:PasswordAuthentication no# 限制用户登录# 添加:AllowUsers your_username# 重启SSH服务sudo systemctl restart sshd

Fail2ban安全配置建议:

  1. 定期备份配置:

bash

#!/bin/bash# fail2ban-backup.shBACKUP_DIR="/backup/fail2ban/$(date +%Y%m%d)"mkdir -p $BACKUP_DIRsudo cp -r /etc/fail2ban $BACKUP_DIR/sudo cp /var/lib/fail2ban/fail2ban.sqlite3 $BACKUP_DIR/ 2>/dev/null || truetar -czf $BACKUP_DIR.tar.gz $BACKUP_DIRecho "备份完成: $BACKUP_DIR.tar.gz"

  1. 监控Fail2ban自身:

bash

# 创建监控脚本sudo nano /etc/fail2ban/check-status.sh

  1. 定期更新规则:

bash

# 关注安全更新#!/bin/bashcd /etc/fail2ban && git pull origin master
systemctl reload fail2ban

十三、实战案例配置

企业级SSH防护配置:

ini

[DEFAULT]# 企业全局配置bantime = 86400findtime = 1800maxretry = 3ignoreip = 10.0.0.0/8 192.168.0.0/16destemail = security-team@company.comaction = %(action_mwl)s[sshd]enabled = trueport = 2222filter = sshdlogpath = /var/log/securemaxretry = 2bantime = 2592000  # 30天封禁findtime = 600[sshd-ddos]enabled = truefilter = sshdlogpath = /var/log/securemaxretry = 10findtime = 300bantime = 3600[sshd-aggressive]enabled = truefilter = sshd-aggressivelogpath = /var/log/securemaxretry = 20findtime = 3600bantime = 604800  # 一周封禁

总结

Fail2ban是服务器安全防护中不可或缺的工具,通过智能分析日志和自动封禁恶意IP,有效抵御SSH暴力破解攻击。正确配置和维护Fail2ban可以:

  • 大幅减少成功攻击的概率

  • 自动化安全防护,减少人工干预

  • 提供详细的安全事件记录

  • 与其他安全工具良好集成

关键实施要点:

  1. 根据业务需求调整封禁策略

  2. 合理配置白名单避免误封

  3. 设置适当的监控和报警机制

  4. 定期审查和优化配置规则

  5. 结合其他安全措施形成纵深防御

进阶建议:

  • 结合入侵检测系统(IDS)增强防护

  • 集成SIEM系统进行集中日志分析

  • 配置自动化响应和修复流程

  • 定期进行安全审计和渗透测试

通过本文的详细指南,你可以建立起一个坚固的SSH防护体系,让服务器在面对暴力破解攻击时具备强大的自我防御能力。记住,安全是一个持续的过程,定期更新和维护才能确保长期有效防护。

生成文章图片 (38).jpg

您好:云优数据云计算 www.yunyoushuju.cn 2核2G6M最低19.9元/月 欢迎开机

发表评论

评论列表
未查询到任何数据!