一、为什么要这样做

1. 一条暗线不等于只能有一个网络

家庭装修时,弱电箱到房间往往只预埋一根网线。普通以太网帧不带 VLAN 标签时,这根线通常只能承载一个二层广播域。

802.1Q 会在以太网帧中加入 VLAN ID。交换机或 Linux 网桥可以根据 VLAN ID 将同一物理链路上的数据划入不同的逻辑网络。因此,一根线可以同时传输多个彼此隔离的二层网络。

2. 为什么不让所有设备都走 OpenClash

全局代理虽然配置简单,但也会带来额外问题:

  • 国内服务可能绕远路;
  • 游戏、下载和智能家居不一定适合代理;
  • 某些设备不需要也不应该接触代理环境;
  • 故障时影响整个家庭网络。

将普通网络和代理网络拆成两个 SSID 后,使用者只需切换 Wi-Fi,不必修改静态 IP、网关或终端代理软件。

3. 为什么还要考虑 IPv6

只代理 IPv4、却向客户端发布原生 IPv6,会产生典型的“IPv6 绕过”:浏览器或 Google Play 优先使用 AAAA 记录,流量直接从主路由的 IPv6 出口离开,绕过 OpenClash。

本方案为两个网络分别设计 IPv6:

  • 502 使用主路由提供的原生 IPv6;
  • SORA 从 AX3600 获得独立的 IPv6 /64,并由 AX 的 OpenClash IPv6 TProxy 接管。

二、最终网络拓扑

[光猫]
   │
   │ WAN / PPPoE
   ▼
[小米 4A / OpenWrt]
   ├─ 502:普通网络
   ├─ SORA:VLAN20 二层扩展
   └─ LAN2:VLAN10 Untagged + VLAN20 Tagged
                         │
                         │ 墙内暗线
                         ▼
[小米 AX3600 / OpenWrt + OpenClash]
   ├─ 502:普通网络 AP
   ├─ SORA:代理网络网关与 AP
   └─ LAN2:VLAN10 Untagged + VLAN20 Tagged

地址规划如下:

网络 VLAN IPv4 网段 网关/DHCP 用途
502 10 192.168.2.0/24 4A:192.168.2.1 普通直连
SORA 20 192.168.20.0/24 AX:192.168.20.1 OpenClash 透明代理
AX 救援口 192.168.88.0/24 AX:192.168.88.1 配置失败时救援

物理端口规划:

设备 端口 VLAN 10 VLAN 20 说明
4A LAN1 U* 非成员 普通接入口
4A LAN2 U* T 通往 AX 的混合链路
AX LAN1 不加入 br-lan 不加入 独立救援口
AX LAN2 U* T 通往 4A 的混合链路
AX LAN3 U* 非成员 普通接入口

这里:

  • U 表示出口去掉 VLAN 标签;
  • T 表示出口保留 VLAN 标签;
  • * 表示该端口的 PVID,即未标记入站帧默认归属的 VLAN。

VLAN 10 被设置为 Native/Untagged,是为了让尚未配置 VLAN 的设备仍能通过普通以太网访问主网络。VLAN 20 只在两台路由器之间的 LAN2 链路上带标签传输。

三、技术原理

1. VLAN 感知的底层网桥

两台路由器都保留一个只负责有线端口和 VLAN 的底层网桥 br-lan

br-lan
├─ VLAN 10 → br-lan.10
└─ VLAN 20 → br-lan.20

br-lan.10br-lan.20 是 Linux 在 VLAN 感知网桥上创建的逻辑 VLAN 设备。

2. 为什么还需要 br-main 和 br-sora

无线 AP 接口通常由 hostapd 动态创建,例如:

AX:wlan0、wlan1、wlan0-1、wlan1-1
4A:phy0-ap0、phy1-ap0、phy0-ap1、phy1-ap1

这些接口不适合直接静态写入底层 Bridge VLAN 表。更稳定的做法是创建两个上层软件网桥:

br-main
├─ br-lan.10
├─ 2.4GHz 502
└─ 5GHz 502

br-sora
├─ br-lan.20
├─ 2.4GHz SORA
└─ 5GHz SORA

逻辑接口再绑定到对应的上层网桥:

lan  → br-main
sora → br-sora

这样,无线接口由 netifd/hostapd 按“网络绑定”动态加入正确网桥,而底层 br-lan 只处理稳定存在的有线端口和 VLAN。

