利用OpenWrt系统拓宽IPTV使用范围

前面我们讲了如何利用OpenWrt系统来抓取IPTV数据包,又在应用技巧及工具栏目讲解了如何分析IPTV数据包并提取有用的信息,这次我们要来讲解如何利用OpenWrt系统拓宽IPTV使用范围,从使用传统的IPTV机顶盒拓展到PC、网络机顶盒、平板电脑、手机等终端,同时还要拓宽其使用环境:既支持有线连接也支持无线连接;既支持在局域网内部使用也支持远程访问使用;既支持组播信号播放也支持单播信号播放。

通常IPTV网络电视须通过IPTV机顶盒才能播放:

利用OpenWrt系统拓宽IPTV使用范围-1

但只要有OpenWrt路由器,通过一些并不算太复杂的设置,我们就可以将IPTV服务拓宽到更多的使用环境下:

利用OpenWrt系统拓宽IPTV使用范围-2

这次我们先讲解最常见的方法,即在路由器上设置虚拟WAN口,来代替IPTV机顶盒取得IPTV信号。该方法既适用组播信号,也适用单播信号,但是采用单播信号传输时设置要稍微复杂一点。

下面以TL-WDR4310路由器为例,说明一下具体的设置过程,与光猫的连接方式如上图,WAN口与光猫千兆口连接以获取Internet信号,LAN1口设置成VWAN,既虚拟WAN口与光猫的ITV口(注:一般光猫中的两个百兆口都设置成与ITV口桥接模式,因此这三个口可以任选一个连接)。

1、设置交换机Switch

利用OpenWrt系统拓宽IPTV使用范围-3

接口eth0.1对应桥接的LAN2、LAN3、LAN4口;eth0.2对应WAN口;eth0.3对应LAN1口即新增的VWAN口。

2、新增IPTV接口

因为涉及DHCP鉴权,因此通过Luci界面无法完成所有的配置工作,因此我们选择在network配置文档上直接修改:

vim /etc/config/network

# 在打开的编辑界面,新增如下语句

config interface 'iptv'
    option ifname 'eth0.3'
    option proto 'dhcp'
    option metric '20'
    option delegate '0'
    option macaddr 'xx:xx:xx:xx:xx:xx'
    option hostname 'XXXXXXXXXXXXXXXXXXXXXXXXX'
    option sendopts '0x3c:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

macaddr处填上抓包所用的IPTV机顶盒的MAC值;hostname处填上分析DHCP鉴权相关信息时获取的Option 12,是一组明码字符串;sendopts处因为我所在的地方只需要验证Option 60的值,所以只要将分析时获取的Option 60,即一长串16进制密码字符填入即可。如果你所在的地方,需要认证Option 61的值,则需要在上面的语句中再增加一句(注:十进制60对应16进制的0x3c;十进制61对应16进制的0x3d):

option sendopts ‘0x3d:YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY’

同理有其它需要DHCP鉴权的值,可以按上面的方法一并加入。

如果原WAN口未设置网关跃点metric值,需要在上面的network文档的wan接口上添加如下语句(注:数值可以自行设定,只要与iptv接口的metric不同即可):

option metric ’10’

设置完成后,重启一下network服务:

service network restart

3、安装igmpproxy,让组播信号可以在LAN与IPTV之间传输
opkg update
opkg install igmpproxy

安装完成后,还需要进行设置,但目前igmpproxy程序尚未开发Luci设置界面,因此我们还是直接修改配置文件:

vim /etc/config/igmpproxy

# 修改文件如下

config igmpproxy
    option quickleave 1
#	option verbose [0-3](none, minimal[default], more, maximum)

config phyint
    option network iptv
    option zone iptv
    option direction upstream
    list altnet 0.0.0.0/0

config phyint
    option network lan
    option zone lan
    option direction downstream

再添加igmp在iptv通道防火墙畅行:

vim /etc/config/firewall

# 在打开的文档最后添加:

config rule
        option target 'ACCEPT'
        option src 'iptv'
        option name 'Allow_IGMP'
        option proto 'IGMP'

系统重启后,我们可以验证一下igmpproxy是否已正常运行:

# 先重启一下igmpproxy服务

service igmpproxy restart
vim /var/etc/igmpproxy.conf

# 若igmpproxy运行正常,则文档内容如下:

quickleave

phyint eth0.3 upstream ratelimit 0 threshold 1
    altnet 0.0.0.0/0

phyint br-lan downstream ratelimit 0 threshold 1
4、设置防火墙

>> 防火墙设置可以在Luci界面下进行:

利用OpenWrt系统拓宽IPTV使用范围-4

>> 也可以直接修改防火墙文件

vim /etc/config/firewall

# 在打开的编辑文档里,添加如下语句:

config zone
    option network 'iptv'
    option forward 'REJECT'
    option name 'iptv'
    option output 'ACCEPT'
    option masq '1'
    option input 'REJECT'

