fix(detect): never bind USB gadget iface as proxy egress
设备把自己当 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 条离线断言,无需真机
This commit is contained in:
@@ -38,6 +38,32 @@ case "${QUICK,,}" in
|
||||
*) QUICK=false ;;
|
||||
esac
|
||||
|
||||
# 出口一旦绑成 USB gadget 网卡,所有代理请求都会超时(客户端看到 SOCKS rep=0x01)。
|
||||
# 在打网络探测之前先点名,免得只剩一个含糊的 FAIL。
|
||||
cfg_json="${INSTALL_DIR:-/opt/cellular-proxy}/etc/config.json"
|
||||
cfg_bind=""
|
||||
if command -v python3 >/dev/null 2>&1 && [[ -f "$cfg_json" ]]; then
|
||||
cfg_bind="$(python3 -c '
|
||||
import json, sys
|
||||
try:
|
||||
cfg = json.load(open(sys.argv[1]))
|
||||
for o in cfg.get("outbounds") or []:
|
||||
if o.get("tag") == "cellular":
|
||||
print(o.get("bind_interface") or "")
|
||||
break
|
||||
except Exception:
|
||||
pass
|
||||
' "$cfg_json" 2>/dev/null || true)"
|
||||
fi
|
||||
for _ifc in "${CELLULAR_IFACE:-}" "$cfg_bind"; do
|
||||
[[ -n "$_ifc" ]] || continue
|
||||
if iface_is_usb_gadget "$_ifc"; then
|
||||
err "出口绑在 USB gadget 网卡 $_ifc 上(那是本机 -> 上游主机的下行链路),代理必定超时"
|
||||
err "修复: sudo cpxy rebind && sudo cpxy generate"
|
||||
exit 4
|
||||
fi
|
||||
done
|
||||
|
||||
curl_ip() {
|
||||
# 单次探测,严格超时,绝不无限挂起
|
||||
local extra=("$@")
|
||||
|
||||
Reference in New Issue
Block a user