3. 两个网络如何隔离

VLAN 10 和 VLAN 20 在二层上拥有独立的广播域:

  • 502 的 ARP、DHCP 广播不会进入 SORA;
  • SORA 的 DHCP 请求只会到达 AX;
  • 4A 不在 VLAN 20 上配置地址和 DHCP;
  • 跨网段通信必须经过 AX 的三层路由与防火墙。

4. SORA 为什么可以通过 4A 出口上网

SORA 客户端以 AX 为网关。AX 将允许直连的流量转发至普通 LAN,再由 4A 出口访问互联网。4A 必须知道返回 192.168.20.0/24 的下一跳是 AX:

192.168.20.0/24 via 192.168.2.2

否则,4A 收到返回数据后不知道如何回到 SORA 网段。

四、开始配置前的准备

1. 确认端口名称

不同固件中的 LAN 端口名称可能是 lan1lan2lan3,也可能是 eth0.1 或交换芯片端口。先通过 SSH 查看:

ip -d link show
brctl show
uci show network

不要仅凭路由器外壳上的编号猜测接口名称。

2. 准备救援通道

修改 VLAN 时,任何一个 PVID 或端口成员错误都可能导致管理地址失联。本方案在 AX 上保留独立 LAN1:

接口:rescue
设备:lan1
地址:192.168.88.1/24

救援口不要加入 br-lan,最好启用独立 DHCP。应用 AX 配置时,将笔记本插在救援口。

4A 是主路由,修改前至少应:

  1. 下载完整系统备份;
  2. 保存 /etc/config/network/etc/config/wireless
  3. 准备延时自动回滚脚本;
  4. 先配置 AX,再配置 4A。

3. 记录当前配置

uci show network
uci show wireless
uci show dhcp
uci show firewall
ip route show
ip -6 route show

不要在输出或博客中公开 PPPoE 密码、Wi-Fi 密码和 OpenClash订阅地址。

五、配置 AX3600

下面使用 UCI 展示核心逻辑。也可以在 LuCI 的“网络 → 接口 → 设备”中完成相同配置。

1. 保留救援口

示例:

uci set network.rescue='interface'
uci set network.rescue.proto='static'
uci set network.rescue.device='lan1'
uci set network.rescue.ipaddr='192.168.88.1'
uci set network.rescue.netmask='255.255.255.0'

为救援接口配置独立 DHCP 和防火墙区域,此处略去与 VLAN 无关的常规配置。

2. 配置 br-lan VLAN

AX 的 br-lan 只包含 LAN2、LAN3:

uci set network.@device[0].vlan_filtering='1'

uci set network.vlan10='bridge-vlan'
uci set network.vlan10.device='br-lan'
uci set network.vlan10.vlan='10'
uci add_list network.vlan10.ports='lan2:u*'
uci add_list network.vlan10.ports='lan3:u*'

uci set network.vlan20='bridge-vlan'
uci set network.vlan20.device='br-lan'
uci set network.vlan20.vlan='20'
uci add_list network.vlan20.ports='lan2:t'

如果固件已经存在匿名 bridge-vlan 段,应修改已有段或先确认名称,避免重复创建。

3. 创建普通网络网桥

uci set network.br_main='device'
uci set network.br_main.type='bridge'
uci set network.br_main.name='br-main'
uci add_list network.br_main.ports='br-lan.10'
uci set network.br_main.bridge_empty='1'

uci set network.lan.device='br-main'
uci set network.lan.proto='static'
uci set network.lan.ipaddr='192.168.2.2'
uci set network.lan.netmask='255.255.255.0'
uci set network.lan.gateway='192.168.2.1'

AX 的 lan DHCP 必须关闭,因为普通网络的 DHCP 由 4A 提供。

4. 创建 SORA 网桥与网关

uci set network.br_sora='device'
uci set network.br_sora.type='bridge'
uci set network.br_sora.name='br-sora'
uci add_list network.br_sora.ports='br-lan.20'
uci set network.br_sora.bridge_empty='1'

uci set network.sora='interface'
uci set network.sora.proto='static'
uci set network.sora.device='br-sora'
uci set network.sora.ipaddr='192.168.20.1'
uci set network.sora.netmask='255.255.255.0'

如果 network.sora.type='bridge' 与独立 br-sora 同时存在,应删除旧式属性:

