光纤入户光猫改桥接+内网转发IPTV=任意设备看电视直播

 

警告:本文将会介绍修改本地网络环境,部分操作有可能会导致你无法连接网络,如果不具备相关的网络知识,可能难以修复,甚至需要请运营商人员协助。所以以下内容请谨慎操作 注意:请确保你手中有你家网络的PPPoE拨号账户密码(通常印在了办理业务给的用户回单上),也可以通过电话咨询运营商,也可以进入到路由器的设置里找到相应的用户名和密码

最近新购置了一个软路由,对宿舍的网络改造可以更进一步了。宿舍使用的是北京联通300M的光纤入户(实际上能跑到400M,不知道是不是管理人员操作错了。。。),赠送了一台F477光猫和一台中兴B860AV2.1B的IPTV机顶盒(的使用权)。

宿舍本来使用思科E6500硬路由,然而这个硬路由使用的ARM CPU并不支持AES指令集,导致科学上网时的网速会受到对数据包加密解密性能的影响,本来直接用PC客户端的V2Ray能跑到200M左右,但只要在E6500上做全局部署,只能跑到10M左右的速度,不但对科学上网服务器的贷款是严重的浪费,而且对于使用Apple TV和Xbox等只能通过路由器进行科学上网的设备来说,不足以支撑在线视频(Netflix、HBO)等服务的正常使用。

于是从万能宝上购置了一台3650U的6端口软路由,刷了OpenWRT Koolshare系统。然后根据宿舍的网络情况,旨在通过设置满足如下要求:

  1. 光猫改桥接
  2. 局域网内仍然能够访问到改桥接之后的光猫(为了方便对光猫的各种配置)
  3. 局域网内任意端口能插IPTV机顶盒
  4. 局域网内任意设备能获得IPTV的组播数据(即不需要机顶盒的情况下看直播)
  5. 监听并解析机顶盒的数据协议,实现随时更新IPTV专网播放列表(为第4步在任意设备上观看IPTV提供播放列表)

所以本文就围绕着上面的几个需求进行研究。

光猫改桥接

什么是光猫改桥接?

曾经在拨号上网时代,电脑通过电话线路传输数据。此时电脑上需要安装一个叫做Modem(调制解调器,俗称「猫」)的硬件,然后将电话线连接到Modem上。所谓调制解调,就是指用来将数字信号(电脑上的数据包)转换成模拟信号(电话线路)进行调制或者反向转换进行解调制的设备。有了这个设备我们就能通过电话线路进行网络的访问。

而后在ADSL时代,调制解调器通常是外置的:将电话线连接到调制解调器上,再通过以太网线将调制解调器与电脑相连。由于当时家庭内的网络设备并不是很普及,所以最常见的还是一台电脑搭配一个调制解调器。这个时候电脑通过一个叫做PPPoE的方式,利用运营商提供的用户名和密码实现「认证并连接互联网」的功能。

再后来,由于无线互联网(Wi-Fi)的出现,家庭之中越来越多的设备有接入网络的需求。所以「路由器」甚至是「无线路由器」这种东西开始出现在家庭之中。

其实路由器本身也可以看作是一台小型的电脑————它代替了电脑与调制解调器进行连接、并通过PPPoE协议进行拨号、最后让所有连接在路由器上的设备成为同一个局域网并且都通过路由器实现上网的功能。彼时,想要上网你还是需要调制解调器和路由器两台设备。

再再后来,无线路由器几乎成了家家标配:手机、游戏机、甚至是家里有不止一台电脑,都使得「无线路由器」成为了事实上的「网络接入必备设备」。

目前,很多家庭已经开始使用FTTH(光纤到户)的方式接入光纤网络。其实光纤虽然从传输介质、网络协议和传输速度和电话线有着本质上的不同,但是网络设备的拓扑结构和当年的ADSL甚至拨号上网没有太大的区别:都是外面的接线连接到调制解调器、调制解调器连接到路由器、路由器连接到设备。但由于路由器成为了基本需求,所以事实上现在运营商在办理光纤宽带服务时赠送的「光猫」实际上是将「调制解调器」和「路由器」合二为一的设备。(不过其实在ADSL时代已经推出了将调制解调器与路由器整合到一起的设备了)

