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
做了兩處修改:
- 對於 --rx ,我們不再脫去 tag,所以去掉了 --pop-tag 。
- 對於 --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