RT-AC86U VLAN 配置 - vlanctl 篇

RT-AC86U 没有 robocfg 命令,网上找不到成功配置 VLAN 的例子。几番摸索,发现可以用 vlanctl 或 vconfig 来实现,本篇介绍 vlanctl 的用法(传送门:vconfig 篇)。

示例 1

vlanctl --mcast --if-create eth0 85
vlanctl --if eth0 --rx --tags 1 --filter-vid 85 0 --pop-tag --set-rxif eth0.v85 --rule-append
vlanctl --if eth0 --tx --tags 0 --filter-txif eth0.v85 --push-tag --set-vid 85 0 --rule-append
ifconfig eth0.v85 up

我们逐条分解:

vlanctl --mcast --if-create eth0 85

基于 eth0 创建一个虚拟接口并命名为 eth0.v85,注意这里的 85 只是一个名字,跟 VLAN tag 没有任何关系。--mcast 在 vlanctl 的帮助文档上没看到,但 梅林 的代码里都加了这个参数,看名字应该是为接口启用多播。

vlanctl --if eth0 --rx --tags 1 --filter-vid 85 0 --pop-tag --set-rxif eth0.v85 --rule-append

如果 接口 eth0 接收到的数据 (--if eth0 --rx),有 1 个 VLAN tag (--tags 1),并且第 0 个 tag 的 VLAN ID 是 85 (--filter-vid 85 0),则 脱去 tag (--pop-tag),并设置接收接口为 eth0.v85 (--set-rxif eth0.v85)。把这条规则添加到表中 (--rule-append)。

vlanctl --if eth0 --tx --tags 0 --filter-txif eth0.v85 --push-tag --set-vid 85 0 --rule-append

接口 eth0 发送数据时 (--if eth0 --tx),如果 没有 VLAN tag (--tags 0),并且 发送数据的虚拟接口是 eth0.v85 (--filter-txif eth0.v85),则 给数据(以太帧)加上一个 VLAN tag (--push-tag),并给第 0 个(刚加的)tag 设置 VLAN ID 为 85 (--set-vid 85 0)。把这条规则添加到表中 (--rule-append)。

ifconfig eth0.v85 up

启用这个虚拟接口。

示例 2

示例 1 只处理了 eth0(WAN 口) ,接下来我们对 eth1(LAN 口 4)做类似处理,并把它们桥接起来。这样 WAN 和 LAN 口 4 的 VLAN 85 就联通了。

vlanctl --mcast --if-create eth0 85
vlanctl --if eth0 --rx --tags 1 --filter-vid 85 0 --pop-tag --set-rxif eth0.v85 --rule-append
vlanctl --if eth0 --tx --tags 0 --filter-txif eth0.v85 --push-tag --set-vid 85 0 --rule-append
ifconfig eth0.v85 up

vlanctl --mcast --if-create eth1 85
vlanctl --if eth1 --rx --tags 1 --filter-vid 85 0 --pop-tag --set-rxif eth1.v85 --rule-append
vlanctl --if eth1 --tx --tags 0 --filter-txif eth1.v85 --push-tag --set-vid 85 0 --rule-append
ifconfig eth1.v85 up

brctl addbr vlan85
brctl addif vlan85 eth0.v85
brctl addif vlan85 eth1.v85
ifconfig vlan85 up

示例 3

示例 2 中 VLAN 85 的 tag,从 eth0 进入路由器后被脱掉,再从 eth1 出去时又被加回去(反过来也一样),其实是做了无用功。我们可以稍作修改让 VLAN 85 的帧保留 tag 在 eth0 和 eth1 之间传输。

vlanctl --mcast --if-create eth0 85
vlanctl --if eth0 --rx --tags 1 --filter-vid 85 0 --set-rxif eth0.v85 --rule-append
vlanctl --if eth0 --tx --tags 1 --filter-txif eth0.v85 --rule-append # 这行可删除
ifconfig eth0.v85 up

vlanctl --mcast --if-create eth1 85
vlanctl --if eth1 --rx --tags 1 --filter-vid 85 0 --set-rxif eth1.v85 --rule-append
vlanctl --if eth1 --tx --tags 1 --filter-txif eth1.v85 --rule-append # 这行可删除
ifconfig eth1.v85 up

brctl addbr vlan85
brctl addif vlan85 eth0.v85
brctl addif vlan85 eth1.v85
ifconfig vlan85 up

