V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
A01514035
V2EX  ›  Linux

使用 docker 运行 clash 作为旁路由

  •  
  •   A01514035 · 71 天前 · 6850 次点击
    这是一个创建于 71 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚刚看到论坛里有人在问 ubuntu 旁路由 clash 的问题,正好我自己就是使用 docker 运行 clash 作为局域网中的旁路由使用的,配合网页 UI 进行管理,非常的丝滑好用。主要是利用 docker+macvlan+clash(mihomo)+iptables 来实现的旁路由功能。 https://github.com/UntaggedRui/clashindocker

    制作 docker 镜像并创建容器

    获取代码

    git clone https://github.com/UntaggedRui/clashindocker
    cd clashindocker
    cp example.yml config.yml
    

    更改地址 docker-compose.yml 中的 ipv4_address 为你的 ip 地址.

    更改 config.yml 中的 proxy-provider 的 url 为你的机场订阅地址.

    启动容器

    docker compose up -d 假设你的 docker 容器 ip 地址为 192.168.3.23. 通过 http://192.168.3.23:9090/ui/可以管理 clash,进行切换节点等.后端地址为 http://192.168.3.23:9090/,密码为 yourpassword.

    在同一个局域网下,将其他机器的网关设置为 192.168.3.23 就可以实现该机器的所有流量都经过 clash,并且根据 clash 的规则进行分流.

    51 条回复    2024-04-27 21:37:57 +08:00
    que01
        1
    que01  
       71 天前
    我还是觉得基于 dns 的分流更好用点,我现在用的 paopaodns+paopaogateway 感觉更舒适点。。。
    mmr
        2
    mmr  
       71 天前
    订阅管理和更新怎么做呢
    A01514035
        3
    A01514035  
    OP
       71 天前
    @mmr 使用了 proxy-provider ,在配置文件的 proxy-provider 中填入你的订阅地址,既会自动更新,也可以在网页 UI 中手动更新。
    A01514035
        4
    A01514035  
    OP
       71 天前
    @que01 clash 用习惯了,现在全平台 clash 了,一套规则全处都可用。
    mmr
        5
    mmr  
       71 天前
    多个订阅处理的咋样。
    SenLief
        6
    SenLief  
       71 天前
    @que01 关键是基于 dns 分流你也要接入代理,除非你有隐蔽的 dns 服务商。
    A01514035
        7
    A01514035  
    OP
       71 天前
    @mmr #5 完全没问题,不过需要稍微修改一下配置文件,在 proxy-provider 中添加多个订阅然后在后面的 proxygroup 中引用这些订阅。按照示例配置文件稍微修改下就可以。
    Dk2014
        8
    Dk2014  
       71 天前 via Android
    这下我的 all in boom 有用了
    路由器性能太弱鸡了,clash 跑不动,还容易干扰家里人其他设备体验
    A01514035
        9
    A01514035  
    OP
       71 天前 via Android
    @Dk2014 我也是 all in boom 同时是 docker 的强烈爱好者
    fdghjk
        10
    fdghjk  
       71 天前
    5rOw6YW36L6j
    fdghjk
        11
    fdghjk  
       71 天前
    泰酷辣
    fdghjk
        12
    fdghjk  
       71 天前
    clash 直接能处理 dns 请求吗?那要这样的话 就没必要单独弄个 openwrt 做旁路由了 直接一个 clash 就可以了吗?
    fdghjk
        13
    fdghjk  
       71 天前
    如果直接将主路由的网管设置成 192.168.3.23 会怎么样呢?假如 clash 挂了 那主路由就连不上网了吧

    但是如果主路由不设置的话就需要每个设备单独设置网关,有点麻烦 但是也不麻烦吧 但是有的设备不方便自定义网关啥的 也不是很方便感觉
    A01514035
        14
    A01514035  
    OP
       71 天前 via Android
    @fdghjk 按道理可以,我在配置文件里开启了 dns 同时也 iptables 转发了 dns 请求,你可以把 dns 也设置为这个 ip 试试,我觉得可以。
    qwerthhusn
        15
    qwerthhusn  
       71 天前
    自己亲测,用 OpenWrt+OpenClash 做旁路由,设备翻墙没问题,看油管啥的都 OK

    但是电视上的流媒体平台登不上去,后来加上 mosdns 就行了
    A01514035
        16
    A01514035  
    OP
       71 天前 via Android
    @fdghjk 这个我没有尝试过,我都是手动改的。还需要大家一起探索。
    fdghjk
        17
    fdghjk  
       71 天前
    @qwerthhusn mosdns 咋用 我感觉好复杂
    anubu
        18
    anubu  
       71 天前
    最近也在折腾家庭网络,更倾向透明网关的叫法。也用过 macvlan 网络跑 clash 容器,目前暂时用虚拟机跑 dae 做透明网关。折腾起来还是有不少细节:
    - 透明网关多了一跳,导致去程和回程路由不一致。有些应用可能会有奇怪问题。
    - 内网有自建 dns 服务,希望管控和分析所有终端的 dns 请求。终端的 dns 指向透明网关就无法识别分析了,不指向透明网关就失去了 dns 分流作用,只能基于 IP 分流。另外,为了对抗 dns 污染和泄露,dns 服务器的上游也需要借助透明网关。拓扑上似乎很难梳理通顺。
    - 透明网关容器使用 macvlan ,所在宿主机却无法联通透明网关。似乎是 docker iptables 相关的一些配置问题。即如果仅用一台 docker 主机跑所有服务,包括透明网关,宿主机上的其他容器无法简单的使用该透明网关。所以使用独立虚拟机跑透明网关服务也是一个选择,有可能的话,还是希望能把 dns 管控分析和透明网关打包成一个镜像,一键部署。
    - PT 下载问题,透明网关场景需要对 PT 下载有一些调整和适配。
    - 其他拓扑尝试,有看到把透明网关放到主路由上游的拓扑,即主路由多 wan 上联的逻辑。似乎也可以试试看。
    A01514035
        19
    A01514035  
    OP
       71 天前
    @anubu
    >> 终端的 dns 指向透明网关就无法识别分析了,不指向透明网关就失去了 dns 分流作用,只能基于 IP 分流。
    我的内网机器网关指向 docker clash 容器,dns 使用的公共 dns ,在 docker clash 容器中的日志显示的是 level=info msg="[TCP] 192.168.2.3:48962 --> www.google.com:80 match DomainSuffix(google.com) using 谷歌学术[xfss_🇭🇰 香港 IEPL 01 | x4]" 按照原理应该是只能基于 IP 分流但是日志显示域名分流我也还没清楚为啥。

    >> 宿主级无法联通透明网关这个问题可以通过在宿主机创建一个 macvlan 解决。
    https://blog.oddbit.com/post/2018-03-12-using-docker-macvlan-networks/#host-access

    >> PT 下载问题,我目前还没玩过,应该可以通过规则来解决?要么是通过 clash 的规则要么是通过 iptables 的规则?
    A01514035
        20
    A01514035  
    OP
       71 天前
    @anubu 楼上回复了你的评论,没有艾特成功...
    anubu
        21
    anubu  
       71 天前
    @A01514035 感谢分享。
    - 终端使用公共 dns 但仍命中了透明网关的 dns 分流,应该是透明网关劫持了 udp 53 流量,透明网关一般会默认配置。
    - macvlan 这个解决方法有点印象,应该就是这样的。使用 docker 本意是尽量降低对宿主机的操作和依赖,有点抗拒这个解决方法。

    内网 dns 仍是一个问题,主要有内部 dns 解析重写、终端 dns 请求管控分析、基于域名的分流这 3 个需求,需要探索一个合理的网络拓扑。
    A01514035
        22
    A01514035  
    OP
       71 天前
    @anubu #21 确实,我想起来了,我的透明网关中使用 iptables 劫持了 53 端口的流量转发到了 1053 也就是 clash dns 监听的端口。
    cm123
        23
    cm123  
       71 天前 via Android
    mosdns 进行国内外域名分流,国外域名直接 fakeip ,少一次 dns 解析。
    Bssn
        24
    Bssn  
       71 天前
    请问,如果 clash 搭建在群晖的 docker 里,是不是就不能用指定网关的方式进行旁路由了?或许只能使用 clash 的局域网共享通过 9090 端口代理?
    A01514035
        25
    A01514035  
    OP
       71 天前
    @Bssn 如果群辉的 docker 能支持 macvlan 就能通过指定网关的方式进行旁路由。 通过 7890 端口共享 http/https/socks5 代理是都可以的。
    wheat0r
        26
    wheat0r  
       71 天前
    @Bssn #24 群晖支持 macvlan ,需要手动创建或者用 compose
    julyclyde
        27
    julyclyde  
       71 天前
    把任何软件用 docker 运行起来
    把任何软件用 javascript/golang/rust 重写一遍
    都能写一篇文章
    问题是:到底增加了什么信息量呢?
    A01514035
        28
    A01514035  
    OP
       71 天前 via Android
    @julyclyde 我可能是第一点的那种人。。。我 server 上几乎没有直接部署的软件了,我 nginx 都用的 docker compose
    因为讨厌在宿主机里安装各种软件可能会有版本冲突而且各种文件在犄角旮旯里很烦
    WhatTheBridgeSay
        29
    WhatTheBridgeSay  
       71 天前
    过时的操作,只能代理 TCP ,本来就只有一个二进制不会产生依赖污染的东西还多此一举用了 docker ,DNS 重定向居然也是用的 iptables 这种无差别劫持 53 的方法。早在几年前使用 clash 承载网关代理的最佳实践就已经应该转向使用 tun 了,楼主这套方案放在 5 年前那确实有可能是最佳实践
    A01514035
        30
    A01514035  
    OP
       71 天前
    @WhatTheBridgeSay 感谢指教。tun 目前我只在 mac 上用过,确实好用,linux 上还没有使用,按照你这种说法 tun 确实要更加好一些。
    julyclyde
        31
    julyclyde  
       71 天前
    @A01514035 有问题应该去解决问题啊,而不是掩盖问题啊
    V1Eerie
        32
    V1Eerie  
       71 天前
    安卓无法指定 ipv6 网关导致 v6 路由只能走主网关,使用的时候有点难受,要是什么时候能像 Windows 一样指定 ipv6 网关就好了。
    seers
        33
    seers  
       71 天前   ❤️ 1
    *不推荐/过时的教程* Clash 已经全面切换到 TUN 设备,工作在 OSI 三层,如果需要 docker 运行,需要带上--privileged --network host 参数
    A01514035
        34
    A01514035  
    OP
       70 天前 via Android
    @julyclyde 我是之前不知道这个,经过大家一个号才知道,并没有掩盖问题 等我有空了再看一下 tun 的旁路由使用方式
    A01514035
        35
    A01514035  
    OP
       70 天前 via Android
    经过大家一个号-> 经过大家指点以后
    arfaWong
        36
    arfaWong  
       70 天前
    目前是 PVE + LXC Debian + sing-box
    journalist
        37
    journalist  
       70 天前
    @WhatTheBridgeSay Clash 的 TUN 网关支持 IPv6 吗?
    A01514035
        38
    A01514035  
    OP
       70 天前


    @journalist 看这个日志,应该是支持的吧。
    julyclyde
        39
    julyclyde  
       69 天前
    @seers
    @A01514035
    但如果不用 docker 就没这破事了
    所以问题在 docker 啊
    danshan
        40
    danshan  
       69 天前   ❤️ 1
    @mmr 我的方案你看看是不是可以参考. 虽然我用的是 surge, 不过也是订阅了 2 家的服务, 避免一家跑路了全完蛋的风险.
    大体思路是, 自己用 surgio 去写一个配置, 然后通过 surgio 去配置多个服务商.
    整个过程通过 github (建个 private repo) 的 action 去定期执行, 最终生成的配置文件推送到阿里云的 OSS. surge 订阅 OSS 的配置即可.
    其中 surgio 的作用:
    1, 从不同的服务商拉配置, 合并
    2, 根据自己的模板生成规则和配置
    3. 推送生产的配置到 oss.
    A01514035
        41
    A01514035  
    OP
       69 天前   ❤️ 1
    @danshan 我目前用的 substore( https://hub.docker.com/r/xream/sub-store)来整合订阅的,在配合 clash 里的 filter 和 surge 里面的 policy-regex-filter 来提取出需要的节点,也很方便。
    A01514035
        42
    A01514035  
    OP
       69 天前
    @seers 听取了 29 楼的意见,采用了 tun 模式,单文件也没有什么依赖和散布在各地的文件,所以直接宿主机运行了。
    yyysuo
        43
    yyysuo  
       69 天前
    目前是借鉴 paopao 的思路,主路由跑 mosdns 分流 ,国内直出,国外给 sing-box vm 返回 fakeip ,主路由添加静态路由,转发 fakeip 段、国外 dns ip 、电报 ip 到 sing-box vm 。国内真直连,暴爽。
    thadyo
        44
    thadyo  
       67 天前
    想请教下楼主,通过 gateway 连接 docker macnet 的代理方式,跟直接在服务器上安装 clash 做 vps ,然后直接通过代理 ip:port 的方式这二者有什么区别?单纯好奇想了解一下。
    yongso
        45
    yongso  
       67 天前
    感谢分享,希望在项目下标明下,适合的架构和系统,我用的 arm64 架构的启动失败,怀疑包没有适配
    A01514035
        46
    A01514035  
    OP
       66 天前
    @yongso 好的,稍后补充,我没有 arm 设备,用的都是 x86 设备。
    A01514035
        47
    A01514035  
    OP
       66 天前
    @thadyo 前者是透明代理,所有的流量都经过 clash 。后者是 socks5 代理或者 http 代理,只有遵循系统代理的应用才会走代理。例如 docker pull 等命令你直接通过 IP:PORT 的方式是没法走代理的得修改 dockerd 的配置才行。但是用 gateway 连接 docker macnet 的代理方式可以让 docker pull 走代理。
    yongso
        48
    yongso  
       66 天前
    @A01514035 感谢大佬,研究了下,不用 iptables 就行,最新的 clash 用 tun 模式直接🛫了,就是`config`文件有点麻烦,还好,通过互联网也给搞定了,大佬的分组感觉有点少,找了网上 dns 分流+黑名单模式,🛫了
    A01514035
        49
    A01514035  
    OP
       65 天前
    @yongso #48 是的,我的方式二 就是 tun 模式。 分流我是根据自己的需求写的简单的,因为我都是垃圾机场没有什么奈非节点。。。可以自己稍微改造下就行。
    thadyo
        50
    thadyo  
       60 天前
    @A01514035 了解啦,感谢。
    yikyo
        51
    yikyo  
       4 小时 57 分钟前
    @A01514035 请教对于 TG 直接使用 IP 进行连接,您的方案可以直接代理吗?有需要特殊处理的地方吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1035 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:35 · PVG 02:35 · LAX 11:35 · JFK 14:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.