运营商送的「光猫」通常需要输入一根光纤,同时提供了至少1个局域网输出接口(一般都是4个以上),甚至还提供无线网络访问的功能。而光猫内置的操作系统相当于进行了PPPoE的操作,并且所有连接在光猫上的设备都属于同一个局域网。

通常来说,运营商提供的光猫已经能够满足我们的基本需求:上网,有的还可以实现IPTV在线看高清直播甚至点播。但由于光猫本身只是一台性价比比较高的硬件设备,它总会有它的性能的瓶颈。有时候当我们升级光纤到更快的速度时、需要一些进阶应用时,运营商赠送的光猫性能已经达到了性能极限,这个时候我们就需要为光猫降低它所需要处理的数据需求。一种方式就叫做「光猫改桥接」。

所谓「光猫改桥接」其实就是让光猫回归其本职工作:调制解调。除此之外的所有功能(路由、局域网地址分配、各种如科学上网之类的应用)交给我们购买的性能更强的路由器。这里我使用的就是软路由。

「软路由」相对于「硬路由」,最大的区别在于它其实就是一台完整的电脑:有CPU、内存、硬盘、乃至视频输出接口。甚至还可以是x86架构的,如果你愿意,你甚至可以在它上面运行一个完整的Windows。而硬路由通常是「完全针对网络设备进行设计优化、甚至有自己的数据交换芯片的专用硬件设备」。通常软路由由于本质上就是一台电脑,所以它的性能可以很强、同时它的可配置型也非常强大,在一个强大的操作系统的加持下,甚至能够做到任何你想要做到的与网络连接有关的事情。

而想要实现这些功能的第一步,可以是「光猫改桥接」。(这里说「可以是」,是因为其实即便不进行光猫改桥接,软路由的一些功能也是能够使用的。但为了缓解光猫的瓶颈和实现更自由的网络配置。通常我们的第一步就是进行光猫改桥接)。

光猫改桥接通常有两种方式。一种是直接给运营商打电话————由于为了方便广大不懂技术的普通用户,减少运营商的网络工程师上门操作的工作压力,现在很多光猫都具备远程设置功能。通常你只需要给运营商打个电话说:「您好请帮我把光猫改桥接」,如果接线员明白的话对方直接在网络上帮你操作一些就能直接搞定。然而这种方法依赖于接线员知不知道「光猫改桥接」这件事,如果对方不知道,估计你也很难跟对方解释清楚你的意图。此外不同省市地区可能有不同的规定。有些城市似乎不允许进行光猫改桥接、而有些省市可以很自由地光猫改桥接。所以当第一种方法不可用或者你不想用的时候,就可以尝试第二种方法。

其实所谓的光猫改桥接,无非就是在光猫的设置页面里将原有的设置删掉,然后新建一个桥接设置即可。然而大多数情况下这个设置是对普通用户隐藏的。想要找到这个页面,不同的路由器型号的设置是不一样的。(通常你可以搜索「路由器型号+光猫改桥接」或者「路由器型号+超级管理员」等关键字找到针对你路由器的特定方案。)

以我使用的中兴F477光猫为例,想要以超级管理员的身份登陆到光猫设置页面中,我们需要进行下面的一些操作。

登陆光猫管理页面(通常是192.168.1.1或者192.168.2.1)后,首先我们需要记住下面的一些信息,这些信息至关重要,可能会影响到你的设备改桥接之后还能不能正常使用IPTV、电话等功能,务必记清楚

另外,由于我的设备已经是光猫改桥接之后的情况了,而且我是用已经解锁了的超级管理员账户登陆的管理界面,所以你看到的界面和我下面的截图或许略有区别。

第一个是在网络测信息中记录下设备的VID:在「状态->网络测信息->IPv4 WAN连接信息」中能够看到光猫上所有连接的设置。每一个连接最后面的VID_xxxx里面xxxx的数字就是你要记住的VLAN ID。

  1. 在IPTV设置中记录下组播VLAN:在「高级配置->日常应用->IPTV->IPTV对应的连接的公共组播VLAN」,我这里是4000(因为我当时忘了备份这个数值了,4000这个数字是我试出来的,用到现在一直没问题。。如果这个数字错误,会发现机顶盒开机登陆调台都正常、节目单显示正常,但就是黑屏没画面)

不过其实每个省市地区的设置是统一的。例如北京联通的上网VLAN是3961,tr069(貌似是自动配置设备的协议)VLAN是3969,IPTV的VLAN是3964,组播VLAN可以是4000。