uci -q delete network.sora.type

否则可能出现:

Error: Network device is not present
NO_DEVICE

5. 配置 SORA DHCP

uci set dhcp.sora='dhcp'
uci set dhcp.sora.interface='sora'
uci set dhcp.sora.start='100'
uci set dhcp.sora.limit='150'
uci set dhcp.sora.leasetime='12h'
uci set dhcp.sora.dhcpv4='server'

客户端最终会获得 192.168.20.100192.168.20.249

6. 配置防火墙

创建 SORA 区域:

Input:ACCEPT
Output:ACCEPT
Forward:REJECT

允许:

sora → lan

不在 AX 的 sora 区域开启 IPv4 masquerade。主路由通过静态路由返回 SORA,拓扑更清晰,也避免不必要的双重 NAT。

7. 创建双频无线

双频 502 绑定 lan,双频 SORA 绑定 sora

502 2.4GHz → lan
502 5GHz   → lan
SORA 2.4GHz → sora
SORA 5GHz   → sora

示例:

uci set wireless.sora_radio0='wifi-iface'
uci set wireless.sora_radio0.device='radio0'
uci set wireless.sora_radio0.mode='ap'
uci set wireless.sora_radio0.network='sora'
uci set wireless.sora_radio0.ssid='SORA'
uci set wireless.sora_radio0.encryption='psk2'
uci set wireless.sora_radio0.key='<SORA-WIFI-PASSWORD>'

另一个频段同理。不要在文章、截图或命令历史中公开真实密码。

8. 应用并验证 AX

uci commit network
uci commit wireless
uci commit dhcp
uci commit firewall
/etc/init.d/network restart
wifi reload

等待无线接口创建后检查:

brctl show
ip -d link show br-lan.10
ip -d link show br-lan.20
ubus call network.interface.lan status
ubus call network.interface.sora status

期望结构:

br-main: br-lan.10 + wlan0 + wlan1
br-sora: br-lan.20 + wlan0-1 + wlan1-1

六、配置小米 4A

4A 的配置与 AX 类似,但它只是 VLAN20 的二层扩展,不是 SORA 网关。

1. 配置 VLAN

uci set network.@device[0].vlan_filtering='1'

uci set network.vlan10='bridge-vlan'
uci set network.vlan10.device='br-lan'
uci set network.vlan10.vlan='10'
uci add_list network.vlan10.ports='lan1:u*'
uci add_list network.vlan10.ports='lan2:u*'

uci set network.vlan20='bridge-vlan'
uci set network.vlan20.device='br-lan'
uci set network.vlan20.vlan='20'
uci add_list network.vlan20.ports='lan2:t'

2. 创建 br-main

uci set network.br_main='device'
uci set network.br_main.type='bridge'
uci set network.br_main.name='br-main'
uci add_list network.br_main.ports='br-lan.10'
uci set network.br_main.bridge_empty='1'

uci set network.lan.device='br-main'

保留 4A 原来的 192.168.2.1/24、DHCP、PPPoE、WAN NAT 和防火墙。

3. 创建无 IP 的 SORA 二层网桥

uci set network.br_sora='device'
uci set network.br_sora.type='bridge'
uci set network.br_sora.name='br-sora'
uci add_list network.br_sora.ports='br-lan.20'
uci set network.br_sora.bridge_empty='1'

uci set network.sora_l2='interface'
uci set network.sora_l2.proto='none'
uci set network.sora_l2.device='br-sora'

sora_l2

  • 不设置 IPv4 地址;
  • 不启用 DHCP;
  • 不创建防火墙区域;
  • 只负责把 4A 的 SORA 无线桥接到 VLAN20。

4. 创建双频 SORA

uci set wireless.sora_radio0='wifi-iface'
uci set wireless.sora_radio0.device='radio0'
uci set wireless.sora_radio0.mode='ap'
uci set wireless.sora_radio0.network='sora_l2'
uci set wireless.sora_radio0.ssid='SORA'
uci set wireless.sora_radio0.encryption='psk2'
uci set wireless.sora_radio0.key='<SORA-WIFI-PASSWORD>'

5GHz 同理。两台 AP 的 SSID、加密方式和密码应一致。

5. 添加 IPv4 回程路由

uci set network.route_sora='route'
uci set network.route_sora.interface='lan'
uci set network.route_sora.target='192.168.20.0/24'
uci set network.route_sora.gateway='192.168.2.2'