config forwarding
    option dest 'iptv'
    option src 'lan'

设置完成后,重启一下firewall服务:

service firewall restart

通过以上这几步的设置,IPTV接口就可以获取鉴权服务器返回的IP地址了:

利用OpenWrt系统拓宽IPTV使用范围-5

这时,有线连接的PC、网络机顶盒等已可正常播放IPTV的组播信号了(以当地的CCTV2HD为例:rtp://233.50.201.119:5140)。

利用OpenWrt系统拓宽IPTV使用范围-6

5、支持单播信号播放

要想让单播信号可以正常播放,还必须使一些特殊的IP地址也通过IPTV接口进行DHCP鉴权,具体涉及哪些地址,在对IPTV包分析的文章中有详细说明,这里不再展开。这里主要讲如何在OpenWrt系统里使用和设置这些IP地址,实现方法有很多种,但我这里只讲最简单的方法:就是在系统自启配置文档中添加上相关的路由表及信号路径。

>> 可以在Luci界面里直接添加:

利用OpenWrt系统拓宽IPTV使用范围-7

>> 也可以在自启配置文档中直接添加:

vim /etc/rc.local

# 在exit 0之前,添加如下语句

ip rule flush table 100
ip route flush table 100
ip rule add from 192.168.1.0/24 to 122.229.17.0/24 table 100 
ip rule add from 192.168.1.0/24 to 115.233.41.0/24 table 100
ip rule add from 192.168.1.0/24 to 220.191.136.0/24 table 100
ip rule add from 192.168.1.0/24 to 115.233.200.0/24 table 100
ip route add default via 10.242.96.1 dev eth0.3 table 100

保存后,重启一下系统。然后用播放器打开单播地址测试一下(以CCTV3HD为例:rtsp://115.233.41.137/PLTV/88888913/224/3221229136/10000100000000060000000005809121_0.smil):

利用OpenWrt系统拓宽IPTV使用范围-8

对于单播地址,有线连接测试OK,那么无线连接肯定也OK,你可以用网络机顶盒、手机、平板电脑测试一下。

但对于组播地址,有线测试OK,但是用无线却无法播放,还需要更进一步配置,通过代理服务将组播地址转换成单播地址。

6、组播地址转单播地址,以便无线连接设备播放
opkg update

opkg install udpxy luci-app-udpxy

在udpxy的Luci界面设置如下:

利用OpenWrt系统拓宽IPTV使用范围-9

在Bind IP/Interface栏输入:192.168.1.1(LAN地址);Port:4022(缺省值);Source IP/Interface:eth0.3,即IPTV的接口。

在浏览器上输入:http://192.168.1.1:4022/status,可以看到udpxy服务的具体运行情况:

利用OpenWrt系统拓宽IPTV使用范围-10

在防火墙上,增加允许udpxy信号通行的语句:

vim /etc/config/firewall

# 增加如下语句,保证udpxy信号顺利传输

config rule
        option target 'ACCEPT'
        option src 'iptv'
        option proto 'udp'
        option name 'Allow-UDP-udpxy'
        option dest_ip '224.0.0.0/4'

设置完成后,可以将原先的组播地址,例如CCTV1HD:rtp://233.50.201.118:5140,修改为:http://192.168.1.1:4022/udp/233.50.201.118:5140,就可以在无线连接的设备上进行播放了。

另外,对于一些有线连接时组播地址无法播放的情况(注:多半是播放器不支持组播信号播放),也可以用udpxy代理服务方式进行播放。

而且通过设置DDNS及端口转发,你稍微修改一下地址就可以实现在远程设备上进行播放的目的。例如,在远程播放CCTV1HD时,可以将地址修改为:http://123.red-yellow.net:4022/udp/233.50.201.118:5140,这样你公司的电脑也可以播放家里的IPTV直播节目了。

7、IPTV DLNA服务的实现

大多数的视频播放器支持m3u或txt格式的视频列表文件,但也有一些播放器不支持,特别是苹果IOS系统的设备,但每次输入直播地址进行变台操作又太复杂了,这时我们需要用到DLNA服务。

opkg update

opkg install xupnpd

在浏览器上输入:http://192.168.1.1:4044,就可以配置xupnpd:

利用OpenWrt系统拓宽IPTV使用范围-11

在PlayLists上传入m3u格式的列表文件,支持DLNA服务的播放器就可以播放列表里的所有视频了。

8、原IPTV机顶盒支持

将原IPTV机顶盒与路由器的LAN口连接,按以上的设置步骤,不需要新增别的设置内容,就可以在显示器或电视上享受直播、回看及点播节目了。

当然,利用OpenWrt系统拓宽IPTV使用范围的方法有很多种,以上我们只是讲解了最常见的一种解决方案,应该说也是一种高效、彻底地的解决方法。后续我们还会讲解利用其它拓扑结构来拓宽IPTV使用范围的方法,以及单线复用模式下的IPTV拓展