fix(core): 引入智能网卡生存探测机制,彻底解决多 IP 站群机因 IP 漂移导致的 curl 死锁断网问题

This commit is contained in:
hotyue
2026-04-21 09:20:55 +00:00
parent 049278c458
commit 01806d20dd
4 changed files with 47 additions and 22 deletions
+15 -8
View File
@@ -97,14 +97,21 @@ CURL_BIND_OPT=""
DYNAMIC_IP_PREF="-${IP_PREF:-4}" # 默认提取用户配置 DYNAMIC_IP_PREF="-${IP_PREF:-4}" # 默认提取用户配置
if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then
CURL_BIND_OPT="--interface $BIND_IP" # [v3.6.3 容错层补丁] 探测物理网卡/虚拟 IP 存活状态
# 智能探测:带冒号为 V6,带点号为 V4 RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]')
if [[ "$BIND_IP" == *":"* ]]; then if ! ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then
DYNAMIC_IP_PREF="-6" log "$MODULE_NAME" "WARN " "检测到配置的出口 IP ($RAW_BIND_IP) 已丢失,自动降级为系统默认路由出网!"
log "$MODULE_NAME" "INFO " "底层路由锁定: 绑定 IPv6 出口及协议 ($BIND_IP)" CURL_BIND_OPT=""
elif [[ "$BIND_IP" == *"."* ]]; then else
DYNAMIC_IP_PREF="-4" CURL_BIND_OPT="--interface $BIND_IP"
log "$MODULE_NAME" "INFO " "底层路由锁定: 绑定 IPv4 出口及协议 ($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
fi fi
+15 -8
View File
@@ -99,14 +99,21 @@ CURL_BIND_OPT=""
DYNAMIC_IP_PREF="-${IP_PREF:-4}" # 默认提取用户配置 DYNAMIC_IP_PREF="-${IP_PREF:-4}" # 默认提取用户配置
if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then
CURL_BIND_OPT="--interface $BIND_IP" # [v3.6.3 容错层补丁] 探测物理网卡/虚拟 IP 存活状态
# 智能探测:带冒号为 V6,带点号为 V4 RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]')
if [[ "$BIND_IP" == *":"* ]]; then if ! ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then
DYNAMIC_IP_PREF="-6" log_msg "WARN " "检测到配置的出口 IP ($RAW_BIND_IP) 已丢失,自动降级为系统默认路由出网!"
log_msg "INFO " "底层路由锁定: 绑定 IPv6 出口及协议 ($BIND_IP)" CURL_BIND_OPT=""
elif [[ "$BIND_IP" == *"."* ]]; then else
DYNAMIC_IP_PREF="-4" CURL_BIND_OPT="--interface $BIND_IP"
log_msg "INFO " "底层路由锁定: 绑定 IPv4 出口及协议 ($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
fi fi
+11 -5
View File
@@ -31,11 +31,17 @@ CURL_BIND_OPT=""
DYNAMIC_IP_PREF="-${IP_PREF:-4}" DYNAMIC_IP_PREF="-${IP_PREF:-4}"
if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then
CURL_BIND_OPT="--interface $BIND_IP" # [v3.6.3 容错层补丁] 探测物理网卡/虚拟 IP 存活状态
if [[ "$BIND_IP" == *":"* ]]; then RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]')
DYNAMIC_IP_PREF="-6" if ! ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then
elif [[ "$BIND_IP" == *"."* ]]; then CURL_BIND_OPT=""
DYNAMIC_IP_PREF="-4" 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
fi fi
+6 -1
View File
@@ -42,7 +42,12 @@ CURL_CMD="curl -${IP_PREF:-4} -sL"
if [ -n "$BIND_IP" ]; then if [ -n "$BIND_IP" ]; then
# curl 的 --interface 参数不支持带方括号的 IPv6 地址,必须强行脱壳 # curl 的 --interface 参数不支持带方括号的 IPv6 地址,必须强行脱壳
RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]') 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 fi
# ========================================================== # ==========================================================