mirror of
https://github.com/hotyue/IP-Sentinel.git
synced 2026-06-04 16:29:34 +08:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
862de2e49e | ||
|
|
26e3fd435d | ||
|
|
e279fc6e38 | ||
|
|
acff304a35 | ||
|
|
9fe39fc274 | ||
|
|
9eccace3bc | ||
|
|
cf410fce61 | ||
|
|
0ffb173bb5 | ||
|
|
edd6425fe5 |
11
README.md
11
README.md
@@ -8,7 +8,7 @@
|
||||
|
||||
📢 官方战术交流频道: 🛰️ [IP-Sentinel Matrix](https://t.me/IP_Sentinel_Matrix)
|
||||
|
||||
专为解决 VPS IPv4 被 Google 等数据库错误定位到中国大陆/香港(俗称“送中”)等问题而生。IP-Sentinel 已从单机脚本全面跃升为 **Master-Agent 分布式架构**。它像影子一样潜伏在全球各地的服务器后台,通过高度拟真的真实用户行为为你默默积累 IP 权重,并允许你通过 Telegram 随时随地对整个舰队进行毫秒级“点名”与“遥控”。
|
||||
专为解决 VPS IP 被 Google 等数据库错误定位到中国大陆/香港(俗称“送中”)等问题而生。IP-Sentinel 已从单机脚本全面跃升为 **Master-Agent 分布式架构**。它像影子一样潜伏在全球各地的服务器后台,通过高度拟真的真实用户行为为你默默积累 IP 权重,并允许你通过 Telegram 随时随地对整个舰队进行毫秒级“点名”与“遥控”。
|
||||
|
||||
## ✨ 核心极客特性
|
||||
|
||||
@@ -78,6 +78,15 @@ bash /opt/ip_sentinel/core/uninstall.sh
|
||||
|
||||
```
|
||||
|
||||
### 🧓 传家宝老旧系统专用通道 (Debian 9)
|
||||
|
||||
如果你的小鸡系统版本过低(如 Debian 9),由于官方 APT 源已关闭且 Python 版本过旧,无法使用主线版本,请使用 **Legacy 兼容分支** 部署。
|
||||
*(注意:该分支仅作基础维护,不享受新功能迭代,请尽可能升级你的系统)*
|
||||
|
||||
```bash
|
||||
bash <(curl -sL https://raw.githubusercontent.com/hotyue/IP-Sentinel/legacy/core/install.sh)
|
||||
```
|
||||
|
||||
📡 战术联络 (Community)
|
||||
如果你在使用过程中遇到任何疑难杂症,或者想围观大佬们的养护战报,欢迎加入我们的基地:
|
||||
- Telegram 频道: [@IP_Sentinel_Matrix](https://t.me/IP_Sentinel_Matrix)
|
||||
|
||||
@@ -127,8 +127,20 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
|
||||
|
||||
# ================== 路由分发 (恢复为安全的精确匹配) ==================
|
||||
|
||||
# 路由 0: 全局统筹调度 (处理 /trigger_run 一键全节点维护)
|
||||
if req_path == '/trigger_run':
|
||||
if os.path.exists('/opt/ip_sentinel/core/runner.sh'):
|
||||
self.send_response(200)
|
||||
self.send_header("Content-type", "text/plain")
|
||||
self.end_headers()
|
||||
self.wfile.write(b"Action Accepted: runner\n")
|
||||
subprocess.Popen(['bash', '/opt/ip_sentinel/core/runner.sh'])
|
||||
else:
|
||||
self.send_response(404)
|
||||
self.end_headers()
|
||||
|
||||
# 路由 1: Google 区域纠偏
|
||||
if req_path == '/trigger_google' or req_path == '/trigger_run':
|
||||
elif req_path == '/trigger_google':
|
||||
if os.path.exists('/opt/ip_sentinel/core/mod_google.sh'):
|
||||
self.send_response(200)
|
||||
self.send_header("Content-type", "text/plain")
|
||||
|
||||
@@ -88,7 +88,7 @@ for ((i=1; i<=TOTAL_ACTIONS; i++)); do
|
||||
;;
|
||||
3) # 地图坐标查询
|
||||
CODE=$(curl -${IP_PREF:-4} -m 15 -s -o /dev/null -w "%{http_code}" -A "$SESSION_UA" \
|
||||
"https://www.google.com/maps/search/${ENCODED_KEY}/@${ACTION_LAT},${ACTION_LON},17z?${LANG_PARAMS}")
|
||||
"https://www.google.com/maps/search/$${ENCODED_KEY}/@${ACTION_LAT},${ACTION_LON},17z?${LANG_PARAMS}")
|
||||
;;
|
||||
4) # 触发移动端系统底层位置检测像素
|
||||
CODE=$(curl -${IP_PREF:-4} -m 10 -s -o /dev/null -w "%{http_code}" -A "$SESSION_UA" \
|
||||
@@ -107,16 +107,33 @@ for ((i=1; i<=TOTAL_ACTIONS; i++)); do
|
||||
fi
|
||||
done
|
||||
|
||||
# --- [结果纠偏自检] ---
|
||||
# 去掉所有语言参数,进行一次最干净的直连测试 (强制遵循锚点协议)
|
||||
# --- [结果纠偏自检 (V3.1.4 绝对精准提取版)] ---
|
||||
FINAL_URL=$(curl -${IP_PREF:-4} -m 15 -s -L -o /dev/null -w "%{url_effective}" https://www.google.com)
|
||||
|
||||
if [[ "$FINAL_URL" == *"$VALID_URL_SUFFIX"* ]]; then
|
||||
STATUS="✅ 目标区域达成 ($VALID_URL_SUFFIX)"
|
||||
elif [[ "$FINAL_URL" == *"google.com.hk"* ]]; then
|
||||
STATUS="❌ 判定为送中区 (CN/HK)"
|
||||
# 核心战术:利用 awk 精准提取最终 URL 的域名部分,再剔除 "www.google." 前缀,得到纯粹的后缀
|
||||
# 例如: https://www.google.com.hk/?... -> 提取为 "com.hk"
|
||||
ACTUAL_DOMAIN=$(echo "$FINAL_URL" | awk -F/ '{print $3}')
|
||||
ACTUAL_SUFFIX=${ACTUAL_DOMAIN#www.google.}
|
||||
|
||||
# 1. 优先验证:绝对匹配目标后缀 (彻底杜绝 com 包含于 com.hk 的陷阱)
|
||||
if [ "$ACTUAL_SUFFIX" == "$VALID_URL_SUFFIX" ]; then
|
||||
STATUS="✅ 目标区域达成 ($ACTUAL_SUFFIX)"
|
||||
|
||||
# 2. 核心拦截:精准捕捉送中特征 (com.hk)
|
||||
elif [ "$ACTUAL_SUFFIX" == "com.hk" ]; then
|
||||
if [ "$REGION_CODE" == "HK" ]; then
|
||||
STATUS="✅ 目标区域达成 (HK 专属 com.hk)"
|
||||
else
|
||||
STATUS="❌ 严重漂移!判定为送中区 (实际跳往 $ACTUAL_SUFFIX)"
|
||||
fi
|
||||
|
||||
# 3. 宽容处理:遵守 Google 无跳转新规 (严格限定必须是纯粹的 com,绝不能是 com.xx)
|
||||
elif [ "$ACTUAL_SUFFIX" == "com" ]; then
|
||||
STATUS="🌐 保持通用主站 (留在 .com,受 Google 无跳转新规影响)"
|
||||
|
||||
# 4. 跨区漂移:所有预判之外的后缀,全部视为异常
|
||||
else
|
||||
STATUS="⚠️ 其他分站跳板 ($FINAL_URL)"
|
||||
STATUS="⚠️ 跨区跳板漂移 (当前实际归属: $ACTUAL_SUFFIX)"
|
||||
fi
|
||||
|
||||
log "$MODULE_NAME" "SCORE" "自检结论: $STATUS"
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ==========================================================
|
||||
# 脚本名称: mod_trust.sh (IP 信用净化模块 V2.0 数据解耦版)
|
||||
# 核心功能: 动态读取云端/本地 JSON 规则池,模拟访问高权重网站稀释恶意流量
|
||||
# 脚本名称: mod_trust.sh (IP 信用净化模块 V3.1.4 拓扑自适应版)
|
||||
# 核心功能: 动态扫描本地 LBS 冷数据,提取权威白名单,执行流量净化
|
||||
# ==========================================================
|
||||
|
||||
INSTALL_DIR="/opt/ip_sentinel"
|
||||
CONFIG_FILE="${INSTALL_DIR}/config.conf"
|
||||
UA_FILE="${INSTALL_DIR}/data/user_agents.txt"
|
||||
REPO_RAW_URL="https://git.94211762.xyz/hotyue/IP-Sentinel/raw/branch/main"
|
||||
# 你的 GitHub 仓库 Raw 数据直链前缀
|
||||
REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/main"
|
||||
# 临时改为私库地址用于测试
|
||||
# REPO_RAW_URL="https://git.94211762.xyz/hotyue/IP-Sentinel/raw/branch/main"
|
||||
|
||||
# 1. 基础环境校验
|
||||
[ ! -f "$CONFIG_FILE" ] && exit 1
|
||||
@@ -16,11 +19,14 @@ source "$CONFIG_FILE"
|
||||
|
||||
REGION=${REGION_CODE:-"US"}
|
||||
LOG_FILE="${INSTALL_DIR}/logs/sentinel.log"
|
||||
REGION_JSON_FILE="${INSTALL_DIR}/data/regions/${REGION}.json"
|
||||
|
||||
# 2. 动态获取配置 (解耦核心)
|
||||
# 兼容旧节点:如果本地没有 json,自动拉取最新的云端配置 (强制遵循锚点协议)
|
||||
if [ ! -f "$REGION_JSON_FILE" ]; then
|
||||
# 2. 动态获取配置 (V3 拓扑自适应与兜底)
|
||||
# 利用 find 穿透多级子目录,自动抓取安装时落地的那份专属 json 文件
|
||||
REGION_JSON_FILE=$(find "${INSTALL_DIR}/data/regions" -name "*.json" 2>/dev/null | head -n 1)
|
||||
|
||||
# 兼容旧节点兜底:如果本地真没找到 json,回退到拉取云端通用大区配置
|
||||
if [ -z "$REGION_JSON_FILE" ] || [ ! -f "$REGION_JSON_FILE" ]; then
|
||||
REGION_JSON_FILE="${INSTALL_DIR}/data/regions/${REGION}.json"
|
||||
mkdir -p "${INSTALL_DIR}/data/regions"
|
||||
curl -${IP_PREF:-4} -sL "${REPO_RAW_URL}/data/regions/${REGION}.json" -o "$REGION_JSON_FILE"
|
||||
fi
|
||||
|
||||
@@ -28,10 +28,14 @@ export -f log
|
||||
export CONFIG_FILE INSTALL_DIR
|
||||
|
||||
# 3. 防僵尸网络特征 (Cron Jitter) - 核心隐蔽逻辑
|
||||
# 配合每 30 分钟的调度周期,将随机休眠控制在 0 到 180 秒 (3分钟) 内,彻底打散全球并发请求
|
||||
JITTER_TIME=$((RANDOM % 180))
|
||||
log "SYSTEM" "INFO" "主控引擎被 Cron 唤醒,进入防并发随机休眠状态: ${JITTER_TIME} 秒..."
|
||||
sleep $JITTER_TIME
|
||||
# 配合每 30 分钟的调度周期,将随机休眠控制在 0 到 180 秒内,彻底打散全球并发请求
|
||||
if [ -t 1 ]; then
|
||||
log "SYSTEM" "INFO " "💻 检测到人工终端干预,跳过静默休眠,立即执行任务!"
|
||||
else
|
||||
JITTER_TIME=$((RANDOM % 180))
|
||||
log "SYSTEM" "INFO " "⏱️ 主控引擎由后台唤醒,进入防并发随机休眠状态: ${JITTER_TIME} 秒..."
|
||||
sleep $JITTER_TIME
|
||||
fi
|
||||
|
||||
# 4. 唤醒并读取功能开关,执行智能调度 (Feature Flag)
|
||||
log "SYSTEM" "INFO" "休眠结束,开始计算本轮任务轮盘..."
|
||||
|
||||
@@ -1,48 +1,49 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ==========================================================
|
||||
# 脚本名称: uninstall.sh (IP-Sentinel 一键卸载脚本 V2.0)
|
||||
# 核心功能: 清除所有世代的守护进程、清理系统定时任务、删除程序文件
|
||||
# 脚本名称: uninstall.sh (IP-Sentinel 一键卸载脚本 V3.1.4 焦土版)
|
||||
# 核心功能: 无痕清理守护进程、定时任务、运行目录及临时缓存
|
||||
# ==========================================================
|
||||
|
||||
INSTALL_DIR="/opt/ip_sentinel"
|
||||
|
||||
echo "========================================================"
|
||||
echo " 🗑️ 准备卸载 IP-Sentinel (VPS IP 自动养护哨兵)"
|
||||
echo " 🗑️ 准备卸载 IP-Sentinel (边缘节点 Edge Agent)"
|
||||
echo "========================================================"
|
||||
|
||||
# 1. 停止运行中的守护进程与主控模块 (涵盖 V1.0 至 V2.0 架构全量进程)
|
||||
# 1. 停止运行中的守护进程与主控模块 (涵盖所有历史版本进程)
|
||||
echo "[1/3] 正在终止后台守护进程与所有养护任务..."
|
||||
|
||||
# 击杀旧版 (V1.x) 遗留进程
|
||||
pgrep -f tg_daemon.sh | xargs -r kill -9 >/dev/null 2>&1
|
||||
|
||||
# 击杀新版 (V2.x) 神经末梢守护进程
|
||||
pgrep -f agent_daemon.sh | xargs -r kill -9 >/dev/null 2>&1
|
||||
pgrep -f webhook.py | xargs -r kill -9 >/dev/null 2>&1
|
||||
|
||||
# 击杀调度引擎与更新/战报模块
|
||||
pgrep -f runner.sh | xargs -r kill -9 >/dev/null 2>&1
|
||||
pgrep -f updater.sh | xargs -r kill -9 >/dev/null 2>&1
|
||||
pgrep -f tg_report.sh | xargs -r kill -9 >/dev/null 2>&1
|
||||
|
||||
# 击杀所有具体的业务执行模块
|
||||
pgrep -f mod_google.sh | xargs -r kill -9 >/dev/null 2>&1
|
||||
pgrep -f mod_trust.sh | xargs -r kill -9 >/dev/null 2>&1
|
||||
# 使用 pkill 替代传统的 pgrep | xargs,指令更短、容错率更高
|
||||
pkill -9 -f "tg_daemon.sh" >/dev/null 2>&1
|
||||
pkill -9 -f "agent_daemon.sh" >/dev/null 2>&1
|
||||
pkill -9 -f "webhook.py" >/dev/null 2>&1
|
||||
pkill -9 -f "runner.sh" >/dev/null 2>&1
|
||||
pkill -9 -f "updater.sh" >/dev/null 2>&1
|
||||
pkill -9 -f "tg_report.sh" >/dev/null 2>&1
|
||||
pkill -9 -f "mod_google.sh" >/dev/null 2>&1
|
||||
pkill -9 -f "mod_trust.sh" >/dev/null 2>&1
|
||||
|
||||
# 2. 清除系统定时任务 (Cron)
|
||||
echo "[2/3] 正在清理系统定时任务 (Cron)..."
|
||||
crontab -l 2>/dev/null | grep -v "ip_sentinel" > /tmp/cron_backup
|
||||
crontab /tmp/cron_backup
|
||||
rm -f /tmp/cron_backup
|
||||
if crontab -l >/dev/null 2>&1; then
|
||||
crontab -l | grep -v "ip_sentinel" > /tmp/cron_backup
|
||||
crontab /tmp/cron_backup
|
||||
rm -f /tmp/cron_backup
|
||||
fi
|
||||
|
||||
# 3. 删除所有文件与日志
|
||||
echo "[3/3] 正在抹除核心程序、配置文件与系统日志..."
|
||||
# 3. 删除所有文件、日志与临时缓存
|
||||
echo "[3/3] 正在抹除核心程序、配置文件与系统痕迹..."
|
||||
if [ -d "$INSTALL_DIR" ]; then
|
||||
rm -rf "$INSTALL_DIR"
|
||||
fi
|
||||
|
||||
# 拔除 /tmp 目录下的所有更新下载临时文件和 V1/V2 遗留的偏移量记录
|
||||
rm -f /tmp/ip_sentinel_*.txt
|
||||
rm -f /tmp/ip_sentinel_*.json
|
||||
|
||||
echo "========================================================"
|
||||
echo "✅ 卸载彻底完成!IP-Sentinel 已从您的系统中无痕移除。"
|
||||
echo "👋 感谢您的使用,期待未来再次为您守护 IP!"
|
||||
echo "💡 提示:如果安装时在防火墙放行了 Webhook 随机端口,请您按需手动关闭。"
|
||||
echo "👋 感谢您的使用,期待未来再次为您守护资产!"
|
||||
echo "========================================================"
|
||||
@@ -1,14 +1,16 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ==========================================================
|
||||
# 脚本名称: updater.sh (IP-Sentinel 养料注入与系统维护模块)
|
||||
# 核心功能: 定期静默更新热数据、清理瘦身日志文件
|
||||
# 脚本名称: updater.sh (IP-Sentinel V3.1.4 养料注入与维护中枢)
|
||||
# 核心功能: 静默更新热数据(指纹/词库/LBS规则)、清理瘦身日志
|
||||
# ==========================================================
|
||||
|
||||
INSTALL_DIR="/opt/ip_sentinel"
|
||||
CONFIG_FILE="${INSTALL_DIR}/config.conf"
|
||||
# 你的专属 Forgejo 仓库 Raw 数据直链前缀
|
||||
REPO_RAW_URL="https://git.94211762.xyz/hotyue/IP-Sentinel/raw/branch/main"
|
||||
# 你的 GitHub 仓库 Raw 数据直链前缀 (统一标准)
|
||||
REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/main"
|
||||
# 临时改为私库地址用于测试
|
||||
# REPO_RAW_URL="https://git.94211762.xyz/hotyue/IP-Sentinel/raw/branch/main"
|
||||
|
||||
# 1. 加载本地冷数据配置
|
||||
if [ ! -f "$CONFIG_FILE" ]; then
|
||||
@@ -24,20 +26,20 @@ log() {
|
||||
|
||||
log "Updater" "INFO " "========== 触发后台静默 OTA 热数据更新 =========="
|
||||
|
||||
# 3. 容灾机制拉取 UA 池
|
||||
# 3. 容灾机制拉取 UA 指纹池 (强制遵循锚点协议)
|
||||
TMP_UA="/tmp/ip_sentinel_ua.txt"
|
||||
curl -sL "${REPO_RAW_URL}/data/user_agents.txt" -o "$TMP_UA"
|
||||
curl -${IP_PREF:-4} -sL "${REPO_RAW_URL}/data/user_agents.txt" -o "$TMP_UA"
|
||||
if [ -s "$TMP_UA" ]; then
|
||||
mv "$TMP_UA" "${INSTALL_DIR}/data/user_agents.txt"
|
||||
log "Updater" "INFO " "✅ 设备指纹池 (User-Agents) 更新成功"
|
||||
else
|
||||
log "Updater" "WARN " "❌ UA 池拉取失败或为空,保留本地旧数据防崩溃"
|
||||
log "Updater" "WARN " "❌ UA 池拉取失败,保留本地旧数据防崩溃"
|
||||
rm -f "$TMP_UA"
|
||||
fi
|
||||
|
||||
# 4. 容灾机制拉取当地最新搜索词库
|
||||
TMP_KW="/tmp/ip_sentinel_kw.txt"
|
||||
curl -sL "${REPO_RAW_URL}/data/keywords/kw_${REGION_CODE}.txt" -o "$TMP_KW"
|
||||
curl -${IP_PREF:-4} -sL "${REPO_RAW_URL}/data/keywords/kw_${REGION_CODE}.txt" -o "$TMP_KW"
|
||||
if [ -s "$TMP_KW" ]; then
|
||||
mv "$TMP_KW" "${INSTALL_DIR}/data/keywords/kw_${REGION_CODE}.txt"
|
||||
log "Updater" "INFO " "✅ 区域搜索词库 (kw_${REGION_CODE}) 更新成功"
|
||||
@@ -46,7 +48,27 @@ else
|
||||
rm -f "$TMP_KW"
|
||||
fi
|
||||
|
||||
# 5. 【升级点】日志防满瘦身机制 (保留最近 2000 行)
|
||||
# 5. 【V3.1.4 核心升级】自适应拉取本地 LBS 专属 JSON 规则库
|
||||
# 利用 find 穿透寻找本地唯一的 json
|
||||
REGION_JSON_FILE=$(find "${INSTALL_DIR}/data/regions" -name "*.json" 2>/dev/null | head -n 1)
|
||||
|
||||
if [ -n "$REGION_JSON_FILE" ] && [ -f "$REGION_JSON_FILE" ]; then
|
||||
# 提取本地文件的相对路径 (例如: data/regions/US/CA/San_Jose.json)
|
||||
REL_PATH=${REGION_JSON_FILE#*${INSTALL_DIR}/}
|
||||
TMP_JSON="/tmp/ip_sentinel_region.json"
|
||||
|
||||
# 按照相同的相对路径去云端拉取更新
|
||||
curl -${IP_PREF:-4} -sL "${REPO_RAW_URL}/${REL_PATH}" -o "$TMP_JSON"
|
||||
if [ -s "$TMP_JSON" ]; then
|
||||
mv "$TMP_JSON" "$REGION_JSON_FILE"
|
||||
log "Updater" "INFO " "✅ 核心战区规则库 ($REL_PATH) 更新成功"
|
||||
else
|
||||
log "Updater" "WARN " "❌ 战区规则库拉取失败,保留本地旧数据"
|
||||
rm -f "$TMP_JSON"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 6. 日志防满瘦身机制 (保留最近 2000 行)
|
||||
if [ -f "$LOG_FILE" ]; then
|
||||
tail -n 2000 "$LOG_FILE" > "${LOG_FILE}.tmp"
|
||||
mv "${LOG_FILE}.tmp" "$LOG_FILE"
|
||||
|
||||
Reference in New Issue
Block a user