叶子

闲言碎语

从 0 开始建设自己的旁路由

很多家庭网络一开始是这样的:

普通家庭网络结构

一、传统软路由:部署在光猫之后

最常见的早期方案,是把软路由直接放在光猫之后,再连接硬路由、交换机和 AP。

传统软路由:部署在光猫之后

若把软路由直接放在光猫和主路由之间,所有流量都会经过软路由。它能实现代理,但也意味着软路由成了全网转发瓶颈;设备性能、稳定性和维护成本都会被放大。若后面的硬路由仍处于路由模式,还可能形成双 NAT。

二、改进版软路由:接入交换机

把软路由接在主路由后的交换机上。

1. 手动切换

改进版软路由:接入交换机

需要代理的客户端,手动把 DNS 和默认网关改为软路由的 LAN IP;软路由的上游网关仍是主路由。

这样不用调整主路由,但每台需要代理的设备都要单独设置,而且这些设备的直连流量和代理流量仍会先经过软路由。

2. 软路由 DHCP

软路由 DHCP:软路由接入交换机并作为全网默认网关

软路由仍接在交换机上,但由软路由开启 DHCP、主路由关闭 DHCP。典型场景是 Mac mini 上运行 Surge:它通过 DHCP 向全网宣告自身为默认网关,局域网设备会把 Mac 当作网关上网。

这套方案的缺陷是 Mac mini 重启或故障时,局域网设备的默认网关不可用,可能全网断网。

3. 双 Wi-Fi 切换

改进版软路由:双 Wi-Fi 切换

也可以准备两个 Wi-Fi:一个下发软路由的 DNS 和网关,另一个保持主路由设置,通过切换 Wi-Fi 改变流量路径。

三、最终旁路由

旁路由的目标不同:只让需要代理的流量进入代理,其余流量仍由主路由直接出网。

主路由继续承担默认网关和 DHCP;旁路由接入现有 LAN,不替换主路由,也不承担普通设备的默认网关。

一个 Wi-Fi 自动分流

最终旁路由结构:一个 Wi-Fi 自动分流

示例地址仅用于说明。实际部署时,10.0.0.1、10.0.1.114 和 10.0.1.120 应替换为自己的地址,并确保主路由可以路由到两个服务地址。

四、看起来位置一样,和软路由接交换机有什么不同?

改进版软路由和最终旁路由,硬件都接在主路由后的交换机上;区别不在物理位置,而在客户端的流量如何被送到软路由。

  • 改进版软路由:需要代理的客户端手工把 DNS 和默认网关改为软路由。因此该客户端的所有流量,包括直连流量,都会经过软路由。
  • 最终旁路由:客户端仍使用主路由作为默认网关;主路由只把 198.18.0.0/15(IPv6:2001:2:0:6152:0:9::/96)的 Fake-IP 流量静态路由给代理主机。

因此,最终旁路由:

  • 不需要客户端手工设置默认网关;
  • 不需要客户端手工设置 DNS;
  • 不需要为直连与代理切换 Wi-Fi;
  • 不需要改动客户端配置;
  • 不需要代理的流量仍由主路由直接出网;
  • 主路由、交换机和 AP 的既有结构保持不变。

五、核心原理:三项服务、两项主路由设置

1. 三项服务

这套方案通常由三个组件构成。它们可以部署在同一台小主机或 NAS,也可以像本文示例一样拆分为 DNS 主机和代理主机。

  • AdGuard Home:为局域网提供 DNS 缓存、广告拦截和统一的 DNS 入口。
  • MosDNS:按域名规则选择解析路径。
  • Mihomo / Surge / Clash 类代理核心:处理代理连接,并提供 Fake-IP DNS 解析。

典型的 DNS 链路如下:

客户端 → AdGuard Home → MosDNS
                         ├─ 直连域名 → 常规 DNS → 真实 IP
                         └─ 代理域名 → Mihomo Fake-IP DNS → 198.18.0.0/15(IPv6:2001:2:0:6152:0:9::/96)

这里需要区分两个动作:

  1. MosDNS 负责判断域名该直连还是代理。
  2. Fake-IP 通常由代理核心的 DNS 功能生成。 MosDNS 将需要代理的域名转发给该 DNS 上游后,客户端才会得到 198.18.0.0/15(IPv6:2001:2:0:6152:0:9::/96)这类虚拟地址。

代理核心会保存“Fake-IP 与真实域名”的对应关系。后续连接到该 Fake-IP 时,它能够还原域名并按规则转发。

2. 主路由只需要做两项设置

假设:

  • 主路由 LAN 地址:10.0.0.1
  • AdGuard Home DNS 地址:10.0.1.114
  • 代理核心地址:10.0.1.120
  • Fake-IP 网段:198.18.0.0/15(IPv6:2001:2:0:6152:0:9::/96)

则在主路由中设置:

  1. LAN / DHCP DNS:下发 10.0.1.114 给客户端。
  2. 静态路由:目的网段为 198.18.0.0/15(IPv6:2001:2:0:6152:0:9::/96),下一跳为 10.0.1.120。

不要把 DHCP 默认网关改为旁路由;客户端的默认网关仍然是 10.0.0.1。

六、一次访问是如何走的?

访问不需要代理的网站

  1. 客户端向 AdGuard Home 查询域名;
  2. MosDNS 判断该域名走直连 DNS;
  3. 客户端拿到真实 IP;
  4. 客户端把流量交给默认网关,也就是主路由;
  5. 主路由直接出网。

