设备把自己当 USB 网卡挂给上游主机时会出现 usb0(驱动 configfs-gadget.g1, IP 192.168.68.1)。该链路只通向 PC,被当成出口后所有出站都 context deadline exceeded,客户端看到 socks connect failed rep=0x01。 误选原因:score_iface_as_cellular 给 usb0 与真出口 wwan0 都打 175 分。 usb0 靠名称命中 patterns 里的 usb(+80)与非默认路由(+40);wwan0 的 bam-dmux 驱动不在白名单里,白丢 +100。detect_cellular_iface 用 -gt 比较, list_ifaces 按名排序让 usb0 先入选,平分下无法被顶替。 改动: - lib.sh 新增 iface_is_usb_gadget(),按驱动名与 gadget 总线路径识别, 并并入 is_virtual_or_skip_iface(usb0 评分 175 -> 0) - 驱动白名单补 bam-dmux/bam_dmux/qcom-ipa/ipa_wan;名称权重 80 -> 40, 确保驱动证据始终压过名称猜测 - 新增 detect_cellular_iface_via_mm(),把 ModemManager bearer 的 interface: 作为第 0 步权威来源 - detect_cellular_iface / resolve_cellular 全链路拒绝 gadget 网卡, 取不到真出口时按 REQUIRE_CELLULAR_IFACE 直接失败而不是绑错 - generate/install/upgrade/watch/detect/verify 各入口独立设闸, verify.sh 发现出口是 gadget 时直接 exit 4 并给出修复命令 - 默认 CELLULAR_IFACE_PATTERNS 去掉 usb/enx;upgrade.sh 与根 install.sh 就地迁移已有 settings.conf,旧机器升级即修复 - 新增 tests/detect-gadget.sh:18 条离线断言,无需真机
54 lines
2.0 KiB
Bash
Executable File
54 lines
2.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
# shellcheck source=lib.sh
|
|
source "$ROOT_DIR/scripts/lib.sh"
|
|
if [[ -f "${CONFIG_FILE:-$ROOT_DIR/config/settings.conf}" ]]; then
|
|
load_config
|
|
else
|
|
CELLULAR_IFACE_PATTERNS="${CELLULAR_IFACE_PATTERNS:-wwan,wwp,ppp,cdc,rmnet,ccmni,mbim,qmi}"
|
|
REQUIRE_CELLULAR_IFACE=false
|
|
CELLULAR_IFACE=
|
|
fi
|
|
|
|
echo "========== 主机 =========="
|
|
echo "hostname : $(hostname)"
|
|
echo "kernel : $(uname -r)"
|
|
echo "arch : $(uname -m)"
|
|
echo "mem_total: $(awk '/MemTotal/ {printf "%.0f MB", $2/1024}' /proc/meminfo 2>/dev/null || echo unknown)"
|
|
echo "mem_avail: $(awk '/MemAvailable/ {printf "%.0f MB", $2/1024}' /proc/meminfo 2>/dev/null || echo unknown)"
|
|
echo
|
|
|
|
echo "========== 接口列表 =========="
|
|
printf '%-12s %-10s %-18s %-12s %s\n' "IFACE" "STATE" "IPv4" "DRIVER" "SCORE"
|
|
default_if="$(detect_default_iface || true)"
|
|
while IFS='|' read -r name state ip; do
|
|
[[ -z "$name" ]] && continue
|
|
drv="$(iface_driver "$name" || true)"
|
|
if iface_is_usb_gadget "$name"; then
|
|
printf '%-12s %-10s %-18s %-12s %s\n' "$name" "$state" "${ip:-}" "${drv:-}" "skip(USB gadget: 面向上游主机,不可作出口)"
|
|
continue
|
|
fi
|
|
is_virtual_or_skip_iface "$name" && continue
|
|
sc="$(score_iface_as_cellular "$name" "$default_if")"
|
|
printf '%-12s %-10s %-18s %-12s %s\n' "$name" "$state" "${ip:-}" "${drv:-}" "$sc"
|
|
done < <(list_ifaces)
|
|
echo
|
|
|
|
echo "========== 默认路由 =========="
|
|
ip route show default 2>/dev/null || true
|
|
echo
|
|
echo "default iface: ${default_if:-none}"
|
|
echo
|
|
|
|
echo "========== 数据网卡(代理出口) =========="
|
|
cell="$(detect_cellular_iface "${CELLULAR_IFACE:-}" 2>/dev/null || true)"
|
|
if [[ -n "$cell" ]]; then
|
|
echo "CELLULAR_IFACE=$cell ip=$(detect_source_ip "$cell" || true) driver=$(iface_driver "$cell" || true)"
|
|
echo "说明: 走本代理的流量将从该网卡出(数据流量)"
|
|
else
|
|
echo "未能自动探测数据网卡。"
|
|
echo "请手动: CELLULAR_IFACE=网卡名 或 cpxy rebind"
|
|
exit 2
|
|
fi
|