主路由是 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 表就完成路由设定了

举报· 928 次点击
登录 注册 站外分享
8 条回复  
fuzhuo233 楼主 初学 前天 21:02
用 mosdns 就是希望用一个自定义较小化的 gfwlist 域名白名单,而不是!cn cidr 这种黑名单,看个人选择吧
paperseller 小成 前天 21:00
楼主的方案是类似旁路由 ospf 那种 cn 取反。楼上和我自己用的 ros 导入 cnip address lists 。我的方案:手动或定时任务导入 https://github.com/PaPerseller/chn-iplist/blob/master/cn.rsc ,旁路由 mosdns 解析后进入 ros 匹配,匹配上的直通,不匹配的进入旁路由走代理软件,在代理中也可再走一次分流
nkcfc 小成 前天 20:55
有没有详细的完整方案呢?
vibbow 小成 前天 20:52
@kk2syc ipip 这个这个基本就是一年更新一两次的
onion83 小成 前天 19:49
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 ```
kk2syc 初学 前天 19:38
@vibbow 你这个多久没更新了? ipip 现在不免费不知道吗?
vibbow 小成 前天 19:17
@kk2syc 直接用这个更简单 https://github.com/17mon/china_ip_list
kk2syc 初学 前天 18:35
感觉你这个需求直接 IP 分流? china-ip-list: https://github.com/mayaxcn/china-ip-list
返回顶部