今天购买并换上了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