所以一旦你忘了这些VLAN ID,可以索索「xx市+光猫改桥接」或者「xx市+vlan」来看看别人的帖子里有没有写。如果找不到,尝试直接将路由器恢复出厂设置,并用快速设置的方式输入PPPoE的用户名密码实现自动配置,然后重新进行光猫改桥接的步骤。

然后对于F477这台路由器,想要解锁超级管理员模式,首先进入http://192.168.1.1/hidden_version_switch.gch 然后Version Type选择Default Version,Admin Password填写CUAdmin(注意区分大小写)。如下图:

然后点击submit,此时你的路由器就从运营商提供版切换成了默认版本。然后就可以通过http://192.168.1.1/cu.html进入到超级管理员界面,登陆密码是CUAdmin。

在新的管理页面中,我们要做的首先就是将原有的设置都删掉(也可能经过上面解锁过程后原有设置已经都空了),然后新建连接。

以北京联通为例,连接互联网设置是这样的:

协议选择IPv4,模式选择Bridge(这就是改桥接,不改桥接的话就应该是PPPoE,然后填写用户名密码)。连接名称不能改,只能选择「新建wan连接」。端口绑定选LAN1,业务模式选INTERNET,VLAN模式选改写,VLAN ID填之前记住的(北京联通是3961),剩下的用默认设置即可,然后点创建:

然后为IPTV添加设置,连接模式选Bridge。端口绑定LAN4,业务模式选IPTV,VLAN模式选改写,VLAN ID填之前备份的(北京联通是3964),剩下不用动,然后点创建:

除此之外还可以设置tr069的连接,但我其实没设置成功过,并且似乎这东西对使用暂时没有影响,所以我也就没管它。

然后要进行绑定设置:

进入基本配置->绑定设置,然后修改端口LAN1,改成VLAN绑定,按照下面的方式填写:

这一步的目的是实现:LAN4口为机顶盒提供服务,LAN1口能够将互联网和IPTV的数据传入到接在上面的软路由中。也就是说当后续设置完成后,机顶盒插在光猫和软路由上都能正常使用。

最后,为了能让IPTV正常使用,还需要很关键的一步:进入高级配置->日常应用->IPTV设置IPTV对应连接的公共组播VLAN为上面的备份值(我自己设置的北京联通的值为4000),一定要保证igmp proxy使能是被选中的!不然机顶盒还是会黑屏。

至此,我们对于光猫的设置就完成了。

下面补充一个小知识:

什么是VLAN?为什么要设置VLAN ID?

VLAN其实是实现单线复用的一种方式(使用一根网线,包括多个不同的局域网)。VLAN ID就是用来区分不同虚拟局域网的ID。例如我们能够在同一根网线里传输VLAN ID=3961和VLAN ID=3964两个虚拟局域网的数据,而在下层软路由中,我们可以将这些数据再拆分出来,针对不同的虚拟局域网进行不同的路由设置。从而实现「一根网线当成两根用」的方式。

其实对于光纤来说,接入到光猫上的虚拟局域网是可以有很多的,而从光猫到软路由,我们可以只用一根线传输两个虚拟局域网的数据来实现「单线复用」,当然,我们完全可以让LAN1口只传输互联网,让LAN2口只传输IPTV数据,然后用两根网线连接到软路由的两个网络接口上。这种方法也是可行的,但会额外多占用一个接口,所以并不划算。

软路由通过PPPoE上网

完成上面的光猫设置之后,我们可以将光猫的LAN1口和软路由(通常是LAN5)相连,再将电脑的网线插到软路由的另一个接口上(剩下的随便什么端口)。如果不好使(例如无法获取IP地址等错误),尝试将光猫引出的线更换一个软路由的接口(因为软路由一般默认配置一个口作为WAN,剩下的口作为LAN,所以你需要尝试找到WAN,将光猫的LAN1接到软路由的WAN,将电脑等设备接到剩下的LAN口)。

大致介绍一下我的网络拓扑结构,因为比较简单所以我就不拿工具画图了:

    IP: 192.168.1.1 (192.168.1.0/24)
          |    IP: 192.168.2.1 (192.168.2.0/24)      只作为无线桥接,不产生路由
          |            |                                |
          v            v                                v                           
