- 简体中文
- English
基于 ASUSWRT-Merlin 路由器环境的 sing-box + smartdns 分流代理脚本方案。
本项目目标是把职责拆分清晰:
- 🛰️ sing-box 只负责代理转发
- 🌐 smartdns 负责域名解析与域名分流
- 📦 ipset + iptables/ip6tables 负责 IP 分流与透明代理引流
💡 点击下方缩略图观看视频演示:
- UI模式使用教程
- 脚本模式使用教程
| 项目 | 状态 | 说明 |
|---|---|---|
| IPv4 / IPv6 | ✅ 已支持 |
启动时自动检测 IPv6,可用则启用,不可用则自动降级到 IPv4。 可修改 merlin-box.sh 中的 MB_ENABLE_IPV6 变量值手动禁用 IPv6。 |
| IPv4 / IPv6 分流 | ✅ 已支持 | ipset + iptables/ip6tables |
| 屏蔽 LAN 侧 QUIC UDP 443 |
✅ 已处理 |
默认拦截(DROP UDP 443),避免 UDP 直连泄露。 可修改 merlin-box.sh 中的 MB_DISABLE_QUIC_FROM_LAN 变量手动禁用拦截功能。 |
| smartdns 解析分流 | ✅ 已支持 | 由 smartdns 替代 dnsmasq 承担 DNS 解析与域名分流。 |
| 广告拦截 | ✅ 已支持 | 通过配置 site-blocklist.txt 黑洞域名列表实现。 |
| 域名黑名单 | ✅ 已支持 | 通过配置 site-blacklist.txt 黑名单域名列表使指定域名强制走代理。 |
| 域名白名单 | ✅ 已支持 | 通过配置 site-whitelist.txt 白名单域名列表使指定域名强制直连。 |
| 自定义HOSTS | ✅ 已支持 | 通过配置 hosts.txt 文件实现自定义 HOSTS,常用于开发人员在局域网中解析域名做调试。 |
| IP白名单 | ✅ 已支持 | 通过配置 ip4-whitelist.txt 和 ip6-whitelist.txt 文件实现,使指定 IP 强制直连。 |
| IP黑名单 | ✅ 已支持 | 通过配置 ip4-blacklist.txt 和 ip6-blacklist.txt 文件实现,使指定 IP 强制走代理。 |
| UDP | ✅ 已支持 | UDP默认是关闭的,若需要使用 UDP 代理,需要将 merlin-box.sh 中的 MB_ENABLE_UDP 变量值修改为 1。 |
| 路由自身 | ✅ 已支持 | 仅 TCP 代理,默认关闭。需要将 merlin-box.sh 中的 MB_ENABLE_ONESELF_PROXY 变量值修改为 1。 |
| 设备黑名单 | ✅ 已支持 | 防止邻居蹭网误入 迷失深林🌳 。 在 device_blacklist.txt 中配置邻居设备的 MAC 地址即可。 |
| 设备白名单 | ✅ 已支持 | 使用白名单可以防止未授权的来宾用户误入 迷失深林🌳 。 在 device_whitelist.txt 中配置常用设备 MAC 地址即可。 |
| UI | ✅ 已支持 | 执行 ./merlin-box.sh server 启动WEB UI。 |
| 软件中心 | ✅ 已支持 | 打包文件支持在KoolCenter软件中心安装。 |
| 订阅 | ✅ 已支持 | 目前支持解析包含 VLESS、VMess、Trojan、Shadowsocks 协议的订阅,兼容标准 URL 及 Base64 编码格式。 |
| ping 代理 | ⏳ 不支持 | 不在当前代理范围内。 |
- UDP 代理需要上游节点支持,且 sing-box 需要配置支持 UDP 的出站。
- 路由自身的代理功能需要在 sing-box 配置中添加一条 redirect 入站。
- IPv6 需要本地网络和上游服务器均支持;MB_ENABLE_IPV6=1 时脚本会自动检测本地网络 IPv6 可用性,不可用时自动降级到 IPv4 流程。
⚠️ 脚本无法检测上游服务器是否支持 IPv6,若上游不支持 IPv6,且 MB_ENABLE_IPV6=1,由于会走IPV6优先模式,可能导致无法上网。- QUIC 属于 UDP,无论是否开启 UDP 代理,项目均采取拦截方案(DROP UDP 443),因此会导致依赖 H3/QUIC 的网站在客户端侧无法以 QUIC 访问(通常会回退到 TCP/TLS;个别站点可能表现为打不开或异常)。
⚠️ 设备黑白名单功能依赖 device_blacklist.txt/device_whitelist.txt 文件是否存在,只要文件存在,脚本就会启用黑/白名单功能,如果不需要此功能,请删除这两个文件。- WEB UI 使用 ./merlin-box.sh server 启动,默认端口为 8080,可以启动时指定端口号:./merlin-box.sh server 8081 。登录用户名密码默认为 admin/merlinbox。
res/chn-site.txt作为域名集合- 命中域名 -> 使用中国 DNS 上游解析(
china组) - 其他域名 -> 走国际 DNS 上游(
foreign组,默认经 socks5 代理)
smartdns 配置:
- 配置文件
conf/smartdns.conf - 配置参考 https://pymumu.github.io/smartdns/en/configuration/
res/chn-ip4.txt、res/chn-ip6.txt作为 IP 网段集合- 启动时加载到 ipset 集合:
- IPv4:
merlinkbox_chn - IPv6:
merlinkbox_chn_v6
- IPv4:
- 命中 IP 集合 -> 直连放行
- 未命中 -> 透明代理引流到 sing-box TPROXY 端口
可选白名单文件:
- 在此白名单中的 IP 将被视为直连。
res/ip4-whitelist.txtres/ip6-whitelist.txt
- 入站:
- SOCKS:
65001(供 smartdns foreign 上游经代理解析) - TPROXY:
65002(供透明代理接收) - REDIRECT:
65003(供路由自身经代理访问)
- SOCKS:
- 出站:在
conf/config.json自行配置
sing-box(conf/config.json)配置参考:
merlin-box/
├─ merlin-box.sh # 主入口脚本(start/stop)
├─ start_merlin_box.sh # 用于支持开机启动
├─ install.sh # KoolCenter 软件中心安装脚本
├─ uninstall.sh # KoolCenter 软件中心卸载脚本
├─ webs # KoolCenter 软件中心网页文件
├─ ui/ # WEB UI 开发目录
│ ├─ server # WEB UI 后端
│ └─ front # WEB UI 前端
├─ wwwroot/ # WEB UI 静态资源
├─ db/ # WEB UI 数据库
│ └─ db.json # WEB UI 数据库文件,注意第一次拿到后修改登录用户名密码,密码是md5加密后的字符串
├─ bin/
│ ├─ sing-box # sing-box 可执行文件
│ ├─ smartdns # smartdns 可执行文件
│ └─ merlin-box # WEB UI server 可执行文件
├─ conf/
│ ├─ config.json # sing-box 配置
│ └─ smartdns.conf # smartdns 配置
├─ scripts/
│ ├─ merlinbox_webui.sh # KoolCenter 软件中心后端脚本
│ └─ dnsmasq.postconf # dnsmasq 后处理脚本(接管 53 端口时使用)
├─ sh/
│ ├─ fun.sh # 核心逻辑
│ └─ tool.sh # tool 子命令的实现
├─ tools/
│ ├─ sub2box/ # 用于将订阅转换为 sing-box 配置的工具
│ └─ update-rules/ # 规则更新脚本
└─ res/
├─ chn-ip4.txt # 中国 IPv4
├─ chn-ip6.txt # 中国 IPv6
├─ chn-site.txt # 中国域名列表
├─ device_blacklist.txt # 设备黑名单列表(设备不能走代理)
├─ device_whitelist.txt # 设备白名单列表(仅允许的设备可以走代理)
├─ site-blocklist.txt # 屏蔽域名列表(进入黑洞)
└─ site-blacklist.txt # 黑名单域名列表(强制走代理)
- 脚本默认会在项目中找
bin/sing-box与bin/smartdns来启动相关服务,并将控制台输出重定向到logs/sing-box.log和logs/smartdns.log。 - 目前包含的二进制文件在下面的设备上测试通过(没有更多机型供测试)。
| 型号 | SINGBOX | SMARTDNS |
|---|---|---|
| RT-BE86U | linux-arm64-musl | smartdns-aarch64 |
| RT-AC86U | linux-arm64-musl | smartdns-aarch64 |
- ✅ 已测试机型:RT-BE86U、RT-AC86U。
- ✅ 架构支持:项目提供 ARM64(64 位) 和 ARM(32 位) 版本,可在 Release 页面下载对应架构的程序包。
- ⏳ 更多机型:受设备条件限制,暂未对更多机型进行测试。理论上,只要是 ASUSWRT-Merlin 系列路由器,且 CPU 架构为 ARM64 或 ARM(32 位),均可尝试运行。如遇问题,欢迎在 Issues 中反馈。
- 💾 存储空间:部分路由器的 JFFS 空间较小,虽然程序二进制文件已经经过压缩,仍可能存在空间不足的情况。建议将程序目录放在 U 盘等外部存储设备上。
- 📂 安装目录:程序支持在任意目录下运行,推荐放置于 /jffs/merlin-box 目录。
- 在 Release 页面下载与你的路由器 CPU 架构对应的程序包,并将项目文件上传至路由器。推荐放置在 /jffs/merlin-box 目录下。
- 可选:本项目提供 ARM64(64 位) 和 ARM(32 位) 版本。如果你的路由器 CPU 架构与程序包不匹配,可以尝试从 sing-box 和 SmartDNS 项目仓库下载对应架构的二进制文件,并替换项目中的相关文件。
bin/sing-boxbin/smartdns
- 给予执行权限(示例):
chmod +x merlin-box.sh
./merlin-box.sh init-
启动 WEB UI Server
./merlin-box.sh server
-
访问 WEB UI
在浏览器中打开:
http://路由器IP:8080 -
登录 WEB UI
使用默认账号登录:
- 用户名:
admin - 密码:
merlinbox
- 用户名:
-
配置代理节点
进入【节点管理】,添加代理节点,并将需要使用的节点设置为 默认节点。
-
修改其它配置
根据实际需求调整相关配置,例如:
- DNS 上游
- IP 白名单 / 黑名单
- 域名黑名单
- 其它路由与代理相关配置
-
启动代理
完成配置后,启动代理服务即可。
- 按你的节点信息配置 outbounds
- 确认 sing-box outbound
routing_mark与脚本变量一致(默认169)
- 按需替换中国/国际 DNS 上游
- 保持域名分流规则(
chn-site.txt)
res/ip4-whitelist.txtres/ip6-whitelist.txt
res/ip4-blacklist.txtres/ip6-blacklist.txt
res/site-blocklist.txt
res/site-blacklist.txt本项目此文件中收集了 Apple 相关域名,能解决访问外区苹果服务的很多问题,访问国区的小伙伴自行修改此文件。
res/device_blacklist.txt:怕邻居蹭网误入迷失深林🌳,在此文件中配置邻居设备的 MAC 地址即可。res/device_whitelist.txt:使用白名单可以防止未授权的来宾用户误入迷失深林🌳,在此文件中配置常用设备 MAC 地址即可。⚠️ 如果不需要此功能,请删除对应的文件,否则有可能因为文件存在,但没有配设备,导致设备无法上网。
主入口命令:
./merlin-box.sh start #启动服务(默认参数: 1 1 0 0 1)
./merlin-box.sh start 1 1 0 0 1 #显式参数启动:IPv6 QUIC拦截 UDP 自身代理 TcpFastOpen
./merlin-box.sh stop #停止服务
./merlin-box.sh restart #重启服务
./merlin-box.sh restart 1 1 0 0 1 #显式参数重启:IPv6 QUIC拦截 UDP 自身代理 TcpFastOpen
./merlin-box.sh server #启动 WEB UI server,默认端口为 8080,可以启动时指定端口号:./merlin-box.sh server 8081 。支持子命令 start/stop/restart,默认为 start。./merlin-box.sh server start 8081
./merlin-box.sh -h #显示帮助信息
./merlin-box.sh -v #显示版本信息▶️ start:清理旧规则 -> 启动 sing-box -> 启动 smartdns -> 重启 dnsmasqstart参数(均可选,每个参数值为0或1,默认值1 1 0 0 1):enable_ipv6disable_quic_from_lanenable_udpenable_oneself_proxyenable_tcp_fast_open
- ⏹️
stop:停止 sing-box/smartdns -> 清理 iptables/ip6tables/ip rule/ipset -> 重启 dnsmasq
安装与卸载(开机启动):
./merlin-box.sh install #安装服务使其开机启动(拨号成功后)
./merlin-box.sh uninstall #卸载服务禁用开机启动工具命令:
./merlin-box.sh tool compress_singbox #压缩 sing-box 可执行文件 ¹
./merlin-box.sh tool compress_smartdns #压缩 smartdns 可执行文件 ¹
./merlin-box.sh tool compress_merlinbox #压缩 merlin-box 可执行文件 ¹
./merlin-box.sh tool show_devices #显示当前 DHCP 租约的设备列表
./merlin-box.sh tool update_rules #更新规则文件 ²
./merlin-box.sh tool build_singbox #构建 sing-box 可执行文件 ¹
./merlin-box.sh tool download_smartdns #下载 smartdns 可执行文件 ¹
./merlin-box.sh tool sub2nodes #将订阅转换为节点列表
./merlin-box.sh tool sub2box #将订阅转换为 sing-box 配置 ³
./merlin-box.sh tool build_ui #构建 WEB UI 及 相关资源
./merlin-box.sh tool build_merlinbox #构建 merlin-box 服务端
./merlin-box.sh tool package #打包最终文件
./merlin-box.sh tool -h- 命令仅在本地系统(或WSL)中执行,不能在路由器上执行。压缩依赖 upx 工具。
- 本仓库携带的二进制文件已经经过压缩。
⚠️ 压缩虽然可以明显降低文件大小,但是启动时会比原始程序要慢。
- 规则更新有两种行为:
- 在开发模式下,会调用python脚本从三个源下载最新规则文件并覆盖本地文件。
- 在生产模式下(路由器中),使用wget从本仓库的 raw 文件下载最新规则文件并覆盖本地文件。
- 订阅转换有两种行为:
- 在开发模式下,会调用python脚本将订阅转换为 sing-box 配置。
- 在生产模式下(路由器中),调用 merlin-box(开发中) 二进制文件进行转换。
理论上 sing-box 支持的协议,只要在 conf/config.json 正确配置,均可接入本方案。
-
ASUSWRT-Merlin
https://github.com/RMerl/asuswrt-merlin.ng
https://sourceforge.net/projects/asuswrt-merlin/files/ -
sing-box
https://github.com/sagernet/sing-box -
smartdns
https://github.com/pymumu/smartdns -
fancyss
https://github.com/hq450/fancyss
本项目基于 GNU General Public License v3.0 (GPL-3.0) 协议开源 - 详情请参阅 LICENSE 文件。
Copyright (C) 2026 LandDuck.

