Skip to content

在 RouterOS 上安装 Mihomo 和 OxiDNS ​

这套方案把管理面板装在 NAS 或另一台电脑上,把 Mihomo 和 OxiDNS 装进 RouterOS 容器。Mihomo 负责代理;OxiDNS 负责查询网站地址,并把需要代理的查询交给 Mihomo。

完成后,手机和电脑的网关仍是 RouterOS,DNS 改用 OxiDNS。先接入一台设备测试,成功后再让其他设备使用。

第 1 步:准备设备和地址 ​

开始前需要:

  • 已能运行容器的 RouterOS 7:安装了匹配版本的 Container 软件包、启用了容器功能,并有可写磁盘。未准备好时先按 RouterOS 容器说明 完成。
  • 一台运行 ConfigFlow 面板的 NAS 或电脑,以及可用的代理订阅。
  • 两个独立容器需要两个空闲的内网 IP;一个 AIO 容器只需一个。都应避开 DHCP 自动分配范围,防止地址冲突。

先在 WinBox 的 Files → Backup 保存路由器备份并下载到电脑。在 IP → DHCP Server → Networks 打开当前网段,记下原来的 DNS Servers;原来为空也要记下来,恢复时会用到。

下面是一套完整示例。先换成自己的地址,再开始填写。

要准备什么本文示例后面用在哪里
RouterOS 地址192.168.50.254容器网关、客户端网关、路由器管理地址
面板地址http://192.168.50.100:5010服务域名、容器的 SERVER_URL
Mihomo 容器 IP192.168.50.28代理设备地址、代理路由的下一跳
OxiDNS 容器 IP192.168.50.251DNS 设备地址、客户端 DNS
测试设备 IP192.168.50.50首次选择需要分流的设备
内网网段192.168.50.0/24容器地址中的 /24 要与实际内网一致
LAN 网桥bridge1把容器接到内网
可写磁盘目录disk1/configflow保存镜像、配置和设备身份

两个容器还是一个容器? ​

方式推荐情况选择后的区别
两个独立容器首次安装推荐,正文按此方式填写各有一个 IP,可以分别重启、升级和排查
一个 AIO 容器希望减少容器数量,接受两项服务一起启停两个核心共用 IP;DNS 和 Agent 的端口必须分开,见第 4 步的 AIO 页签

AIO 就是把多个程序装在同一个容器里。以上两种都只有一份 OxiDNS,不会在设备故障时自动切换到另一台;需要该能力时看 OxiDNS 高可用。

第 2 步:让容器能找到面板 ​

  1. 按 安装管理面板 完成 NAS 或 Docker 部署。
  2. 从另一台内网设备打开面板,例如 http://192.168.50.100:5010。
  3. 进入「系统 → 系统设置 → 常规 → 服务配置」,将「服务域名」填成这个完整地址。
  4. 需要保护配置下载链接时生成「访问令牌」,以后从页面复制完整链接,不要漏掉令牌。

不要填 localhost。 对容器来说,它表示容器自己,找不到 NAS 上的面板。面板的 data 目录要长期保留,后面给 Agent 准备的目录不能代替它。

第 3 步:下载并上传镜像 ​

镜像是容器启动所需的程序包。先确认 RouterOS 设备的架构,再在装有 Docker 的电脑或 NAS上执行命令,不要在 RouterOS Terminal 执行:

设备架构命令中填写
x86 / x86_64linux/amd64
ARM64linux/arm64

下面按 x86 举例;ARM64 要把两条命令中的平台都改成 linux/arm64。导出使用的 --platform 选项需要 Docker API 1.48 或以上;旧版 Docker 需先升级。

sh
docker pull --platform linux/amd64 thsrite/config-flow-agent:latest
docker save --platform linux/amd64 -o configflow-agent.tar thsrite/config-flow-agent:latest

完成后,在 WinBox 的 Files 打开实际磁盘,本例是 disk1,新建 configflow 文件夹,把 configflow-agent.tar 上传进去。最终应能看到:

text
disk1/configflow/configflow-agent.tar

两个独立容器和 AIO 都用这个镜像,不需要重复下载。

