V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fuzhuo233
V2EX  ›  DNS

ros redir-host/realip 分流,魔改 mosdns 将解析后 ip 写入 ros address-list

  •  
  •   fuzhuo233 · 4 天前 · 1054 次点击

    主路由是 routerOS ,硬件用 RB5009 或者 x86 虚拟机。目前是在 container 中运行 mosdns 和 mihomo/sing-box 来达到科学上网,之前一直用的是 fakeip 来分流需要走代理的流量,其它流量直通。

    一直想尝试 realip 模式,有其它帖子利用旁路由 ospf 来将代理 ip 同步到路由表,但感觉侵入性较大,比较复杂而且同步有延迟,mosdns 内置支持了 ipset ,但 ros 不支持 ipset ,ros 只支持 address-list ,但它支持 RESTFul API 来做到/ip/firewall/address-list/add 的方式来将 ip 写入到 address-list 。相比于静态下载路由表,这样由 mosdns 仅将你确实需要访问的 ip 写入 address-list ,这样系统负担应该会更小一些。

    于是给 mosdns 提了个 PR 增加一个新的 plugin ros_addrlist来写出 ip https://github.com/IrineSistiana/mosdns/pull/864

    # 格式 exec: ros_addrlist <host>,<user>,<password>,<address-list-name>,<nettype>,<mask>
    exec: ros_addrlist http://192.168.23.1:8080,admin,password,mosdns_gfwlist,inet,32
    

    也可以直接用封装好的 docker image

    # x86 的
    docker image pull qiudaomao/mosdns:latest --platform=linux/amd64
    # arm64 的
    docker image pull qiudaomao/mosdns:latest --platform=linux/arm64
    # 导出 image
    docker image save qiudaomao/mosdns:latest -o mosdns.tar
    

    然后将这个 tar 导入到 ros 就可以创建 container 了

    将之前 mosdns 配置 ipset 的地方用ros_addrlist插件代替,示例,需要 ros 上打开 ip/services 的 www 或者 www-ssl

    #example
      - tag: gfw-list
        type: sequence
        args:
          - matches: "!resp_ip $local_ip"
            exec: ros_addrlist https://192.168.23.1:443,admin,password,mosdns_gfwlist,inet,32
          - exec: accept
    

    这样产生代理 ip 时会写入到 ip/firewall/address-list 里

    /ip/firewall/address-list/pr
    ;;; [mosdns] domain: www.google.com.hk.
    1 mosdns_gfwlist 142.250.157.199 2024-12-26 15:50:26
    

    路由:

    在 routing/Tables 创建 fib 的 table 比如 sing-box

    ip/route 中将 0.0.0.0/0 route 到代理容器 sing-box 的 ip ,比如 192.168.23.4

    ip/firewall/mangle 中将 address list 为mosdns_gfwlist的 action mark routing 到 sing-box 表就完成路由设定了

    12 条回复    2024-12-30 03:26:52 +08:00
    kk2syc
        1
    kk2syc  
       4 天前
    感觉你这个需求直接 IP 分流?
    china-ip-list: https://github.com/mayaxcn/china-ip-list
    vibbow
        2
    vibbow  
       4 天前
    kk2syc
        3
    kk2syc  
       4 天前
    @vibbow 你这个多久没更新了? ipip 现在不免费不知道吗?
    onion83
        4
    onion83  
       4 天前
    1 、其实 ROS address-list 就是等价于 linux 中的 ipset ,不过 v4/v6 双栈需要分开来写而已。
    2 、利用 1 、2 楼提到的公共列表或者其它 BGP dump 、geoip dump ,加上一些自定义 IP 的白名单,可以合成自己最终的 cn address-list ,再配合 github 的 workflows 每周一 build 生成最终的 rsc 文件,release 到 github 制品仓库后,配合 ros 的计划任务直接 fetch 后 import 导入即可,这也算是人为制造一个场景熟悉 github 的 CI/CD 流程吧。

    核心代码参考:
    ```
    echo '/ip firewall address-list remove [/ip firewall address-list find list="cn"]' > $outfile

    for line in `cat myip.txt`;do
    ip=`echo $line |awk -F , '{print $1}'`
    comment=`echo $line |awk -F , '{print $2}'`
    commentstr=""
    if [ ! -z $comment ];then
    commentstr=`echo comment\=\"$comment\"`
    fi
    echo "do { /ip firewall address-list add list=cn address=$ip $commentstr } on-error={}" >> $outfile
    done
    ```
    vibbow
        5
    vibbow  
       4 天前
    @kk2syc ipip 这个这个基本就是一年更新一两次的
    nkcfc
        6
    nkcfc  
       4 天前
    有没有详细的完整方案呢?
    paperseller
        7
    paperseller  
       4 天前 via iPhone
    楼主的方案是类似旁路由 ospf 那种 cn 取反。楼上和我自己用的 ros 导入 cnip address lists 。我的方案:手动或定时任务导入 https://github.com/PaPerseller/chn-iplist/blob/master/cn.rsc ,旁路由 mosdns 解析后进入 ros 匹配,匹配上的直通,不匹配的进入旁路由走代理软件,在代理中也可再走一次分流
    fuzhuo233
        8
    fuzhuo233  
    OP
       4 天前
    用 mosdns 就是希望用一个自定义较小化的 gfwlist 域名白名单,而不是!cn cidr 这种黑名单,看个人选择吧
    SenLief
        9
    SenLief  
       3 天前
    现在不用这种 cn 库,更新的太慢,也不准,直接用 asn ,bgp 的要准很多。
    yyysuo
        10
    yyysuo  
       3 天前
    楼上诸位好像没太 get 到楼主的点,主要是做了一个动态的、个性化的分流; fakeip 分流不好么,只需要匹配一个 ip 段就行了,之前 passwall ssrp 之类的用 ipset ,也有 ipset 大了之后的效率问题。
    yyysuo
        11
    yyysuo  
       3 天前
    我倒是很想要一个输出域名列表为 txt 的功能,即 mosdns 判断过发 fakeip 的(或者是发过 real ip 不在列表中的),保存一个结果,下次就不用判断了,也可以同步域名列表到 github 分享给其它人用;不过目前的 lazy cache 也挺好用的,只是不能分享给别人。
    icy37785
        12
    icy37785  
       2 天前 via iPhone
    @yyysuo #10 不是楼上没 get 到楼主的点,是你没 get 到楼上的点,楼上跟楼主就是同一个目的的不同实现方式,只是各自觉得方便的标准不同,所以都觉得自己的方式更方便而已。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1066 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:29 · PVG 02:29 · LAX 10:29 · JFK 13:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.