做了两处修改:

  1. 对于 --rx ,我们不再脱去 tag,所以去掉了 --pop-tag 。
  2. 对于 --tx ,因为之前没有脱掉 tag,所以 tag 数 是 1 而不是 0 (改为 --tags 1),然后不再需要添加 tag 和 设置 vid,所以去掉了 --push-tag 和 --set-vid 85 0 。

这样修改后,对于 --tx 其实我们什么也没做,所以这条 rule 是可以删掉的。

示例 4

除了 VLAN 85,我们也许同时想把 VLAN 51 也打通,或者我们根本不想管它 VLAN ID 是多少,除了 Native VLAN (untagged) 用于上互联网(上海电信是这样),其他全给打通(类似于 trunk)。这其实很容易实现,命令比上个示例更简单,这是 vlanctl 的灵活之处。

vlanctl --mcast --if-create eth0 1
vlanctl --if eth0 --rx --tags 1 --set-rxif eth0.v1 --rule-append
ifconfig eth0.v1 up

vlanctl --mcast --if-create eth1 1
vlanctl --if eth1 --rx --tags 1 --set-rxif eth1.v1 --rule-append
ifconfig eth1.v1 up

brctl addbr br1
brctl addif br1 eth0.v1
brctl addif br1 eth1.v1
ifconfig br1 up

除了接口名字都换了一下,只做了一处修改:去掉了 --filter-vid 85 0。这样只要 tag 数是 1,全部透传。

示例 5

前面的示例其实都不完整,因为一旦用 vlanctl 创建虚拟接口之后,原来的接口就不能用了。具体原因不清楚,可能跟 vlanctl 的实现机制有关。所以为了让 WAN 和 LAN 的 Native VLAN 还能用,需要针对 --tags 0 也创建虚拟接口。

#!/bin/sh

# 该脚本需要在 services-start 中运行
# 注:这只是 vlanctl 的用法示例,不是完整的 IPTV 配置脚本

ifconfig eth0 allmulti up

#####################################################################
vlanctl --mcast --if-create eth0 0                                  #
vlanctl --if eth0 --rx --tags 0 --set-rxif eth0.v0 --rule-append    #
ifconfig eth0.v0 up                                                 #
                                                                    #
brctl addbr br2                                                     #
brctl addif br2 eth0.v0                                             #
ifconfig br2 up                                                     #
                                                                    #
nvram set wan_ifnames=br2                                           #
nvram set wan_ifname=br2                                            #
nvram set wan0_ifname=br2                                           #
#####################################################################

#####################################################################
brctl delif br0 eth1                                                #
                                                                    #
vlanctl --mcast --if-create eth1 0                                  #
vlanctl --if eth1 --rx --tags 0 --set-rxif eth1.v0 --rule-append    #
ifconfig eth1.v0 up                                                 #
                                                                    #
brctl addif br0 eth1.v0                                             #
#####################################################################

vlanctl --mcast --if-create eth0 1
vlanctl --if eth0 --rx --tags 1 --set-rxif eth0.v1 --rule-append
ifconfig eth0.v1 up

vlanctl --mcast --if-create eth1 1
vlanctl --if eth1 --rx --tags 1 --set-rxif eth1.v1 --rule-append
ifconfig eth1.v1 up

brctl addbr br1
brctl addif br1 eth0.v1
brctl addif br1 eth1.v1
ifconfig br1 up

几点说明:

  • 用 #号 框起来的部分即是为了恢复 eth0 和 eth1 对 Native VLAN 的支持。之后的代码跟前一个示例相同。
  • 不知道为什么,新建的虚拟接口 eth0.v0 不能直接用于拨号上网,需要把它添加到一个 bridge 中。
  • 为了让系统知道拨号上网的接口改了,需要设置 nvram 几个相关变量,并且这段代码在开机过程中需要在 WAN 初始化好之前运行。
  • 需要从 LAN 对应的 bridge 中删掉 eht1,并添加 eth1.v0,所以这段代码在开机过程中需要在 LAN 初始化好之后运行。
  • services-start 是 梅林系统 中同时满足以上两个条件的唯一脚本。
  • bridge 中的接口有一段初始化的过程,需要从 disabled 经过 listening、learning 到 forwarding 等几个状态才能变成可用,所以开机拨号会变慢(不过也还好,就多一小会)。

完整的 IPTV 配置脚本参见:上海电信 TL-EP110 + RT-AC86U 实现观看 4K IPTV 无卡顿 (2019-10)

作者:u128393
首发:https://www.cnblogs.com/u128393/p/11629970.html

posted @ 2019-10-07 12:20  u128393  阅读(9239)  评论(0编辑  收藏  举报