RT-AX88U配置SSID VLAN以及端口VLAN

今天购买并换上了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模式”是什么含义。

参考资料

  1. https://www.snbforums.com/threads/rt-86u-vlanctl-ethctl-usage-puzzle.54375/#post-581747
  2. https://wu.renjie.im/blog/network/ax88u-vlan/zh-cn/
  3. https://www.cnblogs.com/u128393/p/11629969.html
  4. https://www.cnblogs.com/u128393/p/11629970.html
  5. https://www.cnblogs.com/u128393/p/11629971.html
  6. https://www.snbforums.com/threads/rt-ax88u-vlan-tagged-setup-ethctl-news.62887/

发表评论?

3 条评论。

  1. 感谢您对这篇文章! (Thank you for the post) I hope my comment it will be displayed OK. This are my first character using Google Translate :)

  2. 大佬,我刚买了两台ax68u,我这边需要做aimesh然后做IPTV和单线复用,我不知道怎么搞,openwrt没问题但是华硕这个实在不会了,求教于。

  3. 大佬求个联系方式,我的QQ:324811359

发表评论

注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)

本文链接:https://twd2.me/archives/14754QrCode