访问需要代理的网站

  1. 客户端向 AdGuard Home 查询域名;
  2. MosDNS 将该查询交给 Mihomo / Surge 的 Fake-IP DNS;
  3. 客户端拿到 198.18.0.0/15(IPv6:2001:2:0:6152:0:9::/96)内的 Fake-IP;
  4. 客户端仍把流量交给默认网关主路由;
  5. 主路由命中静态路由,将此流量转交给 10.0.1.120;
  6. 代理核心识别 Fake-IP 对应的域名,并通过代理出口访问目标站点。

因此,网络结构没有被改造成“所有流量先经过软路由”;只有 Fake-IP 段的流量才会被导向代理核心。

七、主路由和旁路由怎么选?

1. 主路由:先确认两项能力

这套自动分流方案的前提是主路由能完成以下设置:

  1. DHCP DNS 下发:可向 LAN 客户端下发自定义 DNS 服务器地址,而不是只能使用主路由自身的地址。
  2. 静态路由:可添加 LAN 静态路由,将 198.18.0.0/15(IPv6:2001:2:0:6152:0:9::/96)指向代理主机的 LAN IP。

还应确认静态路由的下一跳可以是同一局域网内的主机,并且该设置对所有 LAN 客户端生效。若主路由缺少其中任一功能,仍可采用前文的“改进版软路由”方案,但无法实现一个 Wi-Fi 下的全自动 DNS 分流。

硬件上优先选择具备完整 DHCP、DNS 下发和静态路由功能的主路由,例如 UniFi 网关、MikroTik RouterOS(ROS)设备,或安装 OpenWrt 的硬路由。购买前仍应在该型号的管理界面或官方文档中逐项确认上述能力,尤其是 IPv6 ULA 与 IPv6 静态路由。

2. 旁路由:按实际负载选择

旁路由硬件应按“需要代理的并发流量”和“是否还承载 DNS”等实际负载决定,而不是只看网口数量。

  • 低负载 / 入门:网心云 OEC 这类 ARM 小主机可用于 DNS 与轻量代理。
  • 小体积:NanoPi R28S 一类双千兆 ARM 设备。
  • 性能优先:NanoPi R76S 一类较新的 ARM 设备,适合更高的代理吞吐与更多规则。
  • 多网口需求:EasyPi R1 Pro 一类带多个 1G / 2.5G 网口的设备,适合需要多网段或多线路的场景。
  • 高性能代理:Mac mini 可以运行 Surge 或 Mihomo,适合承担高吞吐代理。

可选系统包括 Armbian、Debian、Ubuntu,以及群晖 DSM、飞牛 fnOS 等 NAS 系统的容器环境。AdGuard Home、MosDNS 这类 DNS 服务内存占用通常不大;Mihomo 在规则和连接较多时占用会明显上升。若旁路由同时运行这些服务,建议预留不少于 1 GB 内存;比如,配备 1 GB 内存的 OpenWrt 或 Armbian 裸机也可以作为入门方案。

八、部署建议

  1. 先只部署 AdGuard Home,确认局域网 DNS 下发和解析正常。
  2. 再加入 MosDNS,验证直连域名仍能返回真实 IP。
  3. 启用代理核心的 Fake-IP DNS,并用一个明确需要代理的测试域名确认返回地址位于 198.18.0.0/15(IPv6:2001:2:0:6152:0:9::/96)。
  4. 最后在主路由添加该网段的静态路由,验证 Fake-IP 流量确实到达代理核心。
  5. IPv6 应单独配置:若要启用 IPv6 分流,主路由需要支持 LAN ULA IPv6 地址和 IPv6 静态路由。YehBP 可同时部署 IPv4 与 IPv6 的 Fake-IP 分流;其当前默认 Fake IPv6 前缀为 2001:2:0:6152:0:9::/96。在主路由中将该前缀静态路由到代理主机的内网 ULA IPv6 地址;不要把 IPv6 配置默认沿用 IPv4。

九、个人部署参考

目前在用的组合是:

  • 主站:UniFi UDM Beast + 飞牛(硬酷 R2 Max,主力)+ Mac mini M4 16 GB;另有一台 Armbian 备用机,运行第二套 AdGuard Home + MosDNS。
  • 另外三处宽带:UniFi UDM SE / UCG Ultra / UX7 + 网心云 OECT(RK3566,Armbian / 飞牛)。

这几年来硬件不断增减,才逐渐形成现在的配置;例如一年前主力还是群晖 RS1221+。不过整体模式已经稳定运行多年。

实际使用中,备用 DNS 主要用于覆盖主力 NAS 重启的短暂窗口。若主机本身足够稳定,是否部署备用节点应按自己的可用性要求决定;例如另外三处宽带没有备用 DNS,运行也很稳定。

另外,4 处宽带还组建了 SD-WAN,并将 AI 流量统一汇聚到主站出口,具体架构可参考:多站点 Homelab:SD-WAN 组网 + 统一 AI 出口。

方案有了,怎么部署最方便?

早期部署需要手动敲命令。近两年前,我开始借助 AI 将流程做成快捷部署工具,并在持续的实际部署中测试边界条件、修复问题;现在终于可以放出来了。

Yeh Bypass Gateway,简称 yehbp,是一套一键部署与菜单化管理工具。

支持群晖、飞牛、Armbian 等环境。

从百元网心云到万元群晖 / Mac,总能选到合适的,配合 AI 食用更佳。

YehBP 交互式主菜单

十、外出场景的一体化设备

外出时,同样可以采用本文的 DNS 分流、Fake-IP 和静态路由方案。基于 OpenWrt 的 CPE,例如 GL.iNet Mudi 7 一类产品,可以把蜂窝网络、主路由、AdGuard Home / MosDNS、Mihomo 以及 Wi-Fi AP 集成在一台设备中。网络功能被合并部署,但分流原理不变。