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:
+25
-2
@@ -232,17 +232,36 @@ prepare_settings() {
|
||||
|
||||
# shellcheck source=/dev/null
|
||||
source "$src/scripts/lib.sh"
|
||||
CELLULAR_IFACE_PATTERNS="${CELLULAR_IFACE_PATTERNS:-wwan,wwp,usb,enx,ppp,cdc,rmnet,ccmni,mbim,qmi}"
|
||||
CELLULAR_IFACE_PATTERNS="${CELLULAR_IFACE_PATTERNS:-wwan,wwp,ppp,cdc,rmnet,ccmni,mbim,qmi}"
|
||||
REQUIRE_CELLULAR_IFACE=false
|
||||
|
||||
# 迁移旧配置:usb/enx 关键词会命中本机的 USB gadget 网卡(usb0),必须剔除
|
||||
local old_patterns cleaned
|
||||
old_patterns="$(awk -F= '/^CELLULAR_IFACE_PATTERNS=/{print substr($0,index($0,"=")+1); exit}' "$conf" 2>/dev/null || true)"
|
||||
if [[ -n "$old_patterns" ]]; then
|
||||
cleaned="$(printf '%s' "$old_patterns" | tr ',' '\n' | sed 's/[[:space:]]//g' \
|
||||
| grep -vxE 'usb|enx' | paste -sd, - 2>/dev/null || true)"
|
||||
if [[ -n "$cleaned" && "$cleaned" != "$old_patterns" ]]; then
|
||||
set_kv "$conf" CELLULAR_IFACE_PATTERNS "$cleaned"
|
||||
CELLULAR_IFACE_PATTERNS="$cleaned"
|
||||
warn "已清理 CELLULAR_IFACE_PATTERNS: $old_patterns -> $cleaned"
|
||||
fi
|
||||
fi
|
||||
|
||||
local cell=""
|
||||
if [[ -n "$OPT_IFACE" ]]; then
|
||||
cell="$OPT_IFACE"
|
||||
info "使用 --iface $cell"
|
||||
if iface_is_usb_gadget "$cell"; then
|
||||
die "--iface $cell 是本机对上游主机暴露的 USB gadget 网卡,不能作为数据出口"
|
||||
fi
|
||||
elif [[ -f "$live" ]] && grep -qE '^CELLULAR_IFACE=.' "$live" 2>/dev/null; then
|
||||
# shellcheck disable=SC1090
|
||||
cell="$(awk -F= '/^CELLULAR_IFACE=/{print substr($0,index($0,"=")+1); exit}' "$live")"
|
||||
if [[ -n "$cell" ]] && iface_exists "$cell"; then
|
||||
if [[ -n "$cell" ]] && iface_is_usb_gadget "$cell"; then
|
||||
warn "已有配置里的 $cell 是 USB gadget 网卡(面向上游主机),丢弃并重新探测"
|
||||
cell=""
|
||||
elif [[ -n "$cell" ]] && iface_exists "$cell"; then
|
||||
info "沿用已绑定网卡: $cell"
|
||||
else
|
||||
cell=""
|
||||
@@ -268,6 +287,10 @@ prepare_settings() {
|
||||
die "网卡不存在: $cell"
|
||||
fi
|
||||
|
||||
if iface_is_usb_gadget "$cell"; then
|
||||
die "拒绝把 USB gadget 网卡 $cell 写成数据出口,请用 --iface wwanX 指定真实数据网卡"
|
||||
fi
|
||||
|
||||
local src_ip
|
||||
src_ip="$(detect_source_ip "$cell" || true)"
|
||||
set_kv "$conf" CELLULAR_IFACE "$cell"
|
||||
|
||||
Reference in New Issue
Block a user