实例里按应用走代理(VpnService 只接名单里的应用)

Offen
#27 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Anfängerfreundlichkeit
15/100
Issue-Typ
Feature
Klarheit
Größtenteils klar
Aktivitätsstatus
Aktiv
Tech-Stack
android, go
Bereich
mobile, networking

Rechercherichtung

The issue names no source files; the entry points are VpnService.Builder.addAllowedApplication, the adb push from the manager to the guest, and the existing per-package split in the execution bridge. Start by settling the open questions in the issue: VPN versus iptables, UDP and DNS handling, and what happens when the proxy drops. Done means the acceptance checks pass: allowed apps use the host proxy, others connect directly, and the VPN reconnects after a restart without re-authorization.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

enhancement

要做什么

用户在实例里选哪些应用走代理,其余照常直连。比如海外游戏走代理,国服游戏和别的应用不受影响。

做法:在实例里放一个 VPN 服务,用 VpnService.Builder.addAllowedApplication(包名) 只把选中的应用接进 VPN,再把它们的流量转给宿主上的代理。

现在的情况

  • 实例的网络由 qemu 在宿主上直接发出,Windows 系统代理管不到。
  • 宿主的代理软件开 TUN 模式能接住,但它只看得到 qemu 这一个进程,整台实例要么全走代理、要么全直连,分不出客体里的应用。
  • 在实例里自己装支持「分应用代理」的 VPN 客户端能做到,用的也是这个接口;但每台实例都要各装一份、各配一遍。

大致怎么做

  • 客体:一个小 VPN 应用。开 tun,只用 addAllowedApplication 加名单里的包,把 TCP 和 UDP 转成 SOCKS5 发给宿主代理。它自己的连接不在名单里,不会绕回 VPN。
  • 宿主:不自带代理,也不做订阅链接(11-02 定),用用户已有的代理软件(HTTP / SOCKS5 端口),订阅在那个软件里导入。客体经 10.0.2.2 访问宿主的回环地址,所以代理只监听 127.0.0.1 也能用,不用开「允许局域网连接」。
  • 管理器:每台实例设代理地址和应用名单,用 adb 推给客体里的 VPN 应用。默认地址可以照 #23 的规则从 Windows 手动代理里取,把 127.0.0.1 换成 10.0.2.2。

还要定的

  1. 用 VPN 还是 iptables。 实例有 root,也可以用 iptables 按应用的 UID 把流量重定向到客体里的透明代理,不建 VPN。
    • VPN:标准接口,不靠 root;但名单里的应用能看出自己走了 VPN,有的游戏查到 VPN 会提示或不让登录。名单外的应用列网卡时可能也看得到 tun0。
    • iptables:应用看不出来;但要 root,和系统镜像绑得更紧。
  2. UDP 和 DNS。 不少游戏走 UDP,HTTP 代理转不了,要用 SOCKS5 的 UDP 转发。名单里应用的 DNS 也要走代理,不然海外域名可能解析错。
  3. 授权弹窗。 第一次开 VPN 系统会弹确认框。打算用 adb 预先授权(appops set <包名> ACTIVATE_VPN allow),再设成始终开启,开机后自动连上。要实测。
  4. 代理断了怎么办。 名单里的应用是断网,还是退回直连。
  5. VPN 应用放哪。 像宿主输入法那样单独一个仓库、由管理器装进实例,还是放进系统镜像。
  6. 名字。 执行桥已经有「按包名分流」(名单外的进程撤回桥),这个功能在界面和文档里叫「按应用走代理」,免得混。

验收

  • 名单里的应用走宿主代理,名单外的直连:两个应用分别查出口 IP。
  • 名单里应用的 UDP 和 DNS 也走代理。
  • 代理只监听 127.0.0.1 也能用。
  • 重开实例不用再点授权,VPN 自动连上。

相关

  • #25:游戏中心,有人希望能下海外游戏
  • #23:管理器的代理规则(Windows 手动代理、HTTPS_PROXY)
  • ModAVD/ModAVD#56:用户提的同一个需求(指定的应用走代理、每台实例各自设),另外希望能直接填代理订阅链接,这部分不做(见上面「宿主」一条)
Vorherrschende Sprache
Go
Sterne
0
Forks
1
Ø Merge
2 Std. 42 Min.
Gemergte PRs (30 T.)
13

Entwicklungsumgebung

Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus ModAVD/ModAVDManager

Alle Issues in ModAVD/ModAVDManager

Ähnliche Issues

Weitere Issues zu Go

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.