北京联通使用ODI猫棒+openwrt单线复用白嫖IPTV

前两天听说北京联通的IPTV可以白嫖,rtp组播流可以直接看,于是折腾了下路由代理IPTV。

首先声明:这不是一个严谨的教程,而是折腾的经验,可能会有错误的理解,或者多余的操作,只为分享记录,互相借鉴。以下经验只适用于北京联通。

用关键词北京联通 openwrt IPTV来搜索,网上已经有很多教程了,虽然每个教程的实际设备不太一样,大多都分为三步

  1. 硬件配置:光猫桥接,或者分两条线连路由
  2. 软件配置:igmpproxy igmpsnooping(igmp嗅探)等等设置
  3. 防火墙设置:各种规则

然后原文基本就说大功告成了,一开udpxy就能看电视。

然而自己实际去试,基本不可能一次跑通,多多少少由于设备不同,环境不同,哪里可能需要一些额外配置,下面说说我这种情况下(ODI猫棒DFP-34X-2C2)折腾的过程,和debug的方法。

ODI猫棒的固件列表:https://github.com/Anime4000/RTL960x/tree/main/Firmware/DFP-34X-2C2

一般网上北京联通的教程教你初次配置猫棒时,会让你先安装Vlan_220414固件,配置一个MAC的Mapping表,之后再刷220923固件桥接拨号。所以我现在使用的就是220923

第一步:啥也不动,直接在有线连接的电脑上试一下PotPlayer能不能播放 rtp://239.3.1.129:8008这个链接,能看到画面,说明组播是通的,但是我之后配置udpxy怎么都代理不到这个组播流,很是灵异。为什么没配置IPTV任何东西就有组播流?不知道。为什么udpxy抓不到?不知道。一脸懵逼的开始折腾。

第二步:既然混在一起抓不到,那我单独把IPTV的子网拎出来看看是否可以代理到? 把220923固件中VLAN设置那个页面里的固定3961改成透传,然后在openwrt中拨号时,用eth0.3961这样的VLAN去拨号,再加一个接口用eth0.3964设置DHCP客户端,这样可以同时连公网并且拿到IPTV的内网IP,算是更近一步的进展。但是我用udpxy代理上游设置到这个接口,继续拿不到组播流。

此时开始了各种排查

  • 怀疑igmpproxy没起作用 (没起作用我也能收到组播流啊,忽略)
  • 怀疑istore固件里没有接口的物理网络选项卡,以及igmp snooping的勾选。(通过命令行查看network配置发现默认有igmp snooping 1)
  • 怀疑防火墙设置 (直接全开排除)
  • 怀疑路由表有问题,(尝试修改路由表但是没有弄懂如何traceroute一个组播IP,不了了之)。

如果在折腾中,你怀疑是否真的有rtp的组播流存在于内网,可以在任意直连内网网线的机器里(桥接的虚拟机不行),试试tcpdump抓包

 tcpdump -T rtp -i eth2 udp portrange 8000-9000

这个命令是抓rtp协议的udp包,端口在8000-9000之间的,也就是联通组播端口的范围。PotPlayer一播放,内网就能抓到比如:

00:52:40.598048 IP 61.135.101.121.8060 > 239.3.1.241.8000: udp/rtp 1316 c33  2542 38265933 [|rtp]  
00:52:40.599834 IP 61.135.101.121.8060 > 239.3.1.241.8000: udp/rtp 1316 c33  2543 38266109 [|rtp]  
00:52:40.600727 IP 61.135.101.121.8060 > 239.3.1.241.8000: udp/rtp 1316 c33  2544 38266197 [|rtp]  
00:52:40.601553 IP 61.135.101.121.8060 > 239.3.1.241.8000: udp/rtp 1316 c33  2545 38266285 [|rtp]  
00:52:40.604313 IP 61.135.101.121.8060 > 239.3.1.241.8000: udp/rtp 1316 c33  2546 38266461 [|rtp]  
00:52:40.605154 IP 61.135.101.121.8060 > 239.3.1.241.8000: udp/rtp 1316 c33  2547 38266548 [|rtp]  

第三步,刷固件换方案。

各种方法实验都不成功,最后找到了国外的一份光猫wiki里说,推荐用220916固件,因为VLAN相关设置是working的。试试换个思路,不在路由器配置,从猫入手。于是更新到这个固件。这个固件的UI有了很大变化,多了一堆可配置的地方,比如可以猫棒拨号,路由设定,组播VLAN设置(最关键的东西)。(我实际更新到的是0916的再下一个版本1209)

广域网可以按照下面的方式配置下:

其中nas0_0是internet拨号,nas0_1是IPTV内网。这样设置完之后,反而PC内网没有rtp组播流了。那么可以判断出,组播流如果不特殊设置,是无法透到下一个子网的,只能在相同内网内广播。这里需要一个igmpproxy但是猫棒里没有,于是准备找找固件里有没有现成的,还真找到了组播VLAN这个页面。

这里应该是配置透传组播信息的地方,先填上3964看看?没变化还是播不了。但是之前看别人教程说北京联通有个组播相关的VLAN是4000,填在这里看看,果真可以正常代理了。。

那么按我的理解这个组播数据流应该是从4000vlan下来的,但是为什么桥接3961/3964拨号时,还可以收到这个流?为什么其他人教程里没有填4000这回事还可以代理?全都不知道。糊里糊涂的就折腾好了,看来接下来还需要补一补网络底层知识。

我猜测第一步第二步时,组播数据带着vlanid4000来到路由器,而udpxy监听的只是跟3961 3964桥接的虚拟接口,所以抛弃了4000不认。但是数据proxy到lan时,抹掉了所有包的vlanid,因为下级没设置vlan,所以内网PC可以抓到流,而路由的软件不行。这个猜测还需要进一步验证。

Ruosen

Be a Geek, Do the right thing;