【RouterOS】Ros 使用 docker 创建 PaoPaoDNS-ADHome-mihomo-yacd 使用记录
-
玩 PaoPaoDNS 搭配网关这套组合很长时间了,软路由以前一直是 Hyper-V 里开 4 个虚拟机:RouterOS、dns、adhome(过滤广告)、paopao 网关,整体负载偏高,宿主机还要留性能跑 jellyfin、迅雷、FTP 照片上传这些服务。阴差阳错找到了 X86 版 RouterOS 镜像,把物理网卡直接直通给 Ros 虚拟机后效果显著,能跑满宽带;又试了下 Ros 自带的 docker 服务也能用,就萌生了把 DNS + 去广告 + 网关全塞进 Ros 一台里的念头。
1G 内存同时跑 3 个 docker + 拨号 + DHCP 服务,还剩 300MB 多内存,电视 smartTV 看油管视频速度也不错,个人非常满意——既节省了硬件性能,也能满足需求。
Hyper-V 网卡直通对网络提升非常显著,可以跑满千兆带宽;虚拟网卡只有一半不到的性能,损失严重。推荐能上直通一定优先考虑直通,加上 Ros 的网卡驱动简直不要太完美,直接就能用。

本次 IP 分配(按自己网络改):
192.168.1.5= AdGuardHome(veth2,记录访问日志 + 去广告)192.168.1.6= PaoPaoDNS(veth1,上游递归 + CN 智能分流)192.168.1.3= mihomo-yacd(veth3,上网海淘网关,fake-ip)
链路:局域网 DNS → AdGuardHome(.5) → PaoPaoDNS(.6);国外域名经
CUSTOM_FORWARD转发给 mihomo(.3:53) 走分流,效果和单独搭建虚拟机一样。一、X86 Ros 虚拟机安装
Ros 破解版下载地址(无视硬盘SN,随意安装激活):MikroTikPatch,下载对应 X86 版本的 ISO 文件,虚拟机加载镜像,选择 "a"(全部),然后按 "i" 键进行安装,重启虚拟机后用 winbox 配置。需使用支持 container 功能的 RouterOS 7.x 版本。
二、开启容器功能(默认关闭)
RouterOS 7 默认关闭容器功能,先开启:
/system/device-mode/update container=yes5 分钟内断电重启一下(按提示断电或按 reset 键激活),重启完成输入:
/system/device-mode/print可以看到容器功能已经打开
container: yes:
三、创建 docker 网络与虚拟网卡
每个容器都需要创建 veth 接口,本教程 3 个 docker 容器就创建 3 个虚拟网卡(veth1/veth2/veth3),配置 IP 后把网卡添加到桥接接口里,实现局域网内主机访问。
Winbox → Container 里把环境变量提前建好(如变量组名
dns),所有变量的名称要设置一致,方便后面创建容器时用envlist=dns调用;Ros → Files 中创建目录,在 Container 里设置挂载路径。
PaoPaoDNS 环境变量参考(
CUSTOM_FORWARD改成你 mihomo 网关的地址):UPDATE=weekly CNAUTO=yes CNFALL=yes EXPIRED_FLUSH=yes CN_TRACKER=yes CUSTOM_FORWARD=192.168.1.3:53 # mihomo 网关地址,按自己网络改 AUTO_FORWARD=yes AUTO_FORWARD_CHECK=yes USE_MARK_DATA=yes ADDINFO=yes SHUFFLE=yes RULES_TTL=604800 TZ=Asia/Shanghai先设置仓库地址:
https://registry-1.docker.io注意:拉取镜像阶段需要当前网络能访问外网 docker 仓库(可以临时把 Ros 的 DNS 指到现有能出海的网关),等镜像都拉取好、容器跑起来后,就不再依赖之前的网络环境了。
四、创建 3 个容器
直接在 Ros 命令行执行(
remote-image拉取云端镜像,logging=yes启用日志,start-on-boot=yes开机自启动,comment设置备注):PaoPaoDNS:
/container/add remote-image=sliamb/paopaodns:latest interface=veth1 root-dir=docker/paopaodns logging=yes mounts=dns envlist=dns start-on-boot=yes comment=paopaodnsAdGuardHome:
/container/add remote-image=adguard/adguardhome interface=veth2 root-dir=docker/adhome logging=yes start-on-boot=yes comment=adhomemihomo-yacd(mihomo 内核 + yacd 面板一体镜像):
/container/add remote-image=yilee01/mihomo-yacd interface=veth3 root-dir=docker/clash logging=yes start-on-boot=yes comment=MH-YCDroot-dir对应 Ros Files 里的目录(需预先建好)。mihomo-yacd 的配置文件在容器内root/config/mihomo/config.yaml,即 Ros Files 的docker/clash/root/config/mihomo/config.yaml,可以直接用 SSH 连 Ros 编辑覆盖。五、AdGuardHome 初始化
浏览器打开 veth2 的 IP
:3000进入 AdGuardHome 初始化配置,上游 DNS 填 PaoPaoDNS 的 IP(192.168.1.6),不需要启用缓存(PaoPaoDNS 自带缓存负责),DNS 服务端口按容器内默认 53。六、mihomo-yacd 配置
SSH 连接到 Ros(密码为 winbox 登录账号密码),把改好的
config.yaml上传到上面说的挂载目录,直接覆盖。然后访问 mihomo 容器 IP 的8080端口(yacd 面板),重载配置和重启内核即刻正常使用:
需要说明的是默认 fake-ip 地址段是
7.0.0.0/8,需要把这个地址段添加静态路由指向 mihomo 容器 IP:/ip route add dst-address=7.0.0.0/8 gateway=192.168.1.3我的 MH-config 示例(节点换成你自己的,其余无需修改即可用,默认使用 paopaodns 解析):
mixed-port: 7890 allow-lan: true log-level: info mode: global external-controller: 0.0.0.0:9090 # secret: '123456' ipv6: false profile: store-fake-ip: true store-selected: true dns: enable: true listen: 0.0.0.0:53 ipv6: false enhanced-mode: fake-ip fake-ip-range: 7.0.0.0/8 fake-ip-filter: - '*.taobao.com' - '*.jd.com' proxies: - name: "你的节点" # 换成你自己的节点 type: vless # 按你节点的实际协议填 server: 你的服务器地址 # 修改为自己的 port: 你的端口 uuid: 你的uuid network: tcp tls: true udp: true flow: xtls-rprx-vision servername: www.yahoo.com # REALITY servername,换成你自己的 reality-opts: public-key: 你的公钥 short-id: c75c345e # optional client-fingerprint: chrome # cannot be empty tun: enable: true stack: system # stack: mixed auto-route: true auto-detect-interface: true dns-hijack: - any:53 - tcp://any:53七、效果
yacd 面板概览,内存占用才 28MB 左右:

至此 Ros 一台就把 DNS 递归分流、广告过滤、上网海淘网关全包了,1G 内存的虚拟机绰绰有余,还省掉了原来 3 台虚拟机的资源开销。
参考项目:PaoPaoDNS (github.com/kkkgo) · PaoPaoGateWay (github.com/kkkgo) · mihomo-yacd 镜像 yilee01/mihomo-yacd (Docker Hub)

请使用微信扫一扫