光纤到户->光猫+-->LAN1=软路由LAN5-------------+---->LAN0=E6500 LAN1 -> 使用无线连接的设备
            |                              |
            --->LAN4=IPTV机顶盒(可选)       ---->LAN1-4=电脑、IPTV机顶盒等各种其他设备

上面有个技巧就是首先将原有的无线硬路由的DHCP功能关闭,然后将它的LAN口和软路由的LAN口相连,相当于直接产生了一个无线AP。而在我的网络拓扑里,电脑(台式机)直接用网线连接在软路由上。

我们在前面的方法中将光猫改成了桥接模式。改桥接的意思就是,将光猫从原有的PPPoE拨号功能解放出来,将PPPoE拨号挪到电脑或者软路由上进行。挪到电脑上进行拨号代价是其他设备就无法上网了,所以我们只介绍在软路由上设置拨号。其实方法仍然很简单。

首先进入软路由的设置界面(我这里设置软路由的IP地址为192.168.2.1)。登陆后在菜单里面找到网络->接口。一般来说接口设置里已经有5个口接在了网络LAN上,1个口接在了WAN上。我们首先对WAN口点编辑,将协议设置成PPPoE。然后在下面的配置信息中填入你运营商提供的PPPoE的用户名和密码,如下图(UI错位了2333):

然后保存并应用,过一会儿就能看到PPPoE是否成功拨号,如果成功应该能看到下面的样子(WAN处能够获取到的IPv6地址才是正常)。

软路由局域网内访问光猫

我们的光猫的IP地址是192.168.1.1,而软路由和子网的网络是192.168.2.0/24,我们发现此时在浏览器中我们无法访问光猫的设置页面。其实这主要是由于我们只让软路由引入了互联网VLAN,没有引入光猫本身自带的局域网。所以我们需要添加新接口,协议选择DHCP客户端。在物理设置中添加eth5作为接口,起名叫做MODEM,然后在防火墙设置里选择自定义,添加新防火墙Modem。

保存之后你会在接口页面看到新建的接口,并且该接口成功获得了光猫局域网网段(192.168.1.0/24)的IP地址。

然后我们设置一下防火墙,要允许访问光猫网段。点击菜单的网络->防火墙->基本设置,编辑其中model=>REJECT的条目,按照下面信息设置(主要是要允许转发、允许从源区域转发:LAN,这样就实现了从软路由LAN到光猫子网的访问):

此时应该就能在局域网内访问192.168.1.1的光猫设置页面了。

任意设备看IPTV直播

这里我们首先介绍一下现在IPTV的实现技术。

以IPTV机顶盒的角度出发,我们可以将IPTV的数据分成两个部分:

  1. 针对机顶盒的鉴权、节目单、频道列表获取等功能。
  2. 直播频道的数据流。

对于一个合法的机顶盒,它会通过VLAN的方式连接进入一个专属网络中(IPTV专网)。在这个网络里不但提供了对机顶盒设备的权限验证、频道列表获取等服务,还有通过IGMP组播协议方式生成的一大堆视频数据流。而这两部分是相对独立的。

首先,机顶盒接入的网络并不是我们上面配置的PPPoE互联网,而是一个通过光猫传输、通过虚拟局域网(即ID=3964的VLAN)传入到光猫的专网。这个专网并不能直接访问互联网,而是一个运营商设计的专门为了IPTV设备和服务器而存在的子网。机顶盒在开机之后会自动接入到这个网络中,然后通过访问这个专网内的某台服务器实现登陆、鉴权、加载频道列表。而目前我抓包得到的数据来看,获取到的频道列表并没有针对设备进行专属的加密,其实本身就是一个形如「rdp://239.2.1.129:8000」的URI。任何接入到专网的设备都能直接通过这个URI访问想要观看的频道。

于是乎,现在的问题有两个:

  1. 如何得到这个频道URI列表?
  2. 当我们有这个频道URI列表文件,该如何做到让任何设备(包括但不限于IPTV机顶盒、电脑、手机、其他非官方的机顶盒)访问这个地址来看电视?

对于第一点,从原理上来讲我们可以通过对IPTV机顶盒访问专网时的数据包进行监听从而获取到频道信息。目前在GitHub上是能搜到一些热心网友提供的抓取到的列表,如bj-unicom-iptv(一个网友收集维护的北京联通IPTV播放列表,定期更新,推荐使用)、beijing-unicom-iptv-tweaker(我自己写的获取列表的脚本,在本文后面将会介绍)

