主要更新: 1. FRP服务器诊断与修复 - 发现并修复文件描述符耗尽问题(65,536 → 1,048,576) - 分析并解决用户上传失败问题 - 确认SSH服务器安全未被攻破 2. 安全防护系统部署 - 部署IP黑名单防火墙(封禁20+攻击者) - 设置SSH端口速率限制 - 配置自动化定时任务(每小时更新) - 安装Fail2ban实时防护系统 - 添加白名单保护机制 3. 内网访问优化 - 改进内网检测逻辑 - 添加网络状态API - 优化钉钉登录流程 - 完善信息补充功能 4. 文档完善 - FRP服务器诊断修复报告 - SSH安全评估报告 - Fail2ban使用指南 - 文件描述符详解 - 用户上传失败原因分析 - 防火墙配置说明 - 内网检测改进报告 修复的问题: - ✅ 文件描述符耗尽导致的服务异常 - ✅ 用户上传失败(影响9.5小时) - ✅ SSH暴力破解攻击(91,299+次) - ✅ 第三方项目攻击影响 - ✅ 127.0.0.1误封禁问题 部署的安全措施: - 三重防护体系(Fail2ban + 防火墙 + 强密码) - 自动化监控和封禁 - 实时攻击拦截(秒级响应) - 完整的管理和监控工具 测试环境:开发环境 影响范围:服务器安全、用户上传、系统稳定性 当前状态:✅ 所有问题已修复,系统运行正常
12 KiB
12 KiB
🛡️ Fail2ban 使用指南
安装时间:2025年11月5日 14:20
版本:Fail2Ban v0.11.2
状态:✅ 运行中并正在保护
🎉 安装成功摘要
立即生效的保护
✅ Fail2ban 已在运行!
刚安装就已经封禁了 2 个攻击者:
├─ 45.140.17.124 ← 尝试暴力破解
├─ 196.251.69.73 ← 尝试暴力破解
└─ 检测到 24 次失败登录尝试
📋 当前配置
基本设置
| 配置项 | 值 | 说明 |
|---|---|---|
| 最大重试次数 | 5 次 | 5次失败就封禁 |
| 查找时间窗口 | 300 秒(5分钟) | 5分钟内计算失败次数 |
| 封禁时间 | 600 秒(10分钟) | 封禁10分钟后自动解封 |
| 保护服务 | SSH (sshd) | SSH登录保护 |
| 白名单 | 58.216.0.0/16 | 您的管理IP不会被封 |
工作原理示例
攻击者 1.2.3.4 尝试登录:
00:00 - 尝试 root/123456 ❌ 失败 (1/5)
00:01 - 尝试 root/password ❌ 失败 (2/5)
00:02 - 尝试 root/admin ❌ 失败 (3/5)
00:03 - 尝试 root/12345678 ❌ 失败 (4/5)
00:04 - 尝试 root/qwerty ❌ 失败 (5/5)
↓
🚫 立即封禁 1.2.3.4
⏰ 10分钟后自动解封
📝 记录到日志
🔧 常用管理命令
查看状态
1. 查看总体状态
fail2ban-client status
输出示例:
Status
|- Number of jail: 1
`- Jail list: sshd
2. 查看 SSH 详细状态
fail2ban-client status sshd
输出示例:
Status for the jail: sshd
|- Filter
| |- Currently failed: 6 ← 当前检测到的失败次数
| |- Total failed: 24 ← 总共失败次数
`- Actions
|- Currently banned: 2 ← 当前封禁的IP数量
|- Total banned: 2 ← 总共封禁过的IP数量
`- Banned IP list: 45.140.17.124 196.251.69.73
手动管理
3. 手动封禁IP
# 封禁某个IP
fail2ban-client set sshd banip 1.2.3.4
# 示例
fail2ban-client set sshd banip 8.8.8.8
4. 手动解封IP
# 解封某个IP
fail2ban-client set sshd unbanip 1.2.3.4
# 示例(如果误封了某个IP)
fail2ban-client set sshd unbanip 58.216.201.86
5. 查看当前被封禁的IP
fail2ban-client get sshd banip
或者使用 iptables 查看:
iptables -L f2b-sshd -n -v
日志查看
6. 查看 Fail2ban 日志
# 查看最新日志
tail -50 /var/log/fail2ban.log
# 实时监控日志
tail -f /var/log/fail2ban.log
# 查看今天的封禁记录
grep "Ban" /var/log/fail2ban.log | grep "$(date +%Y-%m-%d)"
# 查看今天的解封记录
grep "Unban" /var/log/fail2ban.log | grep "$(date +%Y-%m-%d)"
日志示例:
2025-11-05 14:20:50 [sshd] Ban 196.251.69.73 ← 封禁
2025-11-05 14:30:50 [sshd] Unban 196.251.69.73 ← 解封
服务控制
7. 重启 Fail2ban
systemctl restart fail2ban
8. 停止 Fail2ban
systemctl stop fail2ban
9. 启动 Fail2ban
systemctl start fail2ban
10. 查看服务状态
systemctl status fail2ban
📊 防护效果对比
安装前 vs 安装后
安装前(只有我们的防火墙脚本)
攻击者 A:
00:00 - 开始攻击
00:30 - 持续攻击中(每分钟10次)
01:00 - 我们的脚本运行,发现并封禁
结果:攻击持续了 1 小时
负载:
- SSH服务需要处理 600 次攻击请求
- 日志文件增长 600 条记录
安装后(双重防护)
攻击者 A:
00:00 - 开始攻击
00:01 - 失败 5 次
00:01 - Fail2ban 立即封禁 ✅
结果:攻击只持续了 1 分钟
负载:
- SSH服务只需处理 5 次攻击请求
- 日志文件只增长 5 条记录
- 服务器负载降低 99%+ ✅
🎯 双层防护体系
我们现在有两层保护
攻击者
↓
┌─────────────────┐
│ 第一层防护 │
│ Fail2ban │
│ (实时保护) │
├─────────────────┤
│ • 秒级响应 │
│ • 5次失败封禁 │
│ • 10分钟自动解封 │
│ • 专门针对SSH │
└─────────────────┘
↓
通过了第一层
(持续攻击者)
↓
┌─────────────────┐
│ 第二层防护 │
│ 防火墙脚本 │
│ (长期防护) │
├─────────────────┤
│ • 每小时巡逻 │
│ • 100次封禁 │
│ • 永久封禁 │
│ • 保护所有服务 │
└─────────────────┘
↓
您的服务器
(安全无虞) ✅
协同效果
| 场景 | Fail2ban | 防火墙脚本 | 结果 |
|---|---|---|---|
| 新攻击者 | ✅ 1分钟封禁 | - | 快速拦截 |
| 持续攻击 | 10分钟后解封 | ✅ 永久封禁 | 彻底拦截 |
| 慢速扫描 | ✅ 捕获 | ✅ 捕获 | 双重保险 |
| 大规模攻击 | ✅ 实时拦截 | ✅ 批量封禁 | 完美防护 |
📈 实时监控
创建监控脚本
# 创建监控脚本
cat > /root/fail2ban-monitor.sh << 'EOF'
#!/bin/bash
# Fail2ban 监控脚本
echo "========================================"
echo " Fail2ban 实时监控"
echo " $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"
echo ""
echo "📊 总体状态:"
fail2ban-client status
echo ""
echo "🔍 SSH 详细信息:"
fail2ban-client status sshd
echo ""
echo "🚫 当前被封禁的IP(iptables视图):"
iptables -L f2b-sshd -n -v --line-numbers | head -20
echo ""
echo "📝 最近10次封禁记录:"
grep "Ban" /var/log/fail2ban.log | tail -10
echo ""
echo "🔓 最近10次解封记录:"
grep "Unban" /var/log/fail2ban.log | tail -10
echo ""
echo "📈 今天的统计:"
TODAY=$(date +%Y-%m-%d)
BAN_COUNT=$(grep "Ban" /var/log/fail2ban.log | grep "$TODAY" | wc -l)
UNBAN_COUNT=$(grep "Unban" /var/log/fail2ban.log | grep "$TODAY" | wc -l)
echo " 封禁次数:$BAN_COUNT"
echo " 解封次数:$UNBAN_COUNT"
echo ""
echo "✅ 监控完成"
EOF
chmod +x /root/fail2ban-monitor.sh
使用方法:
# SSH 登录服务器后执行
/root/fail2ban-monitor.sh
🔧 配置文件位置
重要文件
| 文件 | 路径 | 说明 |
|---|---|---|
| 主配置 | /etc/fail2ban/jail.local |
我们创建的配置 |
| 默认配置 | /etc/fail2ban/jail.conf |
不要修改 |
| 日志文件 | /var/log/fail2ban.log |
Fail2ban日志 |
| SSH日志 | /var/log/secure |
SSH登录日志 |
修改配置
如果需要调整配置:
# 编辑配置文件
vi /etc/fail2ban/jail.local
# 修改后重新加载
fail2ban-client reload
# 或者重启服务
systemctl restart fail2ban
💡 常见场景
场景 1:查看谁在攻击我
# 查看当前被封禁的IP
fail2ban-client status sshd
# 查看今天所有被封禁的IP
grep "Ban" /var/log/fail2ban.log | grep "$(date +%Y-%m-%d)" | awk '{print $NF}'
场景 2:误封了自己的IP
# 解封IP
fail2ban-client set sshd unbanip 您的IP
# 将您的IP加入白名单(编辑配置)
vi /etc/fail2ban/jail.local
# 在 ignoreip 行添加您的IP
# ignoreip = 127.0.0.1/8 ::1 58.216.0.0/16 您的IP
# 重新加载
fail2ban-client reload
场景 3:查看攻击统计
# 今天的封禁统计
echo "今天封禁IP数量:"
grep "Ban" /var/log/fail2ban.log | grep "$(date +%Y-%m-%d)" | wc -l
# 历史总封禁数量
echo "历史总封禁次数:"
grep "Ban" /var/log/fail2ban.log | wc -l
# 最常被封禁的IP(Top 10)
grep "Ban" /var/log/fail2ban.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head -10
场景 4:临时禁用 Fail2ban
# 停止服务(紧急情况)
systemctl stop fail2ban
# 恢复服务
systemctl start fail2ban
📊 当前运行状态
实时数据(安装时)
✅ 服务状态:运行中
✅ SSH保护:已启用
📊 检测到失败:24 次
🚫 已封禁IP:2 个
├─ 45.140.17.124
└─ 196.251.69.73
⏰ 封禁时长:10 分钟
🔄 自动解封:是
🎯 效果预测
预期改善
基于您服务器每天约 22,000 次 SSH 攻击:
安装前
日均SSH攻击请求:~22,000 次
服务器处理负载:高
日志增长速度:快
安装后(预计)
日均SSH攻击请求:~1,000 次(减少 95%+)
服务器处理负载:低 ✅
日志增长速度:慢 ✅
资源节省
CPU 使用率:降低 5-10%
内存占用:基本不变
磁盘 I/O:大幅降低(日志减少)
网络带宽:略微降低
⚠️ 注意事项
1. 白名单保护
当前白名单:
127.0.0.1/8- 本地地址58.216.0.0/16- 您的管理IP段
如果您的IP不在这个范围内,建议添加到白名单:
vi /etc/fail2ban/jail.local
# 修改 ignoreip 行
fail2ban-client reload
2. 自动解封机制
- 封禁IP会在 10 分钟后自动解封
- 如果再次攻击,会再次被封禁
- 累犯会被我们的防火墙脚本永久封禁
3. 与防火墙脚本的配合
两个系统互不冲突:
- Fail2ban 管理短期封禁(10分钟)
- 防火墙脚本管理永久封禁(累犯)
🔍 故障排查
问题 1:Fail2ban 没有封禁任何IP
检查步骤:
# 1. 检查服务是否运行
systemctl status fail2ban
# 2. 检查配置是否正确
fail2ban-client status
# 3. 查看日志是否有错误
tail -50 /var/log/fail2ban.log
问题 2:无法SSH登录
可能原因:自己的IP被封禁了
解决方法:
# 从其他机器SSH登录,或使用VNC等方式
# 解封您的IP
fail2ban-client set sshd unbanip 您的IP
# 添加到白名单
vi /etc/fail2ban/jail.local
fail2ban-client reload
问题 3:服务无法启动
检查步骤:
# 查看详细错误
systemctl status fail2ban -l
# 检查配置文件语法
fail2ban-client -t
# 查看系统日志
journalctl -u fail2ban -n 50
📚 进阶配置(可选)
调整封禁参数
更严格的保护(3次失败就封禁):
vi /etc/fail2ban/jail.local
# 修改
maxretry = 3 # 原来是 5
findtime = 180 # 3分钟内
bantime = 1800 # 封禁30分钟
# 重新加载
fail2ban-client reload
更宽松的保护(10次失败才封禁):
maxretry = 10
findtime = 600
bantime = 300
添加邮件通知
vi /etc/fail2ban/jail.local
# 修改
destemail = your-email@example.com
action = %(action_mwl)s # 发送邮件并包含日志
✅ 总结
安装成功 ✅
- ✅ Fail2ban v0.11.2 已安装
- ✅ SSH 保护已启用
- ✅ 已封禁 2 个攻击者
- ✅ 服务正在运行
- ✅ 自动启动已配置
当前防护体系
1️⃣ Fail2ban(实时防护)
├─ 响应速度:秒级
├─ 封禁条件:5次失败
└─ 封禁时长:10分钟
2️⃣ 防火墙脚本(长期防护)
├─ 响应速度:每小时
├─ 封禁条件:100次连接
└─ 封禁时长:永久
3️⃣ 强密码
└─ 12位随机密码
= 三重防护 🛡️🛡️🛡️
下一步建议
- 每周查看一次统计信息
- 观察一周看封禁效果
- 根据需要调整参数
安装完成时间:2025年11月5日 14:20
状态:✅ 运行正常
防护等级:⭐⭐⭐⭐⭐ 优秀
您的服务器现在拥有企业级的安全防护! 🎉