安卓平台上 Clash / Mihomo 与 Tailscale / Zerotier APP 的兼容性?

众所周知,安卓同时只能有一个VPN处在运行状态,因此最近尝试在手机上把 Mihomo 内核和 Tailscale APP 一起使用,手机已经root,用box4magisk模块来运行mihomo。

目前尝试还没有成功,发现存在一些DNS方面的问题。。。具体而言,当安卓VPN Service启动的时候,mihomo的DNS劫持会失效,用wireshark抓包能看到所有的DNS查询都直接走wlan0了,mihomo dns不会收到任何dns流量

而且,模块配置不管是用tproxy模式还是直接用内核的tun模式,都是一样的问题。不知坛友们有无这方面经验 :innocent:


Mihomo内核使用的是github actions最新版本。最简配置如下:

mixed-port: 7890
allow-lan: false
bind-address: "*"
ipv6: false
mode: rule
log-level: debug
find-process-mode: always

external-controller: 127.0.0.1:9090
external-ui: ui

profile:
  store-selected: true
  store-fake-ip: true

dns:
  enable: true
  use-hosts: true
  use-system-hosts: true
  listen: 0.0.0.0:1053
  ipv6: false
  
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.0/16
  fake-ip-filter:
    # mDNS
    - "*.lan"
    - "*.local"
  nameserver:
    - "223.5.5.5"
    - "180.76.76.76"
    - "119.29.29.29"
  fallback:
    - "tls://1.1.1.1#Proxy"
    - "tls://8.8.8.8#Proxy"
  fallback-filter:
    geoip: true
    geoip-code: CN
    ipcidr:
      - 240.0.0.0/4

tun:
  enable: true
  stack: system
  device: tun9
  dns-hijack:
    - "0.0.0.0:53"
    - "tcp://0.0.0.0:53"
  auto-detect-interface: true
  strict-route: true
  gso: true
  auto-route: true
  route-exclude-address:
    - "100.64.0.0/10"        # Tailscale

proxy-providers:
  airport_air:
    type: http
    url: 机场订阅链接
    path: ./airport.yaml
    interval: 86400
    health-check:
      enable: false
      interval: 600
      url: https://www.gstatic.com/generate_204


proxy-groups:
  - name: Proxy
    type: select
    proxies:
      - "airport"
      - Direct

  - name: airport
    type: select
    use:
      - airport_air
    proxies:
      - Direct

  - name: Direct
    type: select
    proxies:
      - DIRECT

  - name: "🐟 漏网之鱼"
    type: select
    proxies:
      - Proxy
      - Direct

rules:
  # Private and LAN
  - GEOIP,private,DIRECT,no-resolve
  - GEOSITE,private,DIRECT,no-resolve
  - DOMAIN-SUFFIX,msftconnecttest.com,DIRECT,no-resolve
  
  # Tailscale
  - IP-CIDR,100.64.0.0/10,DIRECT,no-resolve

  # CN
  - GEOSITE,cn,Direct

  # PROXY
  - GEOSITE,category-social-media-!cn,Proxy
  - GEOSITE,category-entertainment,Proxy
  - GEOSITE,category-communication,Proxy
  - GEOSITE,category-scholar-!cn,Proxy
  - GEOSITE,category-orgs,Proxy
  - GEOSITE,category-porn,Proxy
  - GEOSITE,category-android-app-download,Proxy
  - GEOSITE,category-forums,Proxy
  - GEOSITE,category-anticensorship,Proxy
  - GEOSITE,category-dev,Proxy
  - GEOSITE,gfw,Proxy

  - GEOIP,telegram,Proxy
  - GEOIP,CN,Direct

  - MATCH,🐟 漏网之鱼

补充:

  1. 后续经过尝试,貌似所有安卓VPN都与mihomo有不兼容的问题,不仅仅局限于Taliscale/Zerotier

  2. 关于为什么不用 magisk-tailscaled 模块?因为此模块存在一些问题,包括暂不支持UDP、无法方便地投送文件、暂不支持moonlight串流等,无法完美替代Tailscale APP

14 个赞

帮顶,搞不懂PC端为什么没问题·

3 个赞

安卓启动 VPN service的时候,会修改nat表让所有流量走网卡。

针对DNS的问题,我想到一个解决方案是:

在tailscale 控制台将magic DNS开启,并设置DNS为clash监听的地址(clash配置需要调整DNS监听端口为53)

1 个赞

嗯。。我这里尝试了一下
Mihomo修改DNS监听配置为listen: 0.0.0.0:53
用Termux测试了一下本地DNS有效:

在headscale那边把Tailscale的DNS Resolvers修改为127.0.0.1

不过全部启动之后还是似乎老样子 :bili_008: 国外网站访问不了,Termux curl google依然拿到的是真实IP,且连接被拒绝

有试过把fake-ip改成redir-host,并加上nameserver-policy,问题并没有改善

这篇文章我也看过 :joy: 其实VPN Service那边应该并不是简单地把所有流量都路由到VPN应用中,按文档说法,只会路由builder.addRoute设置过的给定网段

Tailscale App的addRoute设置的是100.64.0.0/10,因此理论上只有这个Tailscale网段的流量才会被Tailscale处理,其他地址范围应该是不受影响的
image

另外,mihomo创建的路由条目优先级其实很高,比VPN Service的tun0高很多,理论上应该轮不到 VPN Service 第一个处理DNS查询才对

目前不太清楚DNS那边实际上是怎么处理的,有可能针对VPN Service有单独的处理?

1 个赞

之前已经搞定了,用了大半个月没啥问题。等mihomo那边发新版之后再发解决方案。
急用的可以私聊我 :tieba_003:

1 个赞

学习,Mark;

帮顶一下。。