第 4 步:创建并启动容器 ​

先选两个独立容器或一个 AIO 容器,只创建所选方案。首次安装推荐两个独立容器,便于分别重启和排查。

容器组合

两项服务各有一个 IP。再选一种操作方式:习惯在 WinBox 点选就用第一项,习惯终端命令就用第二项;不要重复执行两种方式。

操作方式

4.1 给每个容器接一张网卡 ​

在 Interfaces → VETH 点击添加。VETH 是容器的虚拟网卡,可以理解为给容器接了一根网线。

字段MihomoOxiDNS
Namecf-maincf-dns
Address192.168.50.28/24192.168.50.251/24
Gateway192.168.50.254192.168.50.254

再到 Bridge → Ports,分别添加这两张网卡,Bridge 都选实际的 LAN 网桥,本例是 bridge1。填错网桥或网关时,容器可能无法联系面板或外网。

4.2 准备长期保留的目录 ​

在 Files 创建下表的 Src 目录,再到 Container → Mounts 逐项添加。“挂载”就是把路由器磁盘上的目录交给容器使用。

List(挂载名称)Src(路由器上的目录)Dst(容器内目录)保存什么
cf-main-configdisk1/configflow/main-config/etc/mihomoMihomo 配置
cf-main-statedisk1/configflow/main-state/opt/configflow-agentMihomo Agent 身份和运行资料
cf-dns-configdisk1/configflow/dns-config/etc/oxidnsOxiDNS 配置
cf-dns-statedisk1/configflow/dns-state/opt/configflow-agentOxiDNS Agent 身份和运行资料

四个 Src 目录都要保留,并且不能互相混用。 两项 Dst 都写 /opt/configflow-agent 没问题,因为位于不同容器。不要把另一台 Agent 的身份目录复制过来,否则可能被面板当成同一台设备。

以后重建容器仍挂载原目录。只保留镜像文件,不能保留这些配置和身份。

4.3 填写启动设置 ​

到 Container → Envs 添加下表内容。环境变量就是容器启动时读取的设置:List 选对应容器的列表,Key 填名称,Value 填值。

KeyList 为 cf-main 时的 ValueList 为 cf-dns 时的 Value作用
SERVER_URLhttp://192.168.50.100:5010同左面板的完整地址
SERVICE_TYPEmihomooxidns决定启动哪个核心
AGENT_NAMEmihomo-mainoxidns面板中显示的设备名称
AGENT_IP192.168.50.28192.168.50.251面板联系它的 IP,与对应网卡一致
AGENT_PORT80808082Agent 管理端口,按本文填写即可

8080 / 8082 不是 DNS 端口,不填到手机的 DNS 设置中。单服务容器不需要额外添加 ENABLE_MIHOMO 等组合开关。

4.4 添加并启动两个容器 ​

在 Container 点击添加,分别填写:

字段MihomoOxiDNS
Filedisk1/configflow/configflow-agent.tar同左
Name / Hostnamecf-maincf-dns
Interfacecf-maincf-dns
Root Dir(程序解压目录)disk1/configflow/main-rootdisk1/configflow/dns-root
Envlist / Envlists(启动设置列表)cf-maincf-dns
Mountlists(挂载列表)cf-main-config,cf-main-statecf-dns-config,cf-dns-state
Start On Boot(开机启动)先不勾选先不勾选

启动命令保持镜像默认值。等镜像解压完成、状态显示 stopped 后,先选 Mihomo 点 Start,确认变成 running,再启动 OxiDNS。

安装测试阶段先手动启动;第 7 步验证后再勾选开机启动,RouterOS 重启后才会自动启动它们。容器运行了,还需要第 5 步发布核心配置。

第 5 步:上线并发布两项配置 ​

Agent 是容器里的小助手,负责收配置和报状态。在「系统 → Agent」点击 刷新,应该看到 mihomo-main、oxidns 两张在线卡片。

看不到时先检查容器是否运行、面板地址是否正确、两端能否互相访问。在线只代表管理连接正常,还要发布核心配置;此时先不修改全网 DNS。

