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).
This commit is contained in:
+16
-3
@@ -13,9 +13,22 @@ cell="$(resolve_cellular 2>/dev/null || true)"
|
|||||||
if [[ -z "$cell" ]]; then
|
if [[ -z "$cell" ]]; then
|
||||||
resolve_cellular >/dev/null || true
|
resolve_cellular >/dev/null || true
|
||||||
fi
|
fi
|
||||||
src_ip="${CELLULAR_SOURCE_IP:-}"
|
|
||||||
if [[ -z "$src_ip" && -n "$cell" ]]; then
|
# 始终以当前网卡实 IP 为准:WWAN 重拨后 iface 名常不变,但 CELLULAR_SOURCE_IP 会过期。
|
||||||
src_ip="$(detect_source_ip "$cell" || true)"
|
# 过期的 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
|
fi
|
||||||
|
|
||||||
if [[ -z "$cell" ]]; then
|
if [[ -z "$cell" ]]; then
|
||||||
|
|||||||
+20
-3
@@ -98,14 +98,24 @@ info "配置已确认 bind_interface=$cell"
|
|||||||
install -m 0755 /dev/stdin "$INSTALL_DIR/bin/cpxy" <<'EOF'
|
install -m 0755 /dev/stdin "$INSTALL_DIR/bin/cpxy" <<'EOF'
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -euo pipefail
|
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}"
|
export CONFIG_FILE="${CONFIG_FILE:-$BASE/etc/settings.conf}"
|
||||||
cmd="${1:-help}"
|
cmd="${1:-help}"
|
||||||
shift || true
|
shift || true
|
||||||
case "$cmd" in
|
case "$cmd" in
|
||||||
detect) exec "$BASE/scripts/detect.sh" "$@" ;;
|
detect) exec "$BASE/scripts/detect.sh" "$@" ;;
|
||||||
generate)
|
generate)
|
||||||
# 重新探测:若 settings 里网卡丢失则自动补
|
# 重新探测:若 settings 里网卡丢失则自动补;源 IP 漂移也刷新
|
||||||
# shellcheck source=/dev/null
|
# shellcheck source=/dev/null
|
||||||
source "$BASE/scripts/lib.sh"
|
source "$BASE/scripts/lib.sh"
|
||||||
load_config
|
load_config
|
||||||
@@ -115,6 +125,13 @@ case "$cmd" in
|
|||||||
src="$(detect_source_ip "$cell" || true)"
|
src="$(detect_source_ip "$cell" || true)"
|
||||||
persist_cellular_to_settings "$CONFIG_FILE" "$cell" "$src"
|
persist_cellular_to_settings "$CONFIG_FILE" "$cell" "$src"
|
||||||
CELLULAR_IFACE="$cell"
|
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
|
||||||
fi
|
fi
|
||||||
"$BASE/scripts/generate.sh" "$BASE/generated"
|
"$BASE/scripts/generate.sh" "$BASE/generated"
|
||||||
@@ -132,7 +149,7 @@ case "$cmd" in
|
|||||||
[[ -n "$cell" ]] || die "未能探测数据网卡"
|
[[ -n "$cell" ]] || die "未能探测数据网卡"
|
||||||
src="$(detect_source_ip "$cell" || true)"
|
src="$(detect_source_ip "$cell" || true)"
|
||||||
persist_cellular_to_settings "$CONFIG_FILE" "$cell" "$src"
|
persist_cellular_to_settings "$CONFIG_FILE" "$cell" "$src"
|
||||||
info "已重新绑定 $cell"
|
info "已重新绑定 $cell src=${src:-}"
|
||||||
exec "$0" generate
|
exec "$0" generate
|
||||||
;;
|
;;
|
||||||
start) systemctl start cellular-proxy ;;
|
start) systemctl start cellular-proxy ;;
|
||||||
|
|||||||
+18
-2
@@ -201,7 +201,16 @@ info "配置已确认 bind_interface=$cell"
|
|||||||
install -m 0755 /dev/stdin "$INSTALL_DIR/bin/cpxy" <<'EOF'
|
install -m 0755 /dev/stdin "$INSTALL_DIR/bin/cpxy" <<'EOF'
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -euo pipefail
|
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}"
|
export CONFIG_FILE="${CONFIG_FILE:-$BASE/etc/settings.conf}"
|
||||||
cmd="${1:-help}"
|
cmd="${1:-help}"
|
||||||
shift || true
|
shift || true
|
||||||
@@ -217,6 +226,13 @@ case "$cmd" in
|
|||||||
src="$(detect_source_ip "$cell" || true)"
|
src="$(detect_source_ip "$cell" || true)"
|
||||||
persist_cellular_to_settings "$CONFIG_FILE" "$cell" "$src"
|
persist_cellular_to_settings "$CONFIG_FILE" "$cell" "$src"
|
||||||
CELLULAR_IFACE="$cell"
|
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
|
||||||
fi
|
fi
|
||||||
"$BASE/scripts/generate.sh" "$BASE/generated"
|
"$BASE/scripts/generate.sh" "$BASE/generated"
|
||||||
@@ -235,7 +251,7 @@ case "$cmd" in
|
|||||||
[[ -n "$cell" ]] || die "未能探测数据网卡"
|
[[ -n "$cell" ]] || die "未能探测数据网卡"
|
||||||
src="$(detect_source_ip "$cell" || true)"
|
src="$(detect_source_ip "$cell" || true)"
|
||||||
persist_cellular_to_settings "$CONFIG_FILE" "$cell" "$src"
|
persist_cellular_to_settings "$CONFIG_FILE" "$cell" "$src"
|
||||||
info "已重新绑定 $cell"
|
info "已重新绑定 $cell src=${src:-}"
|
||||||
exec "$0" generate
|
exec "$0" generate
|
||||||
;;
|
;;
|
||||||
upgrade)
|
upgrade)
|
||||||
|
|||||||
Reference in New Issue
Block a user