From 062a3eee90ca3b8110ef562aa09c569f34e03221 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Thu, 23 Jul 2026 08:53:37 +0000 Subject: [PATCH] fix: refresh stale cellular source IP and resolve cpxy symlink BASE WWAN re-dial often keeps iface name (wwan0) but changes private IP. Stale inet4_bind_address then makes SOCKS rep=0x01 while the panel still looks healthy. generate/cpxy now re-read live source IP on each regenerate. Also fix /usr/local/bin/cpxy symlink: dirname($0) became /usr/local and broke rebind/generate (missing lib.sh). --- scripts/generate.sh | 19 ++++++++++++++++--- scripts/install.sh | 23 ++++++++++++++++++++--- scripts/upgrade.sh | 20 ++++++++++++++++++-- 3 files changed, 54 insertions(+), 8 deletions(-) diff --git a/scripts/generate.sh b/scripts/generate.sh index c619309..61dd282 100755 --- a/scripts/generate.sh +++ b/scripts/generate.sh @@ -13,9 +13,22 @@ cell="$(resolve_cellular 2>/dev/null || true)" if [[ -z "$cell" ]]; then resolve_cellular >/dev/null || true fi -src_ip="${CELLULAR_SOURCE_IP:-}" -if [[ -z "$src_ip" && -n "$cell" ]]; then - src_ip="$(detect_source_ip "$cell" || true)" + +# 始终以当前网卡实 IP 为准:WWAN 重拨后 iface 名常不变,但 CELLULAR_SOURCE_IP 会过期。 +# 过期的 inet4_bind_address 会导致 sing-box 出站失败 → 客户端 SOCKS rep=0x01。 +live_src="" +if [[ -n "$cell" ]]; then + live_src="$(detect_source_ip "$cell" || true)" +fi +src_ip="${live_src:-${CELLULAR_SOURCE_IP:-}}" +if [[ -n "$cell" && -n "$live_src" && "${CELLULAR_SOURCE_IP:-}" != "$live_src" ]]; then + info "源 IP 已漂移: ${CELLULAR_SOURCE_IP:-<空>} → $live_src,写回 settings" + persist_cellular_to_settings "${CONFIG_FILE:-$ROOT_DIR/etc/settings.conf}" "$cell" "$live_src" || true + # 兼容 live 安装布局:settings 在 etc/ + if [[ -f /opt/cellular-proxy/etc/settings.conf ]]; then + persist_cellular_to_settings /opt/cellular-proxy/etc/settings.conf "$cell" "$live_src" || true + fi + CELLULAR_SOURCE_IP="$live_src" fi if [[ -z "$cell" ]]; then diff --git a/scripts/install.sh b/scripts/install.sh index e5f61d3..7f3f2f2 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -98,14 +98,24 @@ info "配置已确认 bind_interface=$cell" install -m 0755 /dev/stdin "$INSTALL_DIR/bin/cpxy" <<'EOF' #!/usr/bin/env bash set -euo pipefail -BASE="$(cd "$(dirname "$0")/.." && pwd)" +# 经 /usr/local/bin/cpxy 符号链接调用时,$0 仍是链接路径;必须 resolve 真实路径 +_self="${BASH_SOURCE[0]:-$0}" +if command -v readlink >/dev/null 2>&1; then + _resolved="$(readlink -f "$_self" 2>/dev/null || true)" + [[ -n "$_resolved" ]] && _self="$_resolved" +fi +BASE="$(cd "$(dirname "$_self")/.." && pwd)" +# 兜底:避免 symlink 解析失败时 BASE 变成 /usr/local +if [[ ! -d "$BASE/scripts" && -d /opt/cellular-proxy/scripts ]]; then + BASE="/opt/cellular-proxy" +fi export CONFIG_FILE="${CONFIG_FILE:-$BASE/etc/settings.conf}" cmd="${1:-help}" shift || true case "$cmd" in detect) exec "$BASE/scripts/detect.sh" "$@" ;; generate) - # 重新探测:若 settings 里网卡丢失则自动补 + # 重新探测:若 settings 里网卡丢失则自动补;源 IP 漂移也刷新 # shellcheck source=/dev/null source "$BASE/scripts/lib.sh" load_config @@ -115,6 +125,13 @@ case "$cmd" in src="$(detect_source_ip "$cell" || true)" persist_cellular_to_settings "$CONFIG_FILE" "$cell" "$src" CELLULAR_IFACE="$cell" + CELLULAR_SOURCE_IP="${src:-}" + fi + elif [[ -n "${CELLULAR_IFACE:-}" ]]; then + src="$(detect_source_ip "$CELLULAR_IFACE" || true)" + if [[ -n "$src" && "${CELLULAR_SOURCE_IP:-}" != "$src" ]]; then + persist_cellular_to_settings "$CONFIG_FILE" "$CELLULAR_IFACE" "$src" + CELLULAR_SOURCE_IP="$src" fi fi "$BASE/scripts/generate.sh" "$BASE/generated" @@ -132,7 +149,7 @@ case "$cmd" in [[ -n "$cell" ]] || die "未能探测数据网卡" src="$(detect_source_ip "$cell" || true)" persist_cellular_to_settings "$CONFIG_FILE" "$cell" "$src" - info "已重新绑定 $cell" + info "已重新绑定 $cell src=${src:-}" exec "$0" generate ;; start) systemctl start cellular-proxy ;; diff --git a/scripts/upgrade.sh b/scripts/upgrade.sh index a80dc56..914b7bd 100755 --- a/scripts/upgrade.sh +++ b/scripts/upgrade.sh @@ -201,7 +201,16 @@ info "配置已确认 bind_interface=$cell" install -m 0755 /dev/stdin "$INSTALL_DIR/bin/cpxy" <<'EOF' #!/usr/bin/env bash set -euo pipefail -BASE="$(cd "$(dirname "$0")/.." && pwd)" +# 经 /usr/local/bin/cpxy 符号链接调用时,$0 仍是链接路径;必须 resolve 真实路径 +_self="${BASH_SOURCE[0]:-$0}" +if command -v readlink >/dev/null 2>&1; then + _resolved="$(readlink -f "$_self" 2>/dev/null || true)" + [[ -n "$_resolved" ]] && _self="$_resolved" +fi +BASE="$(cd "$(dirname "$_self")/.." && pwd)" +if [[ ! -d "$BASE/scripts" && -d /opt/cellular-proxy/scripts ]]; then + BASE="/opt/cellular-proxy" +fi export CONFIG_FILE="${CONFIG_FILE:-$BASE/etc/settings.conf}" cmd="${1:-help}" shift || true @@ -217,6 +226,13 @@ case "$cmd" in src="$(detect_source_ip "$cell" || true)" persist_cellular_to_settings "$CONFIG_FILE" "$cell" "$src" CELLULAR_IFACE="$cell" + CELLULAR_SOURCE_IP="${src:-}" + fi + elif [[ -n "${CELLULAR_IFACE:-}" ]]; then + src="$(detect_source_ip "$CELLULAR_IFACE" || true)" + if [[ -n "$src" && "${CELLULAR_SOURCE_IP:-}" != "$src" ]]; then + persist_cellular_to_settings "$CONFIG_FILE" "$CELLULAR_IFACE" "$src" + CELLULAR_SOURCE_IP="$src" fi fi "$BASE/scripts/generate.sh" "$BASE/generated" @@ -235,7 +251,7 @@ case "$cmd" in [[ -n "$cell" ]] || die "未能探测数据网卡" src="$(detect_source_ip "$cell" || true)" persist_cellular_to_settings "$CONFIG_FILE" "$cell" "$src" - info "已重新绑定 $cell" + info "已重新绑定 $cell src=${src:-}" exec "$0" generate ;; upgrade)