准备共用的配置空间 ​

  1. 新建并选择一个 配置空间,可以把它理解为一整套节点和分流设置。
  2. 在 订阅来源 添加并更新订阅,或在 节点库 导入节点。
  3. 在 策略组 选节点,在 策略规则 设置各类网站的去向,把兜底的 MATCH 放在末尾。
  4. 将两张 Agent 卡片的 配置空间 都选为这个空间。绑定只是决定后续用哪套设置,不会立即发布。

先设置并发布 Mihomo ​

在 mihomo-main 卡片点 设置,打开基础配置。这里使用 YAML 文本,按原有缩进修改对应字段;不要把下表当作完整文件粘贴。

字段本文建议值设置后的作用
dns.enabletrue开启 Mihomo DNS,OxiDNS 才能把代理查询交给它
dns.listen0.0.0.0:1053让 OxiDNS 能从内网访问这个 DNS 端口
dns.enhanced-modefake-ip用临时地址接管需要代理的网站连接
dns.fake-ip-range198.18.0.1/16默认示例对应路由网段 198.18.0.0/16;不能与已有 LAN、VPN 重叠
tun.enable、tun.auto-route均为 true开启接收转交流量的通道并准备容器内路由;关闭后不能仅靠主路由转发完成本方案
tun.auto-detect-interfacetrue自动选择容器向外联网的网卡

已有配置用其他 Fake-IP 范围时,以实际值为准,后续路由也要一致。其他字段和编辑方法见 Mihomo 基础配置。

点击 保存并发布,确认目标是 mihomo-main;如果只保存了草稿,还需在卡片点 推送。出现 应用并启动 时点击,等待发布成功和核心状态正常。

再设置并发布 OxiDNS ​

在 oxidns 卡片点 设置:

设置本文建议原因
UDP、TCP 监听均为 0.0.0.0:53让内网设备通过普通 DNS 端口查询
直连上游可用的公共 DNS,例如 https://223.5.5.5/dns-query不需要代理的网站交给它查询
代理上游192.168.50.28:1053填 Mihomo IP + DNS 端口,不是面板或 Agent 端口
测试设备策略192.168.50.50 选「智能分流」先验证这一台,不要直接设置整个内网

设备策略位置见 客户端设备,上游位置见 OxiDNS 基础与上游。

保存并发布到 oxidns。两项核心均成功后,继续接入 RouterOS。

第 6 步:接入 RouterOS,只验证一台设备 ​

让面板有权管理 RouterOS ​

在 WinBox 中准备一个专用账号:

  1. IP → Services:推荐启用 www-ssl、配置可用证书,以 HTTPS 连接;仅使用 HTTP 时,需 RouterOS 7.9 或以上,并启用 www。
  2. System → Users → Groups:新建组,勾选 read、write、api、rest-api。
  3. System → Users:新建账号、设置密码、选择该组,允许来源限制为 NAS 的实际地址。
  4. 确认内网防火墙允许 NAS 访问该管理端口。

添加路由器并发布 ​

在 ConfigFlow 切到刚才的空间,进入「上游路由 → 添加路由器」:

字段本次怎么填结果与注意事项
类型、名称RouterOS;名称自定用于识别并选择对应管理接口
管理地址、账号https://192.168.50.254 和专用账号;非默认端口也填上访问路由器后台,不填代理或 DNS 端口
校验 HTTPS 证书默认开,有可信证书时保留验证失败会阻止连接;自签证书仅在确认地址正确且属于可信内网时按需关闭
代理网关mihomo-main把需要代理的连接送给 Mihomo 容器
自动配置回流本文同网段方案开启帮助回复按本方案返回设备;其他网络先看 上游路由
使用静态路由的 IP 规则集先留空仍自动包含 Fake-IP 网段
使用策略路由的 IP 规则集需要时选 Telegram 等 IP 清单只对设置为智能分流的来源设备生效,不需要时留空
DHCP DNS 服务器暂选「不关联」这次先不改变全网设备获得的 DNS

下一跳填 Mihomo 容器 IP,本例是 192.168.50.28,不是 NAS 或 RouterOS 自己的地址。

