From 01806d20dd3d582d9fffbaa15b57cf6e4fed8ea4 Mon Sep 17 00:00:00 2001 From: hotyue <52734432+hotyue@users.noreply.github.com> Date: Tue, 21 Apr 2026 09:20:55 +0000 Subject: [PATCH] =?UTF-8?q?fix(core):=20=E5=BC=95=E5=85=A5=E6=99=BA?= =?UTF-8?q?=E8=83=BD=E7=BD=91=E5=8D=A1=E7=94=9F=E5=AD=98=E6=8E=A2=E6=B5=8B?= =?UTF-8?q?=E6=9C=BA=E5=88=B6=EF=BC=8C=E5=BD=BB=E5=BA=95=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E5=A4=9A=20IP=20=E7=AB=99=E7=BE=A4=E6=9C=BA=E5=9B=A0=20IP=20?= =?UTF-8?q?=E6=BC=82=E7=A7=BB=E5=AF=BC=E8=87=B4=E7=9A=84=20curl=20?= =?UTF-8?q?=E6=AD=BB=E9=94=81=E6=96=AD=E7=BD=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/mod_google.sh | 23 +++++++++++++++-------- core/mod_trust.sh | 23 +++++++++++++++-------- core/tg_report.sh | 16 +++++++++++----- core/updater.sh | 7 ++++++- 4 files changed, 47 insertions(+), 22 deletions(-) diff --git a/core/mod_google.sh b/core/mod_google.sh index 0170dab..1020eea 100755 --- a/core/mod_google.sh +++ b/core/mod_google.sh @@ -97,14 +97,21 @@ CURL_BIND_OPT="" DYNAMIC_IP_PREF="-${IP_PREF:-4}" # 默认提取用户配置 if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then - CURL_BIND_OPT="--interface $BIND_IP" - # 智能探测:带冒号为 V6,带点号为 V4 - if [[ "$BIND_IP" == *":"* ]]; then - DYNAMIC_IP_PREF="-6" - log "$MODULE_NAME" "INFO " "底层路由锁定: 绑定 IPv6 出口及协议 ($BIND_IP)" - elif [[ "$BIND_IP" == *"."* ]]; then - DYNAMIC_IP_PREF="-4" - log "$MODULE_NAME" "INFO " "底层路由锁定: 绑定 IPv4 出口及协议 ($BIND_IP)" + # [v3.6.3 容错层补丁] 探测物理网卡/虚拟 IP 存活状态 + RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]') + if ! ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then + log "$MODULE_NAME" "WARN " "检测到配置的出口 IP ($RAW_BIND_IP) 已丢失,自动降级为系统默认路由出网!" + CURL_BIND_OPT="" + else + CURL_BIND_OPT="--interface $BIND_IP" + # 智能探测:带冒号为 V6,带点号为 V4 + if [[ "$BIND_IP" == *":"* ]]; then + DYNAMIC_IP_PREF="-6" + log "$MODULE_NAME" "INFO " "底层路由锁定: 绑定 IPv6 出口及协议 ($BIND_IP)" + elif [[ "$BIND_IP" == *"."* ]]; then + DYNAMIC_IP_PREF="-4" + log "$MODULE_NAME" "INFO " "底层路由锁定: 绑定 IPv4 出口及协议 ($BIND_IP)" + fi fi fi diff --git a/core/mod_trust.sh b/core/mod_trust.sh index c106a2a..54e24fd 100755 --- a/core/mod_trust.sh +++ b/core/mod_trust.sh @@ -99,14 +99,21 @@ CURL_BIND_OPT="" DYNAMIC_IP_PREF="-${IP_PREF:-4}" # 默认提取用户配置 if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then - CURL_BIND_OPT="--interface $BIND_IP" - # 智能探测:带冒号为 V6,带点号为 V4 - if [[ "$BIND_IP" == *":"* ]]; then - DYNAMIC_IP_PREF="-6" - log_msg "INFO " "底层路由锁定: 绑定 IPv6 出口及协议 ($BIND_IP)" - elif [[ "$BIND_IP" == *"."* ]]; then - DYNAMIC_IP_PREF="-4" - log_msg "INFO " "底层路由锁定: 绑定 IPv4 出口及协议 ($BIND_IP)" + # [v3.6.3 容错层补丁] 探测物理网卡/虚拟 IP 存活状态 + RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]') + if ! ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then + log_msg "WARN " "检测到配置的出口 IP ($RAW_BIND_IP) 已丢失,自动降级为系统默认路由出网!" + CURL_BIND_OPT="" + else + CURL_BIND_OPT="--interface $BIND_IP" + # 智能探测:带冒号为 V6,带点号为 V4 + if [[ "$BIND_IP" == *":"* ]]; then + DYNAMIC_IP_PREF="-6" + log_msg "INFO " "底层路由锁定: 绑定 IPv6 出口及协议 ($BIND_IP)" + elif [[ "$BIND_IP" == *"."* ]]; then + DYNAMIC_IP_PREF="-4" + log_msg "INFO " "底层路由锁定: 绑定 IPv4 出口及协议 ($BIND_IP)" + fi fi fi diff --git a/core/tg_report.sh b/core/tg_report.sh index c3538f0..9a06802 100755 --- a/core/tg_report.sh +++ b/core/tg_report.sh @@ -31,11 +31,17 @@ CURL_BIND_OPT="" DYNAMIC_IP_PREF="-${IP_PREF:-4}" if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then - CURL_BIND_OPT="--interface $BIND_IP" - if [[ "$BIND_IP" == *":"* ]]; then - DYNAMIC_IP_PREF="-6" - elif [[ "$BIND_IP" == *"."* ]]; then - DYNAMIC_IP_PREF="-4" + # [v3.6.3 容错层补丁] 探测物理网卡/虚拟 IP 存活状态 + RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]') + if ! ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then + CURL_BIND_OPT="" + else + CURL_BIND_OPT="--interface $BIND_IP" + if [[ "$BIND_IP" == *":"* ]]; then + DYNAMIC_IP_PREF="-6" + elif [[ "$BIND_IP" == *"."* ]]; then + DYNAMIC_IP_PREF="-4" + fi fi fi diff --git a/core/updater.sh b/core/updater.sh index 25a3816..77a3260 100755 --- a/core/updater.sh +++ b/core/updater.sh @@ -42,7 +42,12 @@ CURL_CMD="curl -${IP_PREF:-4} -sL" if [ -n "$BIND_IP" ]; then # curl 的 --interface 参数不支持带方括号的 IPv6 地址,必须强行脱壳 RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]') - CURL_CMD="$CURL_CMD --interface $RAW_BIND_IP" + # [v3.6.3 容错层补丁] 探测网卡存活状态,防止 IP 漂移导致永久断网 + if ! ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then + log "Updater" "WARN " "检测到绑定的出口 IP ($RAW_BIND_IP) 已丢失,自动退回默认路由!" + else + CURL_CMD="$CURL_CMD --interface $RAW_BIND_IP" + fi fi # ==========================================================