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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM