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

6 天前
 fuzhuo233

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

1179 次点击
所在节点    DNS
13 条回复
kk2syc
6 天前
感觉你这个需求直接 IP 分流?
china-ip-list: https://github.com/mayaxcn/china-ip-list
vibbow
6 天前
kk2syc
6 天前
@vibbow 你这个多久没更新了? ipip 现在不免费不知道吗?
onion83
6 天前
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
6 天前
@kk2syc ipip 这个这个基本就是一年更新一两次的
nkcfc
6 天前
有没有详细的完整方案呢?
paperseller
6 天前
楼主的方案是类似旁路由 ospf 那种 cn 取反。楼上和我自己用的 ros 导入 cnip address lists 。我的方案:手动或定时任务导入 https://github.com/PaPerseller/chn-iplist/blob/master/cn.rsc ,旁路由 mosdns 解析后进入 ros 匹配,匹配上的直通,不匹配的进入旁路由走代理软件,在代理中也可再走一次分流
fuzhuo233
6 天前
用 mosdns 就是希望用一个自定义较小化的 gfwlist 域名白名单,而不是!cn cidr 这种黑名单,看个人选择吧
SenLief
6 天前
现在不用这种 cn 库,更新的太慢,也不准,直接用 asn ,bgp 的要准很多。
yyysuo
6 天前
楼上诸位好像没太 get 到楼主的点,主要是做了一个动态的、个性化的分流; fakeip 分流不好么,只需要匹配一个 ip 段就行了,之前 passwall ssrp 之类的用 ipset ,也有 ipset 大了之后的效率问题。
yyysuo
6 天前
我倒是很想要一个输出域名列表为 txt 的功能,即 mosdns 判断过发 fakeip 的(或者是发过 real ip 不在列表中的),保存一个结果,下次就不用判断了,也可以同步域名列表到 github 分享给其它人用;不过目前的 lazy cache 也挺好用的,只是不能分享给别人。
icy37785
5 天前
@yyysuo #10 不是楼上没 get 到楼主的点,是你没 get 到楼上的点,楼上跟楼主就是同一个目的的不同实现方式,只是各自觉得方便的标准不同,所以都觉得自己的方式更方便而已。
yyysuo
1 天前
受楼主启发,让 chatgpt 写了一个输出分流结果为规则文件的 mosdns 插件,用于实现 mosdns 的规则自维护。

功能:
1:启动时加载上次保存的查询统计结果,关闭时保存最新的查询统计结果。
2:根据查询统计结果生成 mosdns 可用的域名规则列表。

https://github.com/IrineSistiana/mosdns/discussions/866

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1100932

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX