gongxiangp2/check-frps-health.sh
chenpei 383772d39f 🛡️ 服务器安全加固和FRP问题修复
主要更新:
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 + 防火墙 + 强密码)
- 自动化监控和封禁
- 实时攻击拦截(秒级响应)
- 完整的管理和监控工具

测试环境:开发环境
影响范围:服务器安全、用户上传、系统稳定性
当前状态:✅ 所有问题已修复,系统运行正常
2025-11-06 13:42:36 +08:00

127 lines
3.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# FRP服务器健康检查脚本
# 用途:检查文件描述符使用情况,防止再次出现 "too many open files" 错误
# 使用方法:./check-frps-health.sh
echo "========================================"
echo " FRP 服务器健康检查"
echo " 检查时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"
echo ""
# 服务器信息
SERVER_IP="180.97.221.140"
SERVER_USER="root"
SERVER_PASS="NEjoy4h8B9Fa"
# 检查 sshpass 是否可用
if ! command -v sshpass &> /dev/null; then
echo "❌ 错误:需要安装 sshpass 工具"
echo "Mac安装:brew install sshpass"
echo "Linux安装:sudo apt-get install sshpass 或 sudo yum install sshpass"
exit 1
fi
# 连接服务器并执行检查
sshpass -p "$SERVER_PASS" ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no "$SERVER_USER@$SERVER_IP" << 'ENDSSH'
# 检查 FRP 进程是否运行
PROCESS_ID=$(pgrep frps)
if [ -z "$PROCESS_ID" ]; then
echo "❌ 错误:FRP服务未运行!"
echo ""
echo "请手动启动服务:"
echo " systemctl start frps"
exit 1
fi
echo "✅ FRP 服务正在运行(进程 ID: $PROCESS_ID)"
echo ""
# 检查服务状态
echo "📊 服务状态:"
systemctl status frps --no-pager -l | grep -E "(Active|Main PID|Memory)" | sed 's/^/ /'
echo ""
# 检查文件描述符使用情况
FD_LIMIT=$(cat /proc/$PROCESS_ID/limits | grep "Max open files" | awk '{print $4}')
FD_CURRENT=$(ls /proc/$PROCESS_ID/fd 2>/dev/null | wc -l)
FD_PERCENT=$((FD_CURRENT * 100 / FD_LIMIT))
echo "📁 文件描述符使用情况:"
echo " 当前打开:$FD_CURRENT"
echo " 系统限制:$FD_LIMIT"
echo " 使用率:$FD_PERCENT%"
echo ""
# 健康评估
if [ $FD_PERCENT -lt 50 ]; then
echo "✅ 健康状态:优秀(使用率低于50%)"
elif [ $FD_PERCENT -lt 80 ]; then
echo "⚠️ 健康状态:良好(使用率 $FD_PERCENT%)"
else
echo "🚨 警告:使用率过高($FD_PERCENT%)!"
echo " 建议检查是否有异常连接或考虑重启服务"
fi
echo ""
# 检查端口监听状态
echo "🔌 关键端口监听状态:"
PORTS=("7000:FRP主端口" "2320:youyidian-3d" "2322:NAS-SSH")
for port_info in "${PORTS[@]}"; do
port="${port_info%%:*}"
desc="${port_info##*:}"
if netstat -tlnp 2>/dev/null | grep -q ":$port "; then
echo " ✅ $port ($desc)"
else
echo " ❌ $port ($desc) - 未监听"
fi
done
echo ""
# 检查最近的错误
echo "🔍 最近的日志错误(最近100行):"
ERROR_COUNT=$(tail -100 /var/log/frps.log | grep -iE "error|fail" | wc -l)
if [ $ERROR_COUNT -eq 0 ]; then
echo " ✅ 未发现错误"
else
echo " ⚠️ 发现 $ERROR_COUNT 条错误:"
tail -100 /var/log/frps.log | grep -iE "error|fail" | tail -5 | sed 's/^/ /'
fi
echo ""
# 检查客户端连接
echo "👥 最近连接的客户端(最近10个):"
tail -200 /var/log/frps.log | grep "client login" | tail -5 | while read line; do
timestamp=$(echo "$line" | awk '{print $1, $2}')
client_id=$(echo "$line" | grep -oP '\[.*?\]' | head -1)
client_ip=$(echo "$line" | grep -oP 'ip \[.*?\]' | cut -d'[' -f2 | cut -d']' -f1)
echo " 📱 $timestamp - $client_ip $client_id"
done
echo ""
# 检查活跃的代理
echo "🔄 当前活跃的代理服务:"
tail -200 /var/log/frps.log | grep "new proxy" | awk '{print $(NF-4), $(NF-2)}' | sort -u | while read proxy_name proxy_type; do
echo " 🔗 $proxy_name ($proxy_type)"
done
echo ""
echo "========================================"
echo "检查完成!"
echo "========================================"
ENDSSH
if [ $? -eq 0 ]; then
echo ""
echo "✅ 远程检查完成"
else
echo ""
echo "❌ 连接失败,请检查:"
echo " 1. 服务器 IP 是否正确"
echo " 2. 网络连接是否正常"
echo " 3. 服务器密码是否正确"
fi