6. 完整重启网络与无线

实践中仅执行 network reload 后,原有无线接口可能仍留在旧的 br-lan。应检查 brctl show,必要时执行:

/etc/init.d/network restart
wifi down
sleep 2
wifi up

最终应看到:

br-main: br-lan.10 + phy0-ap0 + phy1-ap0
br-sora: br-lan.20 + phy0-ap1 + phy1-ap1
br-lan:  lan1 + lan2

七、启用 IPv6 双栈

1. 4A 从运营商请求 IPv6-PD

PPPoE 场景下,wan6 必须绑定 PPPoE 逻辑接口,而不是物理 WAN:

uci set network.wan.ipv6='1'
uci set network.wan6.device='@wan'
uci set network.wan6.proto='dhcpv6'
uci set network.wan6.reqaddress='try'
uci set network.wan6.reqprefix='auto'

重拨后检查:

ubus call network.interface.wan6 status

本文运营商下发了一个动态 /60

2. 4A 向普通 LAN 和 AX 提供 PD

uci set dhcp.lan.ra='server'
uci set dhcp.lan.dhcpv6='server'
uci set dhcp.lan.ndp='disabled'

502 终端直接从 4A 获得原生 IPv6。同时,4A 可以将 /60 中的一个 /64 委派给 AX。

3. AX 请求独立 /64

uci set network.lan6='interface'
uci set network.lan6.proto='dhcpv6'
uci set network.lan6.device='@lan'
uci set network.lan6.reqaddress='try'
uci set network.lan6.reqprefix='64'

uci set network.sora.ip6assign='64'

SORA 发布 RA/DHCPv6:

uci set dhcp.sora.ra='server'
uci set dhcp.sora.dhcpv6='server'
uci set dhcp.sora.ndp='disabled'
uci set dhcp.sora.ra_management='1'

检查:

ubus call network.interface.lan6 status
ubus call network.interface.sora status
ip -6 addr show dev br-sora
ip -6 route show

4A 的 odhcpd 租约中应出现 AX 的 /64,SORA 客户端应获得该 /64 中的公网地址。

4. OpenClash 双栈代理

需要开启:

  • IPv6代理;
  • IPv6 UDP代理;
  • IPv6 DNS解析;
  • IPv6 TProxy规则;
  • 不过滤 AAAA。

本文固件的 IPv6 Fake-IP 地址池生成存在兼容问题:启用后错误生成了:

fake-ip-range6: '1'

Mihomo 因配置无效而无法启动。最终采用兼容性更好的 Redir-Host:

uci set openclash.config.en_mode='redir-host'
uci set openclash.config.operation_mode='redir-host'
uci set openclash.config.dnsmasq_filter_aaaa='0'
uci commit openclash
/etc/init.d/openclash restart

验证:

grep -n 'enhanced-mode' /etc/openclash/config.yaml
nslookup -type=AAAA one.one.one.one 127.0.0.1
ip6tables -t mangle -vnL openclash
ip -6 rule show
ip -6 route show table 354

只有“客户端获得 IPv6 地址”并不足以证明代理成功。必须看到 OpenClash IPv6 TProxy 的 TCP/UDP 计数增长。

八、Wi-Fi 漫游与信道

同一网络在两台 AP 上使用相同 SSID、密码和加密方式,客户端就能根据自身算法切换 AP。802.11r 可以减少切换延迟,但两台 AP 必须保持参数一致:

Mobility Domain
FT over the Air / FT over DS
本地生成 PMK
加密方式
密码

本方案的 502 使用相同的 802.11r 参数。SORA 即使不启用 802.11r,也能进行普通漫游,只是切换速度稍慢。

增加第二个 SSID 不会自动增加射频信道。一个无线电可以在同一个信道上广播多个 BSSID。真正需要规划的是两台 AP 的物理信道:

  • 2.4GHz 尽量使用彼此不重叠或干扰较小的信道;
  • 5GHz 为两台 AP 选择不同信道;
  • 不要因为多 SSID 而误以为必须增加物理信道数量。

九、常见问题与解决方法

问题 1:应用 VLAN 后无法连接 Wi-Fi

症状:

authenticated
associated
deauthenticated due to local deauth request

检查无线是否真正加入上层网桥:

ip -d link show
brctl show

