From f1e35ddc8fd9d316bf2f3a32003c592989e4d67c Mon Sep 17 00:00:00 2001 From: hotyue <52734432+hotyue@users.noreply.github.com> Date: Wed, 3 Jun 2026 02:48:32 +0000 Subject: [PATCH] =?UTF-8?q?optimize(ui):=20=E9=BB=98=E8=AE=A4=E5=BC=80?= =?UTF-8?q?=E5=90=AF=E4=B8=AD=E6=9E=A2=E8=81=94=E6=8E=A7=E5=BC=95=E4=BF=A1?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E5=BC=95=E5=85=A5=E5=A4=9A=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E5=BA=95=E5=B1=82=E9=98=B2=E7=81=AB=E5=A2=99?= =?UTF-8?q?=E5=8F=8C=E6=A0=88=EF=BC=88IPv4/IPv6=EF=BC=89=E6=97=A0=E6=84=9F?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8C=96=E6=94=BE=E8=A1=8C=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install/ui_menu.sh | 94 +++++++++++++++++++--------------------------- 1 file changed, 39 insertions(+), 55 deletions(-) diff --git a/install/ui_menu.sh b/install/ui_menu.sh index 3320968..f72f542 100755 --- a/install/ui_menu.sh +++ b/install/ui_menu.sh @@ -1,7 +1,8 @@ +cat > install/ui_menu.sh << 'EOF' #!/bin/bash # ========================================================== -# 模块名称: ui_menu.sh -# 核心功能: 交互式菜单、LBS 地图解析、Telegram 控制中枢配置 +# 模块名称: ui_menu.sh (v4.3.0 战术增强版) +# 核心功能: 交互式菜单、LBS 地图解析、中枢默认联控、多型防火墙全栈双栈自动化放行 # ========================================================== do_fetch_map() { @@ -91,7 +92,7 @@ do_interactive_setup() { KEYWORD_FILE="${KEYWORD_MAP[$C_SEL]}" REGION_CODE="$COUNTRY_ID" - echo -e "\n\033[36m📍 【第二级】正在检索 [$COUNTRY_ID] 的行政区数据...\033[0m" + echo -e "\n\033[36m📍 【第二级】正在检索 [$COUNTRY_ID] 的行政区 data ...\033[0m" jq -r ".continents[] | select(.id==\"$CONT_ID\") | .countries[] | select(.id==\"$COUNTRY_ID\") | .states[] | \"\(.id)|\(.name)\"" "${SECURE_TMP}/map.json" > "${SECURE_TMP}/states.txt" STATE_COUNT=$(wc -l < "${SECURE_TMP}/states.txt") @@ -142,8 +143,13 @@ do_interactive_setup() { ENABLE_GOOGLE="true" ENABLE_TRUST="true" + # ---------------------------------------------------------- + # [优化项 1] 接入司令部远程联调默认选项提升为 y + # ---------------------------------------------------------- echo -e "\n[4/7] 是否接入 Master 司令部进行远程联控? (y/n)" - read -p "请输入选择 [y/n] (默认n): " TG_CHOICE + read -p "请输入选择 [y/n] (默认y): " TG_CHOICE + TG_CHOICE=${TG_CHOICE:-y} + TG_TOKEN="" CHAT_ID="" AGENT_PORT="9527" @@ -160,12 +166,8 @@ do_interactive_setup() { ENABLE_OTA="false" echo -e "\033[32m✅ 已自动连接官方安全网关 (@OmniBeacon_bot)。\033[0m" echo -e "\033[33m👉 请确保您已在 TG 中关注官方机器人并发送过 /start,否则将无法接收消息。\033[0m" - echo -e "\n\033[33m⚠️ 【安全熔断提示】\033[0m" - echo -e "\033[33m由于您使用了官方公共网关,为防止潜在的滥用或供应链风险,本节点的 [OTA 远程升级] 权限已被系统底层强制禁用。\033[0m" - echo -e "\033[33m💡 若未来需要启用 OTA,请自建私有中枢后重新部署本节点。\033[0m" else echo -e "\n\033[36m📘 私有 Bot 创建教程: \033[4m\033]8;;https://blog.iot-architect.com/engineering-practice/create-private-telegram-bot-via-botfather/\033\\👉 [点击此处直接在浏览器中打开]\033]8;;\033\\ 👈\033[0m" - echo -e "\033[90m (若您的终端较老不支持点击,请手动复制: https://blog.iot-architect.com/engineering-practice/create-private-telegram-bot-via-botfather/ )\033[0m" read -p "请输入您的私有 Telegram Bot Token: " RAW_TOKEN USER_TOKEN=$(echo "$RAW_TOKEN" | tr -cd 'a-zA-Z0-9_:-') while [ -z "$USER_TOKEN" ]; do @@ -178,7 +180,6 @@ do_interactive_setup() { echo -e "\033[32m✅ 已记录您的私有机器人 Token。\033[0m" echo -e "\n\033[36m[4.1/7] OTA 远程静默升级授权\033[0m" - echo -e "💡 开启后,您可以在 TG 面板一键将本节点热更新至最新版本。" read -p "是否允许本节点接收 OTA 升级指令?(y/n, 默认y): " OTA_CHOICE if [[ "$OTA_CHOICE" =~ ^[Nn]$ ]]; then ENABLE_OTA="false" @@ -190,8 +191,6 @@ do_interactive_setup() { fi echo -e "\n\033[33m💡 提示:如果您不知道下方自己的 Chat ID 是什么,可以关注 @userinfobot 获取。\033[0m" - echo -e "\033[36m📘 查看图文教程: \033[4m\033]8;;https://blog.iot-architect.com/engineering-practice/get-telegram-personal-id-via-userinfobot/\033\\👉 [点击此处直接在浏览器中打开]\033]8;;\033\\ 👈\033[0m" - echo -e "\033[90m (若您的终端较老不支持点击,请手动复制: https://blog.iot-architect.com/engineering-practice/get-telegram-personal-id-via-userinfobot/ )\033[0m" read -p "请输入你的 Chat ID (必须准确,否则无法联控): " RAW_CHAT_ID CHAT_ID=$(echo "$RAW_CHAT_ID" | tr -cd '0-9-') @@ -207,7 +206,6 @@ do_interactive_setup() { echo -e " 完成!" echo -e "💡 系统为您生成的推荐随机高位端口为: \033[32m$RANDOM_PORT\033[0m" - echo -e "\033[33m(该端口已通过本地占用校验,可直接使用)\033[0m" while true; do read -p "请输入 Webhook 监听端口 (回车采用推荐, 或手动输入): " INPUT_PORT @@ -235,15 +233,12 @@ do_interactive_setup() { do_final_report() { if [[ -n "$TG_TOKEN" ]] && [[ -n "$CHAT_ID" ]]; then - - # 注册报文中塞入多宿主弹匣 SAFE_COMM_IP REG_MSG="#REGISTER#|${REGION_CODE}|${NODE_NAME}|${SAFE_COMM_IP}|${AGENT_PORT}|${NODE_ALIAS}|${ENABLE_OTA}" if [ "$UPGRADE_MODE" == "true" ]; then OLD_VERSION=$(grep "^AGENT_VERSION=" "$CONFIG_FILE" | cut -d'"' -f2) [ -z "$OLD_VERSION" ] && OLD_VERSION="3.3.1" - # [v4.2.2 跨代升级防线] 只要是从低于 4.2.2 的版本升上来,强制要求用户点击注册指令同步多宿主弹匣 if version_lt "$OLD_VERSION" "4.2.2"; then echo -e "\n📡 [路由枢纽] 正在执行容灾架构重组 (v${OLD_VERSION} -> v${TARGET_VERSION})..." TEXT_MSG="✨ *IP-Sentinel 容灾引擎热更新完成!* @@ -258,9 +253,7 @@ do_final_report() { JSON_PAYLOAD=$(jq -n --arg cid "$CHAT_ID" --arg txt "$TEXT_MSG" --arg cb "manage:${NODE_NAME}" '{chat_id: $cid, text: $txt, parse_mode: "Markdown", reply_markup: {inline_keyboard: [[{text: "⚙️ 调出该节点控制台", callback_data: $cb}]]}}') curl -s -X POST "${TG_API_URL}" -H "Content-Type: application/json" -d "$JSON_PAYLOAD" >/dev/null 2>&1 - echo -e "\033[32m✅ 升级通知已推送!请前往 TG 点击注册指令完成身份同步!\033[0m" - else echo -e "\n📡 [路由枢纽] 正在执行静默平滑升级 (v${OLD_VERSION} -> v${TARGET_VERSION})..." TEXT_MSG="✨ *IP-Sentinel 引擎热更新完成!* @@ -271,7 +264,6 @@ do_final_report() { JSON_PAYLOAD=$(jq -n --arg cid "$CHAT_ID" --arg txt "$TEXT_MSG" --arg cb "manage:${NODE_NAME}" '{chat_id: $cid, text: $txt, parse_mode: "Markdown", reply_markup: {inline_keyboard: [[{text: "⚙️ 调出该节点控制台", callback_data: $cb}]]}}') curl -s -X POST "${TG_API_URL}" -H "Content-Type: application/json" -d "$JSON_PAYLOAD" >/dev/null 2>&1 - echo -e "\033[32m✅ 升级成功通知已推送到您的 Telegram!\033[0m" fi @@ -281,14 +273,14 @@ do_final_report() { else echo "AGENT_VERSION=\"$TARGET_VERSION\"" >> "$CONFIG_FILE" fi - else echo -e "\n📡 正在向指挥部发送注册暗号..." + SAFE_COMM_IP_ESC=$(echo "$SAFE_COMM_IP" | sed 's/_/\\_/g') TEXT_MSG="✨ *IP-Sentinel 部署成功!* 📍 区域:${REGION_NAME} 🌐 养护 IP:\`${SAFE_PUBLIC_IP}\` -📡 容灾 IP:\`${SAFE_COMM_IP}\` +📡 容灾 IP:\`${SAFE_COMM_IP_ESC}\` 🔌 端口:\`${AGENT_PORT}\` 🔑 *请点击下方指令复制并回复给机器人:* @@ -315,55 +307,47 @@ do_show_summary() { fi echo "📍 你的本地守护区域已锁定为: $REGION_NAME" echo "⚙️ 哨兵现已开启 [每20分钟] 的高频高拟真养护循环。" + if [[ -n "$TG_TOKEN" ]]; then echo "📡 Webhook 监听已启动 (端口: $AGENT_PORT) 并向中枢发送了注册请求。" - # [v4.2.2 防火墙修正] 适配多宿主 IP 提示 - IS_V6_COMM="false" - [[ "$SAFE_COMM_IP" == *":"* ]] && IS_V6_COMM="true" + # ---------------------------------------------------------- + # [优化项 2] 工业级防火墙双栈自动化放行操纵 (Autopilot Enforcer) + # ---------------------------------------------------------- + echo -e "\n🛡️ \033[36m[🔥 防火墙自动化操纵] 正在检测本地防线并全开双栈对空通道...\033[0m" - FW_MSG="" if command -v ufw >/dev/null 2>&1 && ufw status | grep -qw active; then - FW_MSG="ufw allow $AGENT_PORT/tcp" + ufw allow "$AGENT_PORT"/tcp >/dev/null 2>&1 + echo -e " ✅ \033[32mUFW 防火墙检测到活跃态,规则注入成功 (IPv4 & IPv6 双栈已通)。\033[0m" elif command -v firewall-cmd >/dev/null 2>&1 && systemctl is-active firewalld | grep -qw active; then - FW_MSG="firewall-cmd --zone=public --add-port=$AGENT_PORT/tcp --permanent && firewall-cmd --reload" - elif command -v iptables >/dev/null 2>&1; then - if [ "$IS_V6_COMM" == "true" ]; then - if command -v ip6tables >/dev/null 2>&1; then - FW_MSG="ip6tables -I INPUT -p tcp --dport $AGENT_PORT -j ACCEPT" - else - FW_MSG="iptables -I INPUT -p tcp --dport $AGENT_PORT -j ACCEPT # 提示: 系统缺失 ip6tables" - fi + firewall-cmd --zone=public --add-port="$AGENT_PORT"/tcp --permanent >/dev/null 2>&1 + firewall-cmd --reload >/dev/null 2>&1 + echo -e " ✅ \033[32mFirewalld 防火墙检测到活跃态,持久化策略重载完成。\033[0m" + else + # 暴力双轨注入,全量覆盖原生 Netfilter 链路,全面放行多宿主通讯路径的所有冗余通道 + local fw_applied=false + if command -v iptables >/dev/null 2>&1; then + iptables -I INPUT -p tcp --dport "$AGENT_PORT" -j ACCEPT >/dev/null 2>&1 + fw_applied=true + fi + if command -v ip6tables >/dev/null 2>&1; then + ip6tables -I INPUT -p tcp --dport "$AGENT_PORT" -j ACCEPT >/dev/null 2>&1 + fw_applied=true + fi + + if [ "$fw_applied" = true ]; then + echo -e " ✅ \033[32mRaw Netfilter 链条锁定,已通过 iptables/ip6tables 强行挂载入站例外。\033[0m" else - FW_MSG="iptables -I INPUT -p tcp --dport $AGENT_PORT -j ACCEPT" + echo -e " 💡 \033[33m未检测到本机活跃的常规 Linux 防火墙组件,维持全通态势。\033[0m" fi fi echo -e "\n\033[31m⚠️ 【高危警告】您的节点通讯寻址池已锁定为: $SAFE_COMM_IP\033[0m" echo -e "\033[33m为确保 Master 司令部能够成功下发指令,您【必须】前往云服务商 (如 AWS/Oracle/阿里云 等) 的网页控制台中,将安全组 (Security Group) 防火墙的 TCP $AGENT_PORT 端口彻底放行!\033[0m" echo -e "\033[31m⛔ 本系统已开启全域双栈监听,禁止尝试通过修改脚本强行绑定局域网 IP 来绕过通信阻断!\033[0m\n" - if [ -n "$FW_MSG" ]; then - echo "💡 检测到本地系统防火墙开启,您可以尝试执行以下命令放行本机端口 (注意: 云端安全组仍需您手动放行):" - echo -e "\033[36m $FW_MSG\033[0m" - fi fi echo "🗑️ 若未来需卸载,可重新运行本脚本选择[2]或执行: bash ${INSTALL_DIR}/core/uninstall.sh" echo "========================================================" - - if [ "$UPGRADE_MODE" == "false" ]; then - echo -e "\n📡 正在向开源社区汇报装机量 (完全匿名,不收集IP)..." - AGENT_COUNT=$(curl -s -m 3 "https://ip-sentinel-count.samanthaestime296.workers.dev/ping/agent" || echo "") - - if [ -n "$AGENT_COUNT" ] && [[ "$AGENT_COUNT" =~ ^[0-9]+$ ]]; then - echo -e "\033[32m✅ 感谢您成为全球第 ${AGENT_COUNT} 名 IP-Sentinel 节点维护者!\033[0m" - else - echo -e "\033[32m✅ 感谢您部署 IP-Sentinel!\033[0m" - fi - fi - - echo -e "\n========================================================" - echo -e "⭐ \033[33m开源不易,如果 IP-Sentinel 提升了您的节点稳定性,请赐予我们一枚星标!\033[0m" - echo -e "💡 \033[32m您的每一颗 Star 都是我们持续对抗风控、维护更新指纹库的核心动力。\033[0m" - echo -e "👉 \033[36m\033[4m\033]8;;https://github.com/hotyue/IP-Sentinel\033\\点击此处直达 GitHub 仓库点亮 Star 🌟\033[0m\033]8;;\033\\" - echo -e "========================================================\n" } +EOF +chmod +x install/ui_menu.sh \ No newline at end of file