使用OpenWRT+udpxy让家中所有设备都可以观看IPTV

家里有个联通闲置的IPTV,一直想着拿来利用一下,总倒不出时间,趁着周末搞一下,思路很清晰,就是用openwrt安装udpxy程序实现组播到单http流的转发。没想到最费时间的是抓包整理频道清单。

1.硬件准备

先刷机,从家里扒拉出了一个吃灰的Netgear WNDR4300,上次刷机已经是好几年前了,现在准备给刷一个OpenWRT 22.03.7,先去网站下载对应的刷机包,WNDR4300在19.07之前对应的架构名是xr71xx,21.02之后就改名成ath79了,到下面路径去下载

https://archive.openwrt.org/releases/22.03.7/targets/ath79/nand/openwrt-22.03.7-ath79-nand-netgear_wndr4300-squashfs-factory.img

接着找一个卡针,到路由器背面reset孔上按住后再通电开机,等待橙色灯闪烁结束就可以了,如果不行,就再关机再来一遍,我是试了2次才好用。

接着拿笔记本直连lan口,ip配置192.168.1.2,命令行ping 192.168.1.1,如果通了,说明成功了。

接着到控制面板-添加删除程序里启用WIndows组件:TFTP 客户端。

打开cmd,cd到openwrt-22.03.7-ath79-nand-netgear_wndr4300-squashfs-factory.img目录

执行下面指令,继续等待几分钟

1
tftp -i 192.168.1.1 put openwrt-22.03.7-ath79-nand-netgear_wndr4300-squashfs-factory.img

等到192.168.1.1能继续ping通了继续下一步。

2.安装udpxy和必要服务

WAN口先随便接到可以上网的局域网中,因为要下载软件包(等将来接到IPTV口上,Openwrt就不能上网了)

先ssh登录到Openwrt路由器中,执行以下命令

1
2
opkg update
opkg install udpxy igmpproxy

配置igmpproxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vi /etc/config/igmpproxy

config igmpproxy
option quickleave 1

config phyint
option interface wan
option direction upstream
list altnet 0.0.0.0/0

config phyint
option interface lan
option direction downstream
list altnet 0.0.0.0/0

启用并启动igmpproxy服务

1
2
/etc/init.d/igmpproxy enable
/etc/init.d/igmpproxy start

配置udpxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
vi /etc/init.d/udpxy

#!/bin/sh /etc/rc.common

START=90
STOP=10
USE_PROCD=1

start_service() {
procd_open_instance
procd_set_param command /usr/bin/udpxy \
-p 8080 \
-m eth0.2 \
-c 5 \
-B 16384 \
-S
procd_set_param netdev eth0.2
procd_set_param respawn
procd_close_instance
}

启用并启动udpxy服务

1
2
3
chmod +x /etc/init.d/udpxy
/etc/init.d/udpxy enable
/etc/init.d/udpxy start

3.网络结构

本文通过旁路方式接入IPTV视频流服务,所以此OpenWRT路由器要关闭dhcp,更改LAN IP为192.168.1.2。

讲光猫IPTV的接口(通常是LAN2)接到OpenWRT的WAN口。

自此OpenWRT已经成功的接入家庭局域网了。

4.更改防火墙设置

在防火墙中添加一条策略,允许IGMP和UDP数据到路由器本机

网络-防火墙-通信规则-添加

名称:IPTV

协议:UDP,IGMP

源区域:wan

目标区域:Device(input)或者叫This device

5.抓包获取IPTV组播地址

由于网上只有一个3年前的大连联通的IPTV的播放清单,并且已经不好用了,只好自己抓包分析,自己测试了。

经过抓包分析发现,现在按下面的方式播放视频流已经不好用了

1
http://192.168.1.2:8080/udp/232.0.0.1:8008

经查发现大连联通的IPTV升级了验证功能,增加了SSM(Source-Specific Multicast)验证,也就是组播请求时必须带源IP,也就是定义哪源个IP来发这个组播。

继续抓包分析可以找到这样的字样:

1
2
3
4
IGMPv3 Membership Report
Include Mode
Source Address: 218.24.1.1
Group Address : 232.0.0.1

这个218.24.1.1就是源IP,修改播放地址为下面方式就好用了。

1
http://192.168.1.2:8080/udp/218.24.1.1@232.0.0.1:8008

最后就是漫长的抓包和数据整理,改名频道的过程了,做成m3u8文件就像下面这样就可以了。

1
2
#EXTINF:-1 group-title="CCTV",CCTV1
http://192.168.1.2:8080/udp/218.24.1.1@232.0.0.1:8008

这个#EXTINF这一行就是定义下一行url的频道分组和频道名的。