前言
网上能找到不少路由器接 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