前言
網上能找到不少路由器接 IPTV 的例子,前期給了我很大的幫助。但我選的這兩個設備給我留了兩個大坑,幾經折騰才終於能流暢觀看了。過程中學到不少目前百度/谷歌都找不到或很難找到的東西,做一下分享。
拓撲圖
兩個大坑
- RT-AC86U 不支持 robocfg 命令,網上找不到正確配置 VLAN 的例子。
- 目前能找到的例子都有使用電信設備設置組播(VLAN 51),這背后隱藏了一些細節,不正確配置會導致卡頓/卡死。
幾個知識點
- 路由器接 IPTV 需要在路由器上配置 DHCP OPTION 125 (上海電信是這個),網上很多例子,這里不再贅述。
- 上海電信撥號上網(PPPoE)走 Native VLAN (untagged),IPTV 專網走 VLAN 85,組播走 VLAN 51。
- 網上有人提到現在 4K IPTV 不需要 VLAN 51 了,其實是需要的,這跟前面提到的坑有關。
RT-AC86U VLAN 配置
照着網上的例子,發現 RT-AC86U 沒有 robocfg,而且找不到替代方法,很絕望啊有沒有。倒是看到有人提到 vlanctl,但沒正確配置的例子,谷歌也只看到有人在研究,沒有個結果。不過發現梅林的源代碼里其實有用到這個命令,經過仔細對比上下文,加上大腦的飛速運轉 [滑稽](其實是花了一整天就琢磨那幾個參數),終於弄明白了。
由於示例太長,單獨發了博客:RT-AC86U VLAN 配置 - vlanctl 篇。另外過程中還發現使用 vconfig 同樣可以配置 VLAN,甚至更簡單,參見:RT-AC86U VLAN 配置 - vconfig 篇。
不看也沒有關系,本文最后有完整腳本。
IGMP Snooping
配置好 VLAN 85 后,IPTV 盒子 就能同時獲取到 公網 和 專網 的 IP 地址了。但是事情總沒那么順利,這時你會發現看直播一會就卡,再過一會直接卡死。
在說怎么解決之前,先說一下我當時的情況。因為某種沒必要細說的原因,我當時撤下了自己的光貓(TL-EP110),換回了電信光貓,這時候抓包會發現組播的數據是在 VLAN 85 傳輸的。
經過對每一層接口進行抓包分析,發現組播數據傳到了 vlan85 這個 bridge 后就沒再往后傳了。好在當時花時間狂補了組播相關知識,感覺應該跟 IGMP Snooping 有關。幾番查找,在 梅林 源代碼中看到 bcmmcastctl 這個命令,用法如下:
bcmmcastctl mode -i vlan85 -p 1 -m 1 # 對 vlan85 啟用 IGMP Snooping
bcmmcastctl mode -i vlan85 -p 2 -m 1 # 對 vlan85 啟用 MLD Snooping(這個是針對 IPv6 的,可以不管)
測試后可用![淚流滿面]
然而還是高興得太早...
VLAN 51
換回自己的光貓,發現直播還是卡,這時候心里飄過一群草泥馬。繼續抓包發現組播數據是從 VLAN 51 傳進來的,而用電信光貓時完全就沒看見 VLAN 51 的影子!這時候我做了一個大膽的假設,電信光貓一定是把 VLAN 51 的數據轉發到了 LAN 端 的 VLAN 85 ,如下圖所示:
說時遲那時快(其實是說時快那時傻p兮兮的),我立馬嘗試在路由器上做類似的配置,果不其然(心里想我真TND聰明),終於可以無比絲滑地看電視了(雖然以后會不會看還不一定呢)!
最終配置
兩個版本二選一,推薦使用 vconfig 版。另外,記得還要配置 DHCP OPTION 125(自行百度吧)。
#!/bin/sh
# 該腳本需要在 services-start 中運行
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 br1 #
brctl addif br1 eth0.v0 #
ifconfig br1 up #
#
nvram set wan_ifnames=br1 #
nvram set wan_ifname=br1 #
nvram set wan0_ifname=br1 #
#####################################################################
#####################################################################
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 85
vlanctl --if eth0 --rx --tags 1 --filter-vid 85 0 --pop-tag --set-rxif eth0.v85 --rule-append
vlanctl --if eth0 --rx --tags 1 --filter-vid 51 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
bcmmcastctl mode -i vlan85 -p 1 -m 1
bcmmcastctl mode -i vlan85 -p 2 -m 1
#!/bin/sh
# 該腳本可手動執行,或放入 wan-start 中開機自動運行
vconfig set_name_type DEV_PLUS_VID_NO_PAD
vconfig add eth0 85
vconfig add br0 85
brctl addbr vlan85
brctl addif vlan85 eth0.85
brctl addif vlan85 br0.85
bcmmcastctl mode -i vlan85 -p 1 -m 1
bcmmcastctl mode -i vlan85 -p 2 -m 1
ifconfig eth0.85 up
ifconfig br0.85 up
ifconfig vlan85 up
vconfig add eth0 51
brctl addif vlan85 eth0.51
ebtables -A FORWARD -i eth0.51 -o ! br0.85 -j DROP
ebtables -A FORWARD -o eth0.51 -j DROP
ifconfig eth0.51 up
作者:u128393
首發:https://www.cnblogs.com/u128393/p/11629969.html