一、为什么要这样做
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.10 和 br-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 端口名称可能是 lan1、lan2、lan3,也可能是 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 是主路由,修改前至少应:
- 下载完整系统备份;
- 保存
/etc/config/network与/etc/config/wireless; - 准备延时自动回滚脚本;
- 先配置 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.100 至 192.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-main 或 master 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 绕过:
- 暂时关闭 IPv6验证;
- 检查客户端是否获得了绕过 AX 的 RA;
- 检查 OpenClash是否有 IPv6 TProxy;
- 检查 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:配置页面失联
不要连续修改两台路由器。正确顺序:
- 先配置 AX,并保持笔记本连接救援口;
- 验证 AX 的 502、SORA 和管理地址;
- 再配置 4A;
- 4A 应使用自动回滚;
- 验证完成后才取消回滚。
十、最终验收清单
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-main 和 br-sora 负责把动态无线接口稳定地接入对应 VLAN;4A 负责 PPPoE、普通 DHCP 和公网出口;AX 负责 SORA 的网关、DHCP、IPv6-PD下游分配与 OpenClash透明代理。
最终,一根暗线同时提供了:
- 两套相互隔离的网络;
- 两台 AP 的双频覆盖;
- 普通直连与按 SSID 选择代理;
- IPv4/IPv6双栈;
- 不需要终端安装代理软件的透明代理体验。
VLAN 配置最容易出错的地方不是概念,而是设备接口名称、PVID、无线动态接口和应用顺序。只要保留救援口、逐台实施、使用自动回滚,并以内核实际状态而不是仅看 LuCI 概览进行验证,这类家庭网络改造就可以做到既灵活又稳定。