下面是一个典型的播放列表内容:

对于第二点,当我们有了上面这个播放列表,你可以用Mac OS X上的IINA或者Windows上的Pot Player或者跨平台(但是我觉得很难用的)VLC来打开这个文件。甚至利用其他手机软件、非官方的各种安卓盒子就能观看到这些电视内容。例如下面就是拿IINA打开播放列表:

然而,当你直接下载了上面的频道列表双击后发现。。。并不能播放。

这是由于,我们现在的软路由上只配置了互联网访问的路由,没有将IPTV专网引入,所以我们需要配置一下,将IPTV专网的链路加到软路由中。

首先我们进入软路由的配置界面,在网络->接口页面添加新接口。

这个接口使用DHCP协议,在高级设置中,将「使用默认网关」选项去掉(防止默认路由导致和互联网连接冲突),在物理设置中勾选桥接接口(相当于创建了一个网桥,实现当任意接口都能连接IPTV专网),勾选启用IGMP嗅探(能够提高组播数据流效率)。

最关键的是接口设置。我们前面说到过,北京联通使用的vlan是3964,那么我们如何让这个网桥单独把IPTV专网的流量引入进来呢?这里我们用到了一个叫做「VLAN ID Tag」的东西,其实很简单,例如对于eth0接口,eth0.3964就是一个在eth0接口上的ID=3964的vlan。这里我们将所有接口的3964 tag都添加到网桥里。这样就能够让任何一个物理接口的3964虚拟局域网都引入到软路由中。

想要添加VLAN Tag你需要手动在自定义框里面输入eth0.3964, eth1.3964一直到eth5.3964。当然你完全可以只使用eth5.3964这一个接口(因为目前WAN就是接在eth5上),但代价就是如果你有一天不想用eth5连接光猫了,而是想换一个接口,那IPTV的设置就要跟着改。而且,如果你想要将IPTV盒子查到软路由上,则必须将盒子所用到的软路由接口也加入到网桥中。总之最终应该是下面这个样子:

然后在防火墙设置中,创建一个叫iptv的防火墙区域。然后在菜单的网络->防火墙中iptv=>Reject一项改成如下的设置:

改造完毕之后,加上之前我们设置过的Modem的防火情,此时的设置页面应该长这样:

完成之后切换回接口页面,你应该能够在接口列表中看到我们刚刚添加的接口成功地获取了IPTV专网的IP地址,说明你的软路由把自己伪装成了一个IPTV盒子:

其实也不算是伪装,因为经过我对机顶盒开机后数据包抓包分析之后发现,对北京联通IPTV来说,专网DHCP获取IP地址等信息的时候压根就没有进行鉴权。。。

所以北京联通IPTV的专网里,任何一台设备都能把自己伪装成IPTV机顶盒。我甚至还尝试过直接用电脑新建一个vlan连接到专网里,也能获取到专网的IP地址。(但还需要单独对接入设备设置路由,所以不推荐这么用)

但网上有人说,上海电信的鉴权还是很严格的,需要在DHCP Option里指明你IPTV机顶盒的STB ID等各种信息才能成功获取专网地址。不过我也不是上海电信用户,我也没研究过。。。

当然,如果遇到需要DHCP鉴权的情况,可以抓包机顶盒的数据,然后将DHCP Option复制到OpenWRT的设置里用就行了,多了一步但是没啥难度。

然而光完成这些步骤还不能实现内网看电视。因为前面我们曾经取消选择获取默认路由。这么做是由于我们WAN口通过PPPoE是我们默认访问互联网的,所以会产生一个0.0.0.0/0到wan的默认路由表,如果此时对于IPTV专网也启用默认路由,那么就会出现两个0.0.0.0/0的默认路由,此时将会导致连接互联网时路由偶尔出现冲突。通常如果是电脑上使用双网卡,由于很难将默认路由删掉,所以通常使用「修改跃点数」来实现「规避不想使用的网络出口」。但对于软路由来说,可以直接关掉默认路由。由于IPTV专网使用的网段我们都可以获取到,所以只需要关闭IPTV专网的默认路由,再通过手动路由表的方式引导对IPTV专网的访问通过IPTV接口。

