V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
AllenHua
V2EX  ›  问与答

请教 Clash 透明代理问题, iPhone 的哔哩哔哩、微博 app 无法联网,但是网页正常

  •  
  •   AllenHua · 2021-11-06 21:13:06 +08:00 · 13070 次点击
    这是一个创建于 1109 天前的主题,其中的信息可能已经有所发展或是发生改变。

    和这个 issue 类似,但是我没找到原因在哪,求助攻。

    clash 透明代理跑在局域网 n1 这台设备上。

    • iPhone 的哔哩哔哩、微博 app 无法联网,但是网页正常
    • 桌面平台设备访问 bilibili 、weibo web 也正常
    • 安卓设备访问 share 微博客户端也 ok (没有安装微博官方 app 就没测试了)

    clash config.yaml 配置

    redir-port: 7892
    mixed-port: 7890
    # Transparent proxy server port for Linux (TProxy TCP and TProxy UDP)
    #tproxy-port: 7893
    allow-lan: true
    mode: rule 
    # 设置输出日志的等级 (默认为 info)
    # silent / info / warning / error / debug
    log-level: silent 
    external-controller: 0.0.0.0:9090
    secret: ""
    external-ui: dashboard
    # hosts 设置,只有当 DNS 模式为 redir-host 时生效
    hosts:
      # '*.clash.dev': 127.0.0.1
      # '.dev': 127.0.0.1
      # 'alpha.clash.dev': '::1'
    
    dns:
      enable: true # 启用自定义 DNS
      ipv6: false # default is false
      listen: 0.0.0.0:53
      enhanced-mode: fake-ip  #DNS 模式,这里推荐使用 fake-ip ,因为后续的 iptables 规则是根据 fake-ip 做的
      fake-ip-range: 198.18.0.1/16 # if you don't know what it is, don't change it
      default-nameserver:
        - 180.76.76.76
        - 119.29.29.29
        - 223.5.5.5
      nameserver:
        - https://doh.pub/dns-query
        - https://dns.alidns.com/dns-query
    

    其中 fallback 相关的配置已经注释掉了

      fallback:
        - 101.6.6.6:5353
      fallback-filter:
        geoip: true
      ipcidr:
        - 240.0.0.0/4
    

    clash debug 级别的日志

    [TCP] dial 🎯 全球直连 (match GeoIP/CN) to 202.113.3.108:43388 error: dial tcp4 202.113.3.108:43388: i/o timeout
    
    [TCP] dial 🎯 全球直连 (match GeoIP/CN) to 101.229.42.233:51413 error: dial tcp4 101.229.42.233:51413: connect: connection refused
    
    find process name Process error: no such process
    

    感觉还是 dns 的问题,可以看本文开头那个 issue

    已经查了一些资料

    第 1 条附言  ·  2021-11-07 08:24:42 +08:00

    标题中的问题解决了,早上醒来观察了一下微博自带设置和系统中微博 app 的设置,最终发现“本地网络” 没有给权限,打开后就正常了,微博 app 和 哔哩哔哩 app正常联网了。

    20211107082024.png

    由于平时使用 app 大部分都是只给最小权限,这里忽略了……

    然后还有一点感想,人在清醒的时候更容易发现 bug 啊(去年有一次在公司午睡后起来也是立马解决了 bug)。大家都要多注意休息。

    37 条回复    2022-01-13 10:49:05 +08:00
    bigbyto
        1
    bigbyto  
       2021-11-06 21:43:16 +08:00 via iPhone   ❤️ 1
    我感觉 clash 的 fakeip 不好用。我的透明代理 dns 方案是 dnsmasq+dnscrypt-proxy ,前者分流国内域名,后者设置 socks5 代理用 google 的 doh 解决污染问题。
    AllenHua
        2
    AllenHua  
    OP
       2021-11-06 21:49:26 +08:00
    @bigbyto #1 可以分享一下吗

    我也搜到了很多说法,clash 这种方案做透明代理都不太适合
    Love4Taylor
        3
    Love4Taylor  
       2021-11-06 21:59:06 +08:00   ❤️ 1
    fakeip 的话等等支持持久化的版本发布吧

    https://github.com/Dreamacro/clash/pull/1662
    yanyumihuang
        4
    yanyumihuang  
       2021-11-06 22:12:31 +08:00 via Android
    你是 openclash ,还是 clash 的 tun 模式。前者不懂,后者用 iptables 将 dns 指向 clash 监听的端口
    yanyumihuang
        5
    yanyumihuang  
       2021-11-06 22:14:18 +08:00 via Android
    另外用不到 v6 就把 ipv6 关了,设备会优先使用 ipv6 ,这样会出现问题
    bigbyto
        6
    bigbyto  
       2021-11-06 22:15:36 +08:00 via iPhone
    @AllenHua clash 可以做透明代理,不过别用它的 fakeip ,你可以参考我那个 dns 方案,我家里正在用的,很稳定。
    AllenHua
        7
    AllenHua  
    OP
       2021-11-06 22:15:48 +08:00
    @yanyumihuang #4 运行在 armbian 上,是 clash core 。

    iptables 应该没什么问题

    ```
    iptables -t nat -N clash
    iptables -t nat -N clash_dns

    iptables -t nat -A PREROUTING -p tcp --dport 53 -d 198.18.0.0/24 -j clash_dns
    iptables -t nat -A PREROUTING -p udp --dport 53 -d 198.18.0.0/24 -j clash_dns
    iptables -t nat -A PREROUTING -p tcp -j clash

    iptables -t nat -A clash_dns -p udp --dport 53 -d 198.18.0.0/24 -j DNAT --to-destination 10.10.10.4:53
    iptables -t nat -A clash_dns -p tcp --dport 53 -d 198.18.0.0/24 -j DNAT --to-destination 10.10.10.4:53

    iptables -t nat -A clash -d 1.0.0.0/8 -j ACCEPT
    iptables -t nat -A clash -d 10.0.0.0/8 -j ACCEPT
    iptables -t nat -A clash -d 100.64.0.0/10 -j ACCEPT
    iptables -t nat -A clash -d 127.0.0.0/8 -j ACCEPT
    iptables -t nat -A clash -d 169.254.0.0/16 -j ACCEPT
    iptables -t nat -A clash -d 172.16.0.0/12 -j ACCEPT
    iptables -t nat -A clash -d 192.168.0.0/16 -j ACCEPT
    iptables -t nat -A clash -d 224.0.0.0/4 -j ACCEPT
    iptables -t nat -A clash -d 240.0.0.0/4 -j ACCEPT
    iptables -t nat -A clash -d 192.168.1.2/32 -j ACCEPT

    iptables -t nat -A clash -p tcp --dport 22 -d 10.10.10.4/32 -j ACCEPT

    iptables -t nat -A clash -p tcp -j REDIRECT --to-ports 7892
    ```

    注:n1 的 ip 是 10.10.10.4
    AllenHua
        8
    AllenHua  
    OP
       2021-11-06 22:17:18 +08:00
    @yanyumihuang #5 是的 我的 ipv6 已经全部关掉了。主路由是个 x86 openwrt


    @bigbyto #6 所以有什么教程可以分享的吗 刚搜了一下 dnscrypt-proxy 部署的记录文章都很少
    hronro
        9
    hronro  
       2021-11-06 23:13:12 +08:00
    @bigbyto #1 我之前也是没用 clash 内置的 DNS ,但后来发现如果这样 clash 很多域名匹配的规则就无法生效了,因为 clash 拿不到域名的信息。请问你是如何解决这个问题的?
    bigbyto
        10
    bigbyto  
       2021-11-06 23:19:16 +08:00 via iPhone
    @hronro 我的方案主要就是用 dnscrypt-proxy 解决 dns 污染。家里有点事在处理,晚点详细说下。
    bigbyto
        11
    bigbyto  
       2021-11-06 23:20:16 +08:00 via iPhone
    @AllenHua 官方文档挺详细的,有空我整理一下我的配置
    AllenHua
        12
    AllenHua  
    OP
       2021-11-06 23:36:28 +08:00
    @bigbyto #11 很期待你的分享。我刚参考了一下这个 https://github.com/XXpE3/clash_raspberrypi/blob/master/dnscrypt-proxy.md 但是提示 `[FATAL] Unsupported key in configuration file: [fallback_resolver]` 我明明用了更新的版本。注释了这一行再运行发现提示 `[FATAL] No servers configured` 官方指导性的 toml config file 800+ lines ,的确有些头疼啊。我还原了 iptables 暂时先用着 clash 内置 dns 了
    Kinnice
        13
    Kinnice  
       2021-11-07 00:05:13 +08:00 via Android
    最好不要使用 fakeip
    xenme
        14
    xenme  
       2021-11-07 06:56:05 +08:00 via iPhone
    dns 加 ip 分流,clash 只做透明代理比较稳定
    yanyumihuang
        15
    yanyumihuang  
       2021-11-07 08:32:28 +08:00
    @AllenHua 昨晚睡了,我使用的 clash 的 tun 版本,fake ip 模式,这是目前我在用的 iptables ,只要 dns 和网关指定为相应 IP ,就能透明上网。没关 ipV6 时,因为抢答,手机总是不能透明代理,关了 ipv6 ,发现国内 app 巨慢,加上下面的 iptablles 就 OK 了。这个还解决了 Android 微信视频别人听不到你讲话的问题。因为我用的是 tun 版本,所以不需要最后将所有流量转向 7892 端口,直接就能处理了
    sudo iptables -t nat -N clash
    sudo iptables -t nat -N clash_dns

    sudo iptables -t nat -A PREROUTING -j clash_dns
    sudo iptables -t nat -A PREROUTING -j clash

    sudo iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.2.2

    sudo iptables -t nat -A clash_dns -p udp --dport 53 -j DNAT --to-destination 192.168.2.2:53
    sudo iptables -t nat -A clash_dns -p tcp --dport 53 -j DNAT --to-destination 192.168.2.2:53
    sudo iptables -t nat -A clash -d 0.0.0.0/8 -j RETURN
    sudo iptables -t nat -A clash -d 10.0.0.0/8 -j RETURN
    sudo iptables -t nat -A clash -d 127.0.0.0/8 -j RETURN
    sudo iptables -t nat -A clash -d 169.254.0.0/16 -j RETURN
    sudo iptables -t nat -A clash -d 172.16.0.0/12 -j RETURN
    sudo iptables -t nat -A clash -d 192.168.0.0/16 -j RETURN
    sudo iptables -t nat -A clash -d 224.0.0.0/4 -j RETURN
    sudo iptables -t nat -A clash -d 240.0.0.0/4 -j RETURN
    AllenHua
        16
    AllenHua  
    OP
       2021-11-07 08:32:40 +08:00
    另外我还有几个问题

    1. Chrome 和 Alook 没有给 “本地网络” 的权限但是可以正常使用代理。我是给 wifi 手动设置代理的,代理 ip 就是 n1 的 ip 10.10.10.4 ,为什么 Chrome 和 Alook 不需要这个权限呢?


    Firefox 和 Edge 没有这个设置。

    2. Transparent proxy 可以代理哪些协议? 看 https://lancellc.gitbook.io/clash/clash-config-file/an-example-configuration-file

    ```
    # Transparent proxy server port for Linux and macOS (Redirect TCP and TProxy UDP)
    # redir-port: 7892
    # Transparent proxy server port for Linux (TProxy TCP and TProxy UDP)
    # tproxy-port: 7893
    ```

    为什么看到的透明代理教程都是说设置好了,将局域网客户端的 default gateway 和 dns 都指向透明代理设备的 IP 然后就可以无感翻强了。不太明白这里的实践,这是怎么实现的?我为什么不行,还是需要设置系统代理,或者手动对浏览器、终端设置代理才可以帆樯。telegram 倒是可以“无感翻强”……

    求解
    AllenHua
        17
    AllenHua  
    OP
       2021-11-07 08:34:53 +08:00
    @yanyumihuang #15 谢谢分享,我回头用用 tun ,这个是在 clash premium 里?听说没有开源(不像基础 clash core 开源)
    yanyumihuang
        18
    yanyumihuang  
       2021-11-07 08:43:30 +08:00
    @AllenHua 嗯,和开源的版本是共用代码,然后另外增加了一些功能。搞透明代理建议用 tun ,简单方便,用 root 模式跑起来后,执行上面我发的 iptables 后将设备的 dns 和网关设置为运行 clash 的设备的 IP 就好。tun 版本有个缺点,ip 直连类无法处理。比如 telegram 需要手动设置代理外。想解决这个问题,就再加上一个 iptables
    sudo iptables -t nat -A clash -p tcp -j REDIRECT --to-ports 7892
    即可
    hronro
        19
    hronro  
       2021-11-07 12:33:41 +08:00
    @AllenHua #16
    「将局域网客户端的 default gateway 和 dns 都指向透明代理设备的 IP 然后就可以无感翻强了。不太明白这里的实践,这是怎么实现的?」
    把你路由器上 DHCP server 的配置里面的 gateway 和 DNS 改成你想要的 IP 就行了。
    AllenHua
        20
    AllenHua  
    OP
       2021-11-07 12:51:09 +08:00
    @hronro #19 我的确是这样做的 可以看这个 https://www.v2ex.com/t/813612
    这样「无感帆樯」只有 telegram 可以做到,chrome terminal 依然要 set proxy

    比如 terminal

    ```
    export http_proxy=http://10.10.10.4:7890
    export https_proxy=http://10.10.10.4:7890
    ```

    比如 chrome 的 switchy omega 里配置一个 profile 使用 10.10.10.4 的 socks 、http(s) 代理

    终端和浏览器这样配置之后才可以帆樯。我想象的无感是局域网设备不需要做任何配置的。如果我理解的有误,还请指正。

    ```
    # Transparent proxy server port for Linux and macOS (Redirect TCP and TProxy UDP)
    redir-port: 7892
    ```

    7892 这个端口 不只能 Redirect TCP and TProxy UDP 么
    eggt
        21
    eggt  
       2021-11-07 14:58:37 +08:00 via iPhone
    楼主,我倒是想请教下局域网 N1 上跑 clash 的问题,我是 N1 armbian 上运行 docker ,docker 运行 openwrt ,目前部署上去了,但用不了,能加个蟑小龙请教一下吗? bWN5ZGlhCg==
    AllenHua
        22
    AllenHua  
    OP
       2021-11-07 15:22:09 +08:00 via iPhone
    @eggt #21 晚上吧
    bigbyto
        23
    bigbyto  
       2021-11-07 15:32:03 +08:00
    @AllenHua dnscrypt-proxy 只需要指定 server_names 即可,我的配置是:

    server_names = ['scaleway-fr', 'google', 'yandex', 'cloudflare']

    如果这几个网站没法访问,还可以配置 http_proxy 或 socks5 proxy 。

    proxy = 'socks5://127.0.0.1:7890'
    http_proxy = 'http://127.0.0.1:7891'

    一般情况不需要指定,cloudflare 的 doh 应该是可用的,查询结果会被 dnscrypt-proxy 缓存起来,这个的配置就是这样。搭配 dnsmasq 的话有两种用法:

    1. 使用 dnscrypt-proxy 作为 dnsmasq 的上游
    dnsmsaq 需要去 github 找一份国内域名的列表,这份列表使用国内的 dns 解析,可以用阿里的 223.5.5.5 。关于这些的配置网上有很多,这样就可以实现国内域名用国内 dns 解析,其他域名使用 dnscrypt-proxy 解析。

    需要注意的是,用了这个方法,如果你配置了 http_proxy 或者 socks5 来代理 doh 解析时,记得要在 dnsmsaq 中指定你的 fq 服务器域名使用一个国内或者其他可以用的 dns 服务来解析,不然会因为你的域名不在 dnsmasq 不在白名单内,跑到 dnscrypt-proxy 解析,造成无法解析你的 server 的情况。

    2. dnsmasq 配置被墙的域名列表,配置 dnscrypt-proxy 解析
    这种方案就是跟上面反过来,需要自己去整理被墙的域名列表。
    m1nm13
        24
    m1nm13  
       2021-11-07 16:51:00 +08:00
    在 MIPS 和 ARM 版的 Openclash 上疯狂翻车,我已经不信任这两个版本了,现在只用 clash for windows , X86 的 Openclash 没试过,不评论。

    一般就是 DNSMASQ 有问题,但是懒得弄。和 CLASH 本身可能并没有关系,大概率和 OPENWRT 水土不服。各种 ADGUARD ,smartDNS 之类的 DNS 服务嵌套一下,DNS 很容易就崩溃在莫名奇妙的地方。

    N1 做旁路由我也遇到过奇葩的,不能有 br-lan 的问题,不然通过 WIFI 连接的话,反复 DNS 超时。但是不用 br-lan,只用 ETH0 ,又有很多服务是硬绑定 bridge 的,删了 br-lan 就反复崩溃报错。只能说,开源有好的一面,也有不好的一面
    AllenHua
        25
    AllenHua  
    OP
       2021-11-07 17:25:13 +08:00
    @bigbyto #23 非常感谢分享了。不过我也有发现 https://github.com/wolf-joe/ts-dns 这个 dns 转发器似乎部署在本地也很不错呢。
    eggt
        26
    eggt  
       2021-11-07 17:53:46 +08:00 via iPhone
    @AllenHua 好的,多谢老哥了
    AllenHua
        27
    AllenHua  
    OP
       2021-11-07 18:48:03 +08:00 via iPhone
    @m1nm13 #24 我这使用过几次 openclash 也是各种问题,虽然界面看起来像是很多功能,非常强大。但是诸如 ruby 依赖、clash 守护程序未运行我遇到过好几次。很可能与 openwrt 固件相关,大家用的都是不同的人编译的(或是用户自己编译的)。

    可以尝试 clash core + dashboard ,也一样很好用。
    2218675712
        28
    2218675712  
       2021-11-07 20:59:41 +08:00
    对的,这周末白折腾两天,还是退回到老毛子
    AllenHua
        29
    AllenHua  
    OP
       2021-11-10 09:40:52 +08:00
    @2218675712 #28 openclash 对各个依赖的“依赖”太强烈了,稍有不适就无法运行,clash core 目前用下来感觉很省心
    adrianzhang
        30
    adrianzhang  
       2022-01-12 18:45:27 +08:00
    @hronro
    @bigbyto 同问一下
    没用 clash 内置的 DNS ,但后来发现如果这样 clash 很多域名匹配的规则就无法生效了,因为 clash 拿不到域名的信息。请问你是如何解决这个问题的?
    bigbyto
        31
    bigbyto  
       2022-01-12 19:54:33 +08:00 via iPhone   ❤️ 1
    @adrianzhang 你是指被 dns 污染的域名无法解析?对于被 dns 污染的域名,需要使用 dns 代理。我是用 dnscrypt-proxy 代理被污染的域名同时缓存 dns 应答。针对国内域名做分流走阿里 doh 。
    adrianzhang
        32
    adrianzhang  
       2022-01-12 20:40:24 +08:00
    @bigbyto 我的情况是这样的,局域网里有无污染 DNS 服务器,Clash 配置里 dns false ,rules 里配置不同域名走不同的 proxy 条目不生效。直接用 socks5 传给 Clash 域名也匹配不到域名相关的 proxy 。
    hronro
        33
    hronro  
       2022-01-12 20:45:41 +08:00   ❤️ 1
    @adrianzhang #30
    这个问题我已经解决了。
    把 Clash 的上游 DNS 设置为你无污染 DNS 服务器,然后局域网内其他设备使用 Clash 的 DNS 即可。
    bigbyto
        34
    bigbyto  
       2022-01-12 21:40:21 +08:00   ❤️ 1
    @adrianzhang 意思是你的分流还是基于 clash 吗?我的分流是 dnsmasq 做的,dnscrypt-proxy 作为 dnsmasq 的上游。dnsmasq 有人维护了国内的地址,直接走 223.5.5.5 或者内网的国内 doh ,白名单外走 dnscrypt-proxy 。这个规则可以应付绝大多数情况。
    adrianzhang
        35
    adrianzhang  
       2022-01-13 00:57:24 +08:00
    @hronro 就是说,Clash 配置里要 dns enable ,那 fake ip 什么的怎么弄?

    @bigbyto 我也是 dnsmasq 做的,单独一个机器跑 dnsmasq 。
    hronro
        36
    hronro  
       2022-01-13 10:37:43 +08:00 via iPhone   ❤️ 1
    @adrianzhang #35 我没用 fake ip ,用的 redir-host
    adrianzhang
        37
    adrianzhang  
       2022-01-13 10:49:05 +08:00
    @hronro 好的,非常感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1014 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 20:25 · PVG 04:25 · LAX 12:25 · JFK 15:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.