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