由于组播IP地址通常是224.0.0.0/4,而对于北京联通的组播来说,组播只涉及到本地组播地址:239.0.0.0/8。所以我们通过菜单->静态路由->添加,然后设置成下面的样子:

其中,IPv4网关需要设置成IPTV专网内地址的首地址。例如在接口状态页面能够看到软路由获取到的IPTV专网地址是10.187.142.x/20,然后经过计算得出该网段的网络号是10.187.128.0,首地址是10.187.128.1(这里猜测这个地址就是网关地址,并且亲测可用)。当然,你也可以通过允许默认路由,然后在路由表里看到自动路由使用的网关地址,记住这个地址之后再把默认路由关掉。注意,这个地址是有可能变化的,如果发生了变化可能就需要重新设置。

注:经过测试,239.0.0.0/8这条路由其实并不需要设置网关,但后面专网鉴权之类的地方这个地址是必须设置的

最后,你需要在系统->软件包中首先点击更新列表,然后安装一个叫igmpproxy的软件包。(由于更新软件包列表过程比较慢,推荐通过ssh连接到软路由,然后用opkg update/opkg install igmpproxy来安装。如果还慢,可以尝试更新成国内的源。如果仍然很慢,可以考虑先开启科学上网,然后设置终端里的临时http proxy到本地的科学上网代理端口。)

igmpproxy是用来自动将外部组播信号转发到局域网内部的程序。这个程序装好之后可以完全不用管,正常情况下会自己启动。但有极少数时候这个程序不太稳定,你可能需要手动ssh到软路由上之后执行service igmpproxy restart来重启这个服务(也可以通过软路由的管理页面来重启igmpproxy)。每次在你重启过接口列表中的iptv接口之后,都需要手动restart igmpproxy,否则收不到组播信号。

经过这些设置之后,你应该能发现上面的播放列表文件能够正常播放了!

让IPTV可接在软路由上

目前为止,当我们有上面这份网友提供的播放列表之后,我们就能在局域网内的任意设备播放组播的视频流。然而当我们把机顶盒插到软路由上,会发现机顶盒开机后无法登陆。原因其实很简单,我们上面的一顿操作仅仅是将专网的IGMP的组播视频流传入到局域网中,但关于鉴权、频道更新等服务器的路由并没有设置。所以想要让机顶盒可以插在软路由上(其实这也是很多人的需求,因为他们的电视机的位置离光猫弱电箱有一段距离,所以需要软路由延长光猫之后在比较远的距离,甚至是其他房间内使用IPTV机顶盒)。

那么现在的问题就是,机顶盒的鉴权操作需要访问哪些地址?其中一个方法是直接进入电视的设置界面去查看,例如我的B860AV2.1B机顶盒,可以通过设置->高级设置(默认密码是10010)之后查看到认证地址、终端网管地址等设置。然而我发现这些设置并不足以让机顶盒正常运行,所以还是要通过抓包的方法,抓去机顶盒从开机到进入播放界面后所有的数据包,将其中所有的网段都通过静态路由的方式转发到IPTV专网。

我使用的是Mac OS X + Wireshark进行抓包。由于机顶盒是连接在软路由上的,而软路由默认配置网卡之间数据包无透传,所以无法直接通过电脑的网卡对内网进行监听。最简单的方法是通过wireshark利用ssh协议登陆到路由器上,对路由器内部数据进行抓包。下图是一个抓包后得到的数据包样本。

我的机顶盒的内网ip地址是192.168.2.239,通过设置filter:ip.src==192.168.2.239能够过滤得到所有从机顶盒向外发出的请求。然后我们反复通过前面提到的方法,将这个ip地址对应网段(通常是/24或者/16)添加到静态路由表中。

注:你自己抓包得到的数据应该没有我得到的这么多。因为机顶盒的开机鉴权是个串行的过程,由于没有添加路由,每次机顶盒都会卡在其中一个步骤无法继续鉴权,所以需要先第一次抓包,抓到第一个地址添加到路由表,然后抓第二次包,得到第二个地址添加到路由表,以此类推。例如在上图的抓包信息中,机顶盒在发出第一次连接到210.13.13.14时就会卡住,此时你需要将210.13.0.0/16加入到静态路由表中,然后重新抓包才能获取到后面的信息。

