今天购买并换上了RT-AX88U, 作AP使用。
由于业务需求, 我需要配置四个SSID, 这里不妨记为SSID、SSID-5G、SSID-IoT以及SSID-IPTV。其中, SSID以及SSID-5G是正常无线网络的SSID, 需要设置在默认VLAN 1; SSID-IoT是专为IoT (物联网)设备开放的无线网络, 需要设置在VLAN 4; SSID-IPTV是为将来的无线IPTV设备预留的无线网络, 设置在VLAN 2。同时, 无线AP附近有一台某品牌”智能”电视, 需要将其通过AP的有线接口(LAN3)接入IoT网络(VLAN 4)。此外, 需要预留一个有线接口(不妨为LAN4)接入IPTV网络(VLAN 2)做测试用。最后, 所有VLAN通过有线的Trunk口LAN1 (默认VLAN为1)接入上级交换机。
经过研究, 我发现可以使用vlanctl命令行工具结合Linux网桥来进行配置, 如下脚本所示(vlan.sh)。
#!/bin/bash
WAN=eth0
LAN1=eth4
LAN2=eth3
LAN3=eth2
LAN4=eth1
LAN5_8=eth5
WLAN2_4G_0=eth6
WLAN5G_0=eth7
WLAN2_4G_1=wl0.1
WLAN5G_1=wl1.1
WLAN2_4G_2=wl0.2
WLAN5G_2=wl1.2
WLAN2_4G_3=wl0.3
WLAN5G_3=wl1.3
function create_vlan_untagged {
local if=${1}
local vlanid=${2}
vlanctl --mcast --if-create-name ${if} ${if}.${vlanid}
vlanctl --if ${if} --rx --tags 0 --set-rxif ${if}.${vlanid} --rule-append
ifconfig ${if}.${vlanid} up
}
function create_vlan_tagged {
local if=${1}
local vlanid=${2}
vlanctl --mcast --if-create-name ${if} ${if}.${vlanid}
vlanctl --if ${if} --rx --tags 1 --filter-vid ${vlanid} 0 --pop-tag --set-rxif ${if}.${vlanid} --rule-append
vlanctl --if ${if} --tx --tags 0 --filter-txif ${if}.${vlanid} --push-tag --set-vid ${vlanid} 0 --rule-append
ifconfig ${if}.${vlanid} up
}
# LAN1: Trunk, 1 untagged, 2 tagged, 4 tagged
# LAN3: 4 untagged
# LAN4: 2 untagged
# WLAN2_4G_1 (IoT): 4 untagged
# WLAN2_4G_2 (IPTV): 2 untagged
create_vlan_untagged ${LAN1} 1
create_vlan_tagged ${LAN1} 2
create_vlan_tagged ${LAN1} 4
brctl addif br0 ${LAN1}.1
brctl delif br0 ${LAN1}
brctl addbr vlan4
brctl addif vlan4 ${LAN1}.4
brctl delif br0 ${LAN3}
brctl addif vlan4 ${LAN3}
brctl delif br0 ${WLAN2_4G_1}
brctl addif vlan4 ${WLAN2_4G_1}
ifconfig vlan4 up
brctl addbr vlan2
brctl addif vlan2 ${LAN1}.2
brctl delif br0 ${LAN4}
brctl addif vlan2 ${LAN4}
brctl delif br0 ${WLAN2_4G_2}
brctl addif vlan2 ${WLAN2_4G_2}
ifconfig vlan2 up
vlanctl --if ${LAN1} --set-if-mode-rg
ethswctl -c hw-switching -o disable
vlanctl --rule-dump-all
其中, vlanctl --if ${LAN1} --set-if-mode-rg将LAN1设置为RG模式, 原因请见参考资料1。ethswctl -c hw-switching -o disable将交换芯片工作模式设置为软件交换, 因为硬件交换似乎无法在这种情况下正常工作。
为了使其能够开机运行, 需要在系统管理—系统设置中开启”Enable JFFS custom scripts and configs”, 然后在/jffs/scripts/services-start脚本中调用它, 如下所示。
#!/bin/bash /jffs/scripts/vlan.sh
此外, 我发现一旦修改了无线网络的配置, 无线网络对应的几个网络接口(wl0.1等)会回到默认的网桥br0, 因此需要在/jffs/scripts/service-event-end脚本中重新将其加回对应VLAN的网桥, 如下所示。
#!/bin/bash /jffs/scripts/ensure_br.sh
其中, ensure_br.sh内容为:
# 前一部分的变量定义同vlan.sh, 此处略。
function ensure_br {
local br=${1}
local if=${2}
if brctl show br0 | grep ${if}; then
brctl delif br0 ${if}
brctl addif ${br} ${if}
fi
}
ensure_br vlan4 ${WLAN2_4G_1}
ensure_br vlan2 ${WLAN2_4G_2}
2023年7月2日更新:
近期, 我观察发现, 在上述配置下, 从LAN4口收到的(VLAN 2的)广播帧以及从LAN3口收到的(VLAN 4的)广播帧均会被复制一份不带VLAN Tag的版本后转发到LAN1口(Trunk口)。由于LAN1口的默认VLAN为1, 这就使得这些广播帧都错误地混入VLAN 1中。然而, 从无线网络接口收到的VLAN 2或VLAN 4的广播帧则似乎无此问题。经过研究, 我目前推测是底层的交换芯片或者bcmvlan.ko内核模块的问题, 我难以解决。于是, 我决定取消LAN1口的默认VLAN, 要求所有帧都必须携带VLAN Tag, 并在上级交换机上过滤掉不带VLAN Tag的帧。修改部分的配置如下:
create_vlan_tagged ${LAN1} 1
vlanctl --if ${LAN1} --tx --tags 0 --default-miss-drop
其中, vlanctl --if ${LAN1} --tx --tags 0 --default-miss-drop尝试禁止向LAN1口发送不带VLAN Tag的帧。然而, 我实际测试发现, 无论加不加这条命令, 所有VLAN的广播帧均会以不带VLAN Tag的形式向LAN1口转发一份。
此外, 我至今没搞明白”RG模式”是什么含义。
参考资料
- https://www.snbforums.com/threads/rt-86u-vlanctl-ethctl-usage-puzzle.54375/#post-581747
- https://wu.renjie.im/blog/network/ax88u-vlan/zh-cn/
- https://www.cnblogs.com/u128393/p/11629969.html
- https://www.cnblogs.com/u128393/p/11629970.html
- https://www.cnblogs.com/u128393/p/11629971.html
- https://www.snbforums.com/threads/rt-ax88u-vlan-tagged-setup-ethctl-news.62887/

感谢您对这篇文章! (Thank you for the post) I hope my comment it will be displayed OK. This are my first character using Google Translate
大佬,我刚买了两台ax68u,我这边需要做aimesh然后做IPTV和单线复用,我不知道怎么搞,openwrt没问题但是华硕这个实在不会了,求教于。
大佬求个联系方式,我的QQ:324811359