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:
@@ -95,16 +95,37 @@ cpxy watch once # 手动跑一轮检查
|
||||
|
||||
## 自动探测逻辑(摘要)
|
||||
|
||||
按分数选择,优先:
|
||||
顺序如下,前一步命中即返回:
|
||||
|
||||
1. 驱动像蜂窝/USB 拨号:`qmi_wwan`、`cdc_mbim`、`cdc_ether`、`rndis_host` 等
|
||||
2. 名称含:`wwan` / `wwp` / `usb` / `enx` / `ppp` / `rmnet` / `ccmni` …
|
||||
0. **ModemManager bearer**(`mmcli -b` 报的 `interface:`)—— 最权威,优先采用
|
||||
1. 驱动像蜂窝/USB 拨号:`qmi_wwan`、`cdc_mbim`、`cdc_ether`、`rndis_host`、`bam-dmux`、`rmnet*` 等(+100)
|
||||
2. 名称含 `wwan` / `wwp` / `ppp` / `rmnet` / `ccmni` …(+40,弱启发式)
|
||||
3. **不是** 系统默认路由网卡(默认通常是 WiFi)
|
||||
4. 多默认路由时取次要默认口
|
||||
5. 回退:任意非默认且有 IPv4 的物理网卡
|
||||
|
||||
探测失败会直接报错并提示用 `--iface`。
|
||||
|
||||
### 绝不绑定 USB gadget 网卡
|
||||
|
||||
设备把自己当 USB 网卡挂给上游主机时会出现 `usb0` / `rndis0`(驱动 `configfs-gadget`、
|
||||
`g_ether` 等)。那是「本机 → PC」的下行链路,一旦被当成代理出口,所有出站都会
|
||||
`context deadline exceeded`,SOCKS5 客户端看到的就是 `socks connect failed rep=0x01`。
|
||||
|
||||
因此:
|
||||
|
||||
- `iface_is_usb_gadget()` 按驱动名与 gadget 总线路径识别这类接口,打分阶段直接跳过;
|
||||
- 默认探测关键词不再包含 `usb` / `enx`,升级时会自动从已有 `settings.conf` 里剔除;
|
||||
- 即使手工把 `CELLULAR_IFACE=usb0` 写进配置或用 `--iface usb0`,`detect` / `generate` /
|
||||
`install` / `upgrade` / `watch` 都会拒绝并改用 ModemManager 的结果;
|
||||
- 真正的 USB 上行模组(`rndis_host`、`cdc_*`、`qmi_wwan`)是 host 侧驱动,不受影响。
|
||||
|
||||
回归测试(不需要真机,纯离线,覆盖 18 条断言):
|
||||
|
||||
```bash
|
||||
bash tests/detect-gadget.sh
|
||||
```
|
||||
|
||||
## 手动安装
|
||||
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user