经过我的测试和优化,我找到的路由表主要是下面几条。如果你是北京联通用户(我在海淀区),有可能设置成下面的信息就可以直接使用,但如果这些信息不可用,那你可能就要用上面介绍的方式反复抓包获取每一个专网内的地址:

上面61.135.0.0/16的那一条路由不要加!这个是我抓包的时候搞错了,加了这条路由会导致baidu主页上不去。。。 然后重启iptv的端口、重启igmpproxy服务,然后机顶盒应该就能正常开机并使用了。

如果发现机顶盒能开机进入主界面、能够换台、能够正常获取频道信息、节目单,但节目始终是黑屏,那说明igmpproxy没有正常启动。如果开机都无法完成机顶盒的登陆,说明上面的路由表配置仍然存在问题。

获取IPTV频道列表的脚本

(下面内容仅限北京联通IPTV使用,其他省市可能要对脚本做一些修改)

其实到上面一节为止,只要使用网友提供的播放列表就能够直接在局域网内使用机顶盒、直接用任意设备播放视频了。那么,这个列表是怎样获取的呢?其实我们只要仔细分析之前获得的抓包文件就能明白其中内容了。

重新看一下之前的抓包文件,然后设置一下filter:((ip.src==192.168.2.239) || (ip.dst==192.168.2.239)) && http这样我们就只关注机顶盒收发的http数据包:

从数据包中我们能直接找到最关键的那一条HTTP Request:向http://210.13.0.147/bj_stb/V1/STV/channelAcquire发送了一个POST。这个Request的内容是:

也就是说,这个Request里面的workload是一个json,里面是

{
  "UserToken": "jFxxxxxxxxxxxxxxx"
}

然后它的Response是这样:

这个就是我们想要的频道列表啊!只需要提取出来解析一下,生成m3u格式的播放列表文件,就能用播放器直接播放了。

也就是说,我们可以通过伪造上面这个Request包,即可获取完整的频道列表,以后也不再需要通过抓包的方式导出这个列表了。

这个UserToken经过对前面的抓包分析之后发现,是机顶盒向认证服务器发送了自己ID之后,远程会传回一个encryToken,机顶盒用内置的加密算法加密后会生成一个Authenticator,然后进行二次鉴权得到UserToken。也就是说,这个Authenticator的加密是在机顶盒内部进行的,除非反汇编机顶盒内部的加密算法,否则哪怕我们直到机顶盒内置的用户名和密码,我们也无法从头伪造一个鉴权操作链。

然而在获取这个UserToken的过程中我发现,系统默认给这个Token分配的tokenExpiredTime是2047年。。。也就是说,只要我们抓到了这个UserToken,就可以一直用下去。。。哪怕机顶盒重启、重新获取了新的UserToken,上面用到的这个UserToken也不会过期。。。

所以我写了一个脚本,只需要输入鉴权服务器地址(例如上面的http://210.13.0.147,不同位置可能会有所区别)和你通过抓包得到的UserToken(上面的jFxxxxxxxx),就能直接将播放列表保存成m3u文件。

项目地址是beijing-unicom-iptv-tweaker

除此之外,我发现,其他网友抓取得到的地址是239.3.0.0/16网段的组播地址,这个地址我直接用播放器打开就能很流畅地看。然而通过抓包得到的频道列表是239.2.0.0/16网段的,这个网段的所有频道我发现直接用播放器打开会有很明显的卡顿(应该是udp丢包或udp包乱序情况严重)。但我通过利用udpxy将udp转换成http之后播放就没有卡顿的情况了。应该是udpxy的缓存功能使得偶尔的丢包并不影响画质。

udpxy的使用方法也非常简单,用上面提到的软件包管理安装udpxy,然后将下面这行加入到/etc/rc.local即可。

udpxy -S -a 192.168.2.1 -p 4022 -m br-IPTV -c 10 -B 1MB -M 30

其中192.168.2.1是监听地址,4022是监听端口,br-IPTV是IPTV专网在软路由上的接口名(在路由器管理页面->网络->接口里能够看到)。可以手动执行上面这句话,然后所有的rdp://xxx都可以换成http://192.168.2.1:4022/udp/xxx来打开。例如rtp://239.2.1.60:8084换成http://192.168.2.1:4022/udp/239.2.1.60:8084就能打开。

我的脚本提供了生成udpxy转换列表的功能,详情请见使用方法。

最后

放个彩蛋:)