V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bjzhou1990
V2EX  ›  宽带症候群

分享一个自己写的 Clash 网关 docker

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

    Github 链接: https://github.com/bjzhou/clash_meta_gateway

    以下所有功能都由 Clash Meta 内核实现:

    • 域名嗅探
    • 自动标记流量
    • 自动配置 iptables 接管所有流量
    • 自动更新订阅( Proxy Provider 实现)
    • 支持 GeoIP/GeoSite 规则分流
    • 内建 DNS ,并支持 GeoSite/规则组进行 DNS 分流

    实际上 docker 里只做了一件事,就是启动 clash meta

    这里贴几段我觉得有意思的配置

    rules:
      - GEOIP,private,DIRECT  
      - GEOSITE,private,DIRECT
      - GEOSITE,apple,DIRECT
      - GEOSITE,microsoft@cn,DIRECT
      - GEOSITE,category-games@cn,DIRECT
    
      - GEOSITE,CN,DIRECT
      - GEOIP,CN,DIRECT
    

    这里创建了一个 direct.yaml 文件

    然后在主配置文件里引入

    rule-providers:
      direct:
        type: file
        behavior: classical
        path: "./direct.yaml"
    

    配置 DNS ,默认走海外 DNS ,匹配 direct 规则的走国内 DNS

    dns:
      enable: true
      listen: 0.0.0.0:53
      ipv6: false
      enhanced-mode: redir-host 
      prefer-h3: true
      nameserver:
       - https://dns.cloudflare.com/dns-query
       - tls://8.8.8.8:853
       - tls://1.1.1.1:853
      nameserver-policy:
        "rule-set:direct":
          - https://dns.alidns.com/dns-query
          - 119.29.29.29
          - 223.5.5.5
      default-nameserver:
       - 223.5.5.5
    

    主配置文件规则匹配

    rules:
      - RULE-SET,direct,DIRECT
      - GEOSITE,netflix,NETFLIX
      - GEOSITE,openai,AI 服务
      - GEOSITE,anthropic,AI 服务
      - NOT,((DST-PORT,80/8080/443/8443)),非常用端口
    
      - MATCH,默认
    

    这样做保证了 DNS 分流和规则分流的统一

    另外这配置里有个非常用端口,部分机场或者中转流量会导致非常用端口无法连接,可以在这里选择直连或自建机场

    另外再分享一个给自己用的 VPS 一键部署脚本: https://github.com/bjzhou/xray-server-setup

    脚本功能:

    • 开启 bbr 加速
    • 启动 SS 代理,加密方式 2022-blake3-aes-128-gcm ,密码随机
    • 利用 xray 的域名嗅探配合 mosdns 的逻辑控制实现所有 Cloudflare CDN 的网站 IP 优选(需要在/etc/mosdns/config.yaml 里手动修改优选 IP ),实现 Netflix DNS 解锁,解锁用的 DNS 服务器我是在爬虫网站白嫖的😂
    第 1 条附言  ·  245 天前
    更新改用 TUN 模式,DNS 默认开启 fake ip, 不再依赖 iptables, 顺便写了个不使用 docker 的一键部署脚本
    第 2 条附言  ·  241 天前
    因为不想做旁路由,所以把主路由切到官方原版 OpenWRT 了,openclash 实在不好用,自己写了个一键安装脚本,openwrt 分支
    22 条回复    2023-09-12 16:34:12 +08:00
    bao3
        1
    bao3  
       248 天前
    牛啊,实现了我一直想要的。
    emtry
        2
    emtry  
       248 天前
    请问国内 dns 可以设置走自建 ADG 吗
    bbbb
        3
    bbbb  
       248 天前 via iPhone
    学习一下
    customsshen
        4
    customsshen  
       248 天前
    docker 启动后再关闭会导致宿主机无法上网,重启可解决
    请问是重启宿主机还是 docker 镜像?
    bjzhou1990
        5
    bjzhou1990  
    OP
       248 天前
    @customsshen 重启宿主机
    bjzhou1990
        6
    bjzhou1990  
    OP
       248 天前
    @emtry 可以在/data/config.yaml 里自己修改
    emtry
        7
    emtry  
       248 天前
    bug1:网卡默认 eth0 ,不是自动匹配,其他网卡直接起不来
    emtry
        8
    emtry  
       248 天前
    bug2:订阅地址出现&,替换错误,订阅不了
    bjzhou1990
        9
    bjzhou1990  
    OP
       247 天前
    @emtry #8 好的
    msn1983aa
        10
    msn1983aa  
       247 天前
    还需要楼主打磨一下,bug 少一点了来试试,目前都是用虚拟机跑 openwrt
    EvineDeng
        11
    EvineDeng  
       247 天前
    你要不用 ADD ,这镜像压缩后体积还能再减小至少 18MiB 。
    ylsf
        12
    ylsf  
       247 天前 via Android
    mark ,有空试试
    bjzhou1990
        13
    bjzhou1990  
    OP
       247 天前
    @emtry #8 两个问题都更新了,但是未做测试
    bjzhou1990
        14
    bjzhou1990  
    OP
       247 天前
    @EvineDeng 用不用 ADD 文件都会拷到镜像里去的,我把 clash 二进制文件和其他需要的文件打成一个压缩包了,体积减少了一点
    emtry
        15
    emtry  
       247 天前
    eth0 还是没自动换到 ens
    mikewang
        16
    mikewang  
       247 天前
    这种情况使用 Docker 可能会有一些问题:
    比如 alpine 的 iptables 其实是 iptables-legacy ,如果主机系统使用的是 iptables-nft ( nftables ),docker 内的 iptables 会打乱主机的网络。

    另外一个建议是 shell 脚本可以 trap 一下 SIGTERM ,这样 docker stop 的时候就可以自动执行清理工作。
    Navee
        17
    Navee  
       246 天前
    宿主机网卡不需要开混杂模式吗
    8675bc86
        18
    8675bc86  
       246 天前
    感觉简单的问题复杂化,clash 哪需要 docker 跑。
    bjzhou1990
        19
    bjzhou1990  
    OP
       245 天前
    更新改用 TUN 模式,DNS 默认开启 fake ip, 不再依赖 iptables, 顺便写了个不使用 docker 的一键部署脚本
    BaseException
        20
    BaseException  
       228 天前
    有技术有实践,感谢楼主的项目,回去试试看。我最近使用 OpenWRT 中的 Sha.dow.socksR Plus+ 总是遇到 ERR_NAME_NOT_RESOLVED 的问题,有一天晚上过后,第二天早上起来手机断开了 wifi 无法连上 wifi 。登录进路由器发现有网 但是是 ssr plus+导致的 wifi 无法连接,最终把这货关掉了……

    OP 可以帮我分析一下吗
    bjzhou1990
        21
    bjzhou1990  
    OP
       228 天前
    @BaseException DNS 解析有问题,试试改一下 ssrp 的 DNS 设置,或者用 chinadns, mosdns 之类的 dns 插件
    BaseException
        22
    BaseException  
       228 天前
    @bjzhou1990 #21 我有修改 dns 配置,几个内置的 dns 策略都切换过。另外只用了 dnsmasq ,没有使用 chinadns mosdns 的插件
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   888 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 21:50 · PVG 05:50 · LAX 14:50 · JFK 17:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.