依次点击:

  1. 保存 → 探测,确认可以连接。到这里还没写入路由。
  2. 点该路由器的 策略路由,在 来源设备 中确认 192.168.50.50 为「智能分流」。
  3. 在 发布预览 勾选本次 OxiDNS 目标,点 保存并预览。
  4. 核对测试设备、Mihomo 地址、所选 IP 清单,并确认 DHCP DNS 本次跳过。
  5. 确认发布,等待 OxiDNS 和 RouterOS 都成功。出现冲突、失败或结果待确认时,先查看原因,不要连续重复提交。

“策略路由”就是按来源设备和目标地址决定连接走哪条路。本文用它处理 Telegram 等可能直接连接 IP 的应用;普通域名分流不必额外选所有真实 IP。其余按钮、IPv4 范围和冲突处理见 上游路由。

不用自动下发时,见 Fake-IP 与 Telegram 手工路由表,下一跳换成本页的 Mihomo 容器 IP。自动发布成功后,不要再手动添加一遍。

修改测试设备并验证 ​

只改测试设备:网关保持 192.168.50.254,DNS 改为 192.168.50.251。AIO 的 DNS 改为 192.168.50.28。

关闭这台设备上其他代理、VPN 和浏览器安全 DNS,检查:

  • 常用直连网站和需要代理的网站都能打开。
  • 选了 Telegram IP 清单时,Telegram 能连接。
  • OxiDNS 查询记录 能看到这台设备的 IP。
  • Mihomo 面板 能看到对应代理连接。

没有 DNS 记录时,先查设备真正使用的 DNS;有记录却打不开代理网站时,查节点、核心状态和路由发布结果。这一台还没成功,就不要全网启用。

第 7 步:全网启用并设置开机启动 ​

  1. 编辑 RouterOS 接入设置,将 DHCP DNS 服务器 选为 oxidns,保存。
  2. 到 策略路由 → 来源设备 添加其他设备或网段,需要分流的选「智能分流」,不需要的选「直连」。长期按设备设置时建议固定 IP。
  3. 发布预览 勾选 OxiDNS,点击 保存并预览。
  4. 核对实际 DHCP 网段、设备范围,以及 DNS 将改为 192.168.50.251(AIO 为 192.168.50.28),再确认发布。
  5. 让客户端断开网络再连接,查看实际取得的 DNS;手动写死 DNS 的设备单独修改。

发布会替换目标网段原来的 DNS 列表,不会保留旧备用地址。找不到唯一匹配网段时会阻止发布,应核对页面提示,不要猜。客户端网关仍保持 RouterOS。

最后在 WinBox 的 Container 分别编辑两个容器,勾选 Start On Boot;AIO 只改它自己的容器。不勾选时当前可以运行,但 RouterOS 重启后不会自动启动。

用命令行开启两个独立容器的开机启动

在 RouterOS Terminal 先确认每个名称只对应一个运行中的容器,再执行。AIO 使用实际的 cf-aio 名称,不执行下面两条独立容器命令。

text
/container print detail where name~"^cf-"
/container set [find where name="cf-main"] start-on-boot=yes
/container set [find where name="cf-dns"] start-on-boot=yes

“强制局域网 DNS 走 OxiDNS”先保持关闭。需要统一处理设备自行指定的公共 DNS 时,再看 强制 DNS 的开关和限制;它不会接管所有 IPv6 或加密 DNS。

以后怎么改 ​

想改什么去哪里改改完还要做什么
节点、网站去向订阅来源、策略组、策略规则保存并发布到对应核心,仅保存不改变现网
DNS 上游或端口OxiDNS / Mihomo 设置保存并发布;Mihomo DNS 地址变动时,同步修改 OxiDNS 代理上游
分流设备或 IP 清单客户端设备、上游路由保存、预览、核对目标并确认发布
容器 IP已有实例建议保留原 IP;确需更换时,先安排地址迁移修改 VETH 和 AGENT_IP 并重启容器,不会自动更新面板已登记的 Agent 地址。还需处理面板中的设备地址,以及上游、路由网关、DHCP DNS 等旧地址引用,不能当成一次普通改值
原面板更换访问地址修改服务域名、各容器的 SERVER_URL,再停止并启动容器容器启动时会更新它使用的面板地址并保留 Agent 身份。原面板须保留原 data;若换成全新面板,不能假定原身份仍有效。随后检查在线状态和实际推送是否成功

