先把从天津联通IPTV上抓取的IGMP节目列表转换为HTTP的后放在这里,原本的频道列表放在这里以备使用。

事情起源于翻腾天津联通给的光猫,了解了下它的工作原理:我们可以认为光猫上有2种类型的逻辑网口:

一类逻辑网口通过光纤连到局端,在光纤上二层协议为以太网,通过VLAN Tag划分流进光猫不同的逻辑网卡里。光猫不同的逻辑上VLAN Tag被去除,可以为之配置不同的3层协议类型(IP或者PPP),可以配置ip地址的获取方式,和路由表,还可以配置数据包从此端口发出是否需要NAT。

另一类逻辑网卡连接到了光猫的物理接口上。比如LAN口,WLAN等。在这些逻辑网卡上,光猫可以进行DHCP分发(所以把网线插到光猫上可以拿到一个内网IP),配置IP地址等。

光猫在这两类网卡间转发数据包有两种方式:第一种是走普通的Linux的包转发的流程。(在路由表上routing到对应的出口网卡上,在iptables上匹配对应的规则)。比如,配置好IPTV的上行网卡和互联网的上行网卡(PPPoE)拨号,再配好路由表,客户端就可以直接上网,IPTV可以直接播放了。另一种简单粗暴的方法是把两块网卡桥接在一次(例如把上行的上网的网卡和下行的LAN桥接,那么就可以从LAN上PPPoE拨号上网了)。

聪明的你可能想到,天津联通为了实现IPTV,就在光猫里为IPTV配置了一个单独的逻辑网卡,并配置了一些路由表,这样,当IPTV机顶盒向光猫发送IPTV的请求时,数据就会被发到正确的VLAN里了,而不是连接互联网的VLAN或者电话的VLAN里。因此,如果想要让连上家用WLAN的设备也能访问IPTV,在我们的家用路由器上除了PPPoE拨号所产生的虚拟接口外,还要有一个从和光猫直接连通的IP网接口。并在路由器上配置到IPTV的数据要走和光猫连接的IP网接口,而不是PPPoE接口。

Tricky的事情是,IPTV的直播数据实际上是通过IGMP和多播技术实现的。多播需要让IGMP的加入请求能够发送到光猫的上行逻辑接口,而我们的路由器和光猫的NAT三层转发挡住了这一功能。为了在路由器上实现这一功能,我们需要使用igmproxy添加多播数据包从WAN区域转发到LAN区域的规则。我们同时还可以使用udpxy来在路由器上把多播UDP数据包转换为HTTP数据包以方便网内使用。

坑:不知道为什么,OpenWRT的固件不太能正确处理IGMP的query,导致IGMP report上端收不到。解决方法是在光猫上把IGMP的代理模式由snooping改成proxy,不然就会发生5分钟断流一次的问题。此外,udpxy这个程序的openwrt的配置文件有bug,verbose是-v不是-V