主要更新: 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 + 防火墙 + 强密码) - 自动化监控和封禁 - 实时攻击拦截(秒级响应) - 完整的管理和监控工具 测试环境:开发环境 影响范围:服务器安全、用户上传、系统稳定性 当前状态:✅ 所有问题已修复,系统运行正常
127 lines
3.8 KiB
Bash
Executable File
127 lines
3.8 KiB
Bash
Executable File
#!/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
|
||
|