已有 Agent 的心跳不会自动改写面板里的连接地址,因此“重新在线”不能证明面板已能通过新 IP 管理它。不要为更换地址直接删除身份目录;先保留可用旧地址和数据,按完整迁移安排切换。

核心发布失败时,到 Agent 发布记录 看最终结果;需要退回时使用「回滚到发布前」。卡片在线或请求已提交,不等于核心已经恢复。

已有容器怎样换镜像、失败怎样退回 ​

以下适用于保留原服务类型的升级或重建。把 MosDNS 换成 OxiDNS,还涉及核心配置与 Agent 类型迁移,不能只换镜像或改一个名称。

  1. 记下旧容器的 File、Root Dir、Interface、Envlist、Mountlists 和 Start On Boot。保留旧镜像文件和原 Root Dir,不删除旧容器。
  2. 安排一次短暂停服,每次只更换一个容器;AIO 会同时暂停代理和 DNS。先取消旧容器 Start On Boot,点 Stop,等待完全停止。
  3. 停止后,完整备份它使用的配置目录和身份目录。配置、规则和身份要来自同一次备份,不能拿无关旧文件拼起来。
  4. 上传与设备架构匹配的新镜像,创建一个新名称的容器,使用新的 Root Dir,继续使用原 Interface、环境变量和挂载列表。新容器 Start On Boot 先关闭。
  5. 等新镜像解压完成再点 Start。确认原有 Agent 恢复在线、没有多出重复设备,再按第 6 步验证 DNS、代理和实际客户端访问。
  6. 成功后开启新容器的 Start On Boot,旧容器保持停止。确认稳定前保留旧文件和备份。

失败时先 Stop 新容器,确认停止后再 Start 旧容器,恢复旧容器的开机启动。不能让新旧容器同时使用同一 IP、网卡或身份目录运行。 如果期间还发布了新配置,先按发布记录处理回滚,不能以为换回镜像就会恢复配置;必须恢复备份时,在容器停止状态下成套恢复对应数据。

旧容器启动后仍要重新检查 DNS 和代理。未恢复前不要继续更换其他容器,也不要为了清理报错而删除旧 Root Dir 或身份目录。

暂停使用或上网异常时,怎样恢复 ​

先恢复客户端 DNS,再处理代理规则,最后决定是否停止容器。不要先停掉全家正在使用的 DNS。

  1. 编辑 ConfigFlow 的 RouterOS 接入设置,把 DHCP DNS 服务器 改为「不关联」。开过 强制局域网 DNS 走 OxiDNS 时,也将其关闭,再保存。
  2. 开过强制 DNS 时,到 策略路由 → 发布预览,取消全部 OxiDNS 目标,点击 保存并预览。确认本次只发布 RouterOS,并包含移除强制 DNS 的改动,再 确认发布。没有相关规则和变更时不用重复发布;OxiDNS 已离线时也不要继续勾选它作为发布目标。
  3. 在 WinBox 的 IP → DHCP Server → Networks 打开自己的网段,将 DNS Servers 改回第 1 步记录的原值;原来为空就恢复为空。Gateway 保持 RouterOS 地址。
  4. 手动改过 DNS 的客户端也恢复原值,断开重连,检查实际 DNS 和普通上网。
  5. 要停用代理分流时,将来源设备改为「直连」,取消此前选择的代理 IP 规则集,保存、预览并确认发布。检查主路由上仍指向 Mihomo 的手工路由,手工添加的需自行停用。Fake-IP 路由可能仍保留;先保留 Mihomo 运行,确认客户端不再使用旧 Fake-IP 或通过它连接后,再停止容器。

「不关联」不会自动恢复旧 DNS。 删除 Agent 或路由器接入记录,也不会替你撤销已经写入的路由。恢复后先确认客户端能上网,继续保留配置和身份目录,方便重新启用。