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