LuCI 概览可能只显示静态端口,不能据此判断无线没有加入。以内核输出中的 master br-mainmaster br-sora 为准。

问题 2:br-sora 显示 NO_DEVICE

常见原因:

  • sora 上残留旧式 type='bridge'
  • 同时又创建了独立 br-sora
  • 空网桥启动未开启;
  • br-lan.20 没有被引用或没有生成。

解决:删除 network.sora.type,保留独立 br-sora,并设置:

uci set network.br_sora.bridge_empty='1'

问题 3:4A 的无线仍挂在旧 br-lan

仅 reload 可能不足。执行完整 network restart 和 wifi down/up,等待无线驱动重新创建 AP 接口。

问题 4:SORA 能打开网页,但 Google Play 无法下载

如果页面能打开、下载却一直转圈,优先检查 IPv6 绕过:

  1. 暂时关闭 IPv6验证;
  2. 检查客户端是否获得了绕过 AX 的 RA;
  3. 检查 OpenClash是否有 IPv6 TProxy;
  4. 检查 AAAA 是否被正确代理,而不是直接从 4A 出口离开。

问题 5:开启 IPv6 后只有地址,没有默认路由

检查:

ubus call network.interface.wan6 status
ip -6 route show
logread | grep odhcpd

如果出现:

No default route present, setting ra_lifetime to zero

通常是 WAN6 尚未获得默认路由,或 DHCPv6 客户端绑错了设备。PPPoE 下应使用 @wan

问题 6:OpenClash 重启后代理规则消失

检查进程与规则:

pgrep -a clash
iptables-save | grep -ci openclash
ip6tables-save | grep -ci openclash

若防火墙重启时 /var/etc/openclash.include 尚未生成,应在 OpenClash正常运行后重启 OpenClash,让它重新安装规则。

问题 7:同名 Wi-Fi 无法确认连接的是哪台 AP

查看客户端 BSSID,或者在两台 LuCI 的“已连接站点”中查找客户端 MAC。不要只看 SSID和信号格数。

问题 8:配置页面失联

不要连续修改两台路由器。正确顺序:

  1. 先配置 AX,并保持笔记本连接救援口;
  2. 验证 AX 的 502、SORA 和管理地址;
  3. 再配置 4A;
  4. 4A 应使用自动回滚;
  5. 验证完成后才取消回滚。

十、最终验收清单

502

  • 获取 192.168.2.x
  • 网关与 DNS 为 192.168.2.1
  • 能访问两台路由器后台;
  • IPv4、IPv6均正常;
  • 不经过 OpenClash访问被限制站点。

SORA

  • 获取 192.168.20.x
  • 网关与 DNS 为 192.168.20.1
  • 获得 AX 委派的公网 IPv6 /64
  • Twitter、YouTube 正常;
  • Google Play 可以正常更新和下载;
  • OpenClash IPv4、IPv6 TProxy计数增长;
  • UDP应用正常。

链路与系统

  • 两台路由器之间 VLAN10 未标记、VLAN20 带标签;
  • 4A 存在 192.168.20.0/24 via 192.168.2.2
  • AX 的 lan 不提供普通 DHCP;
  • 4A 不在 VLAN20 上提供 DHCP;
  • 无双重 NAT;
  • WAN、PPPoE、UPnP和主防火墙正常;
  • 救援口仍可用。

十一、总结

这套方案的核心不是“创建两个 Wi-Fi”,而是把家庭网络按职责拆成两个真正独立的二层广播域:

VLAN10:普通直连
VLAN20:OpenClash代理

802.1Q 让它们共享同一个 LAN2 物理端口;br-mainbr-sora 负责把动态无线接口稳定地接入对应 VLAN;4A 负责 PPPoE、普通 DHCP 和公网出口;AX 负责 SORA 的网关、DHCP、IPv6-PD下游分配与 OpenClash透明代理。

最终,一根暗线同时提供了:

  • 两套相互隔离的网络;
  • 两台 AP 的双频覆盖;
  • 普通直连与按 SSID 选择代理;
  • IPv4/IPv6双栈;
  • 不需要终端安装代理软件的透明代理体验。

VLAN 配置最容易出错的地方不是概念,而是设备接口名称、PVID、无线动态接口和应用顺序。只要保留救援口、逐台实施、使用自动回滚,并以内核实际状态而不是仅看 LuCI 概览进行验证,这类家庭网络改造就可以做到既灵活又稳定。