IPTV 与互联网融合

前言

依赖

  • 需要一个能够刷 OpenWrt 的路由器(需具有数据包镜像和 udpxy 功能/插件)用于抓包和后续的使用,因为其功耗较低且价格比较便宜 Newifi D2 拼多多 100 以下就可以拿下
  • 能够正常播放节目的 IPTV 机顶盒,如果自己家里都没有能用的那就没有融合一说了

环境

因为不同地区网络环境不同,我这里是四川电信,但是可能在同一个省环境都会不一样,所以并不一定在其他地区可用。

设备 型号 软件
光猫 TEWA-500E -
主路由 Newifi-D2 Lean OpenWrt R9.6.1
AP 腾达 AC6 -

网络结构拓扑图

无需电信 IPTV 机顶盒,也可在任何设备上通过 http 链接直接播放直播节目。下图分别为 PotPlayer(PC) 和 超级直播(Android) 播放节目效果图。

PC PotPlayer

Android 超级直播

iGMP 与 RTSP

在 IPTV 中常见的两种用于播放直播节目的协议分别为 IGMP 和 RTSP,他们之间的差异如下。

协议 节目类型 可用时间 鉴权
IGMP 直播 长期 强制
RTSP 直播/回放/点播 短期 非强制

IGMP

网路群组管理协议(英语:Internet Group Management Protocol,缩写:IGMP)是用于管理网路协议多播组成员的一种通信协议,有时候我也会将其称为组播

在电信这边,组播地址通常很少变化,但是很重要的是它只能看直播不能看回放。又因为它的地址是内网地址,所以你必须要获取到电信的内网IP才能正常播放。我比较倾向于使用组播地址,因为电视节目回放有啥可看的,一般都是爱奇艺什么的了,而且最重要的是它的地址很少变化,这样就给不会倒腾的家人减少了很多麻烦。

原理上组播和广播(给网络里的所有人都发送一个消息)有点相似,但是组播会划分一个更小的范围,并且这个范围里面设备的名单会同时由客户端和主机端进行维护,路由器会根据不同的组别来转发不同的数据。

下面假装这个网络里面,有 3组 人正在分别在看 3个 节目。

IGMP1

正在收看 CCTV-251 的朋友说,这太假了。我想看点正能量的、让人血脉喷张的。然后请求换到 正在播放 CCTV-1 的 igmp://239.93.22.133:9260

IGMP2

路由器随后听到了这位朋友的呼唤,然后就将它放进了 CCTV-1 的组里。

IGMP3

通过上面的例子你大致能了解到 IGMP 协议的工作原理,可以简单的总结为 IGMP 就是 一对多,下面的一个例子则是和 IGMP 相反。

RTSP

实时流协议(Real Time Streaming Protocol,RTSP)是一种网络应用协议,专为娱乐和通信系统的使用,以控制流媒体服务器。该协议用于创建和控制终端之间的媒体会话。媒体服务器的客户端发布VCR命令,例如播放,录制和暂停,以便于实时控制从服务器到客户端(视频点播)或从客户端到服务器(语音录音)的媒体流,有时候我也会将其称为时移

原理上 RTSP 和常见的 HTTP 协议比较相似,也就是 一对一,下面这个图可以帮助你理解。

你在观看节目的时候,可以随意的后退暂停,也可以自己想看什么就看什么,不用加入别人的组,整个资源都被你一个人享用。就和你平时看爱奇艺,B站什么的没区别。

RTSP

正如上面的介绍一样,RTSP 的主要特点就是可以时移,也就是可以拖动进度条。而且大部分地区的 RTSP 地址都是公网 IP,甚至还可以在获取到地址后,不需要任何授权都可以直接正常播放。

所以网络上流传的 IPTV 直播源基本都是 RTSP 地址。不过四川电信这边 RTSP 有鉴权,必须要以电信的内网 IP 访问才行。

同时又因为有部分套餐的 IPTV 是没有回放权限的,所以电信应该还需要验证是谁在播放,这就让观看它成为了比较麻烦的事情(不同地区情况不同,这里只针对我所在的地区)。

目标

通过了我上面对 IGMP 和 RTSP 协议的介绍,相信你对他俩都有了一定的了解。接下来我将为你详细介绍本次教程的内容。

  • 适合本项目的硬件设备
  • 软件安装及环境配置
  • 抓包获取 IPTV 的 IGMP 和 RTSP 播放地址
  • 使用 igmpproxy 将所有 IGMP 数据转发到 IPTV 口
  • 使用 udpxy 将 IGMP 地址转换为 HTTP
  • 在电视盒子、手机和 PC 上正常播放
  • 在外欣赏自家 IPTV 直播源

你可以通过点击右侧边栏,来快速跳跃到你需要的章节或查阅你当前的浏览进度。

硬件

本章节会介绍你所需要的硬件设备,在抓包和使用融合网络时不可避免的会使用到,生活中平时少见的设备。

路由器

IPTV与互联网融合,的主要设备也就是路由器了。一款合适的路由器,可以和电脑一起直接走通整个教程。对于本教程而言,一个能够刷 OpenWrt 或 Lede 同时还能安装 igmpproxy 和 udpxy 最好还支持 交换机端口镜像 就完美了。当然也有一些教程是通过 Padavan 来实现的,但是我个人没有尝试过,这里就不做评价了。

igmpproxy和udpxy 截图

交换机端口镜像 截图

如果你目前没有具有此功能的路由器,我推荐你购买 新三 它还有其他的名字 新路由3、Newifi D2、Newifi 3、Newifi 3 D2。也都是同一款,得益于所谓的矿难,这款路由器目前淘宝、拼多多和转转之类的,100元以内都可以拿下,同时购买的时候推荐你加钱让卖家刷好 Breed 和我使用一样的硬件设备,这也能让你配置的时候少走一些弯路。

新三 照片

Breed 相当于 Android 里面的 Recovery,Windows 里面的 PE。可以让你在刷机的时候不会轻易翻车。

抓包工具

通过抓包获取 IPTV 的组播地址也是必不可少的一步。如果你的路由器没有 交换机端口镜像 的功能,你就需要淘宝单独购买一个 网络抓包工具,下图为 Amazon 搜索 Throwing Star LAN Tap 的外观图。

Throwing Star LAN Tap

动手能力比较强的朋友,也可以参考恩山无线论坛的这个帖子小白的IPTV折腾教程(1)—0元DIY抓包神器,利用两根网线和4个水晶头就可以做出一个具有同样功能的抓包工具。

不过我还是比较推荐刷一个具有 交换机端口镜像 功能的固件,毕竟直接就可以上手用。如果你是比较热门的机型,比如斐讯又或是我之前说到的 Newifi D2 或是其他搭载了 MT7621 芯片的路由器,应该都不难在恩山找到具有该功能的固件。

软件

下面列出了本次教程中所有需要的软件,我使用软件的版本,以及和下载链接。

设备 软件名 版本 下载地址
PC Wireshark Portable 3.2.0 Wireshark 官网
PC Notepad++ 7.8.2 Notepad++ 官网
PC Excel Mondo 2016 x86 Office Tool Plus
PC Xshell 6.0.0032 Netsarang 家庭/学校版
路由器 OpenWRT R9.6.1 橙子的个人博客/蓝奏云
路由器 igmpproxy 0.2.1-4 固件自带
路由器 udpxy 2016-09-18-53e4672a75..4-1 固件自带
路由器 luci-app-udpxy git-19.146.62144-fd6fdb2-1 固件自带

下面介绍了每个软件的用途。

软件名 用途
Wireshark 抓包获取 IPTV 播放地址
Notepad++ 抓包后数据整理
Excel 抓包后数据整理
Xshell SSH连接路由器
OpenWRT 路由器固件
igmpproxy 转发IGMP流量到指定端口
udpxy IGMP流量转HTTP

抓包

首先将来自光猫的互联网和往常一样连接到路由器的 WAN 口,将 ITV 口连接到路由器的 LAN 4 口,将 IPTV 盒子连接到路由器的 LAN 3 口,最后将 LAN 1 口连接至电脑。

抓包连线

随后配置路由器的流量镜像功能,将接有 IPTV 盒子的 LAN 3 口设置为 数据包镜像源端口,将接有电脑的 LAN 1 口设置为 数据包镜像监听端口。其他 VLAN 设置无需改动。

数据镜像设置

保存并应用设置后,即可在电脑上启动 Wireshark 并监听以太网接口,随后启动 IPTV 盒子。

启动 IPTV 盒子后,应不停的有数据显示在窗口中。然后使用 IPTV 盒子遥控器,进入直播随便播放一个节目,等节目可以正常播放的时候,即可在 Wireshark 中停止捕获。同时也可关闭 IPTV 盒子,接下来就是分析数据了。

如果你没有看到任何数据跳动,或者是特别少,应注意是否端口插错,或者是在设置流量镜像的地方有错。

分析抓包数据

因为不同地区的数据样式差异较大,我这里是四川电信,其他地区可供参考

获取地址

在过滤器栏输入

1
http.request.uri contains "frameset_builder.jsp"

右键第一个请求,追踪流 - HTTP 流

Wireshark 1

再弹出的新窗口中查找

1
igmp://

如果你找到了类似下图 igmp://239.93.22.133:9260 的连接,那么恭喜你,你的数据抓包已经完成了最重要的定位了!(不难发现旁边也获取到了 rtsp:// 开头的时移地址)

Wireshark 2

单击连接,主窗口就会自动定位到该请求。

Wireshark 3

单击展开该请求的完整内容,查看里面的内容是不是含有 igmp:// 之类的重要数据。

Wireshark 4

右键 Line-based text data 导出分组字节流,随便取个名字保存到你能找到的地方。

Wireshark 5

用 notepad++ 打开,查看是否显示正常(前几行都是回车,会一片空白往后滑一点)。

Wireshark 6

无法获取到地址

如果你在窗口中一个数据都未获取到,那么请检查数据镜像设置或网线位置是否有错。

如果你是四川省,请仔细检查是不是,在过滤的时候复制错了或漏了内容。

如果你非四川省,可以在过滤器中输入

1
http

进行检索,一条一条的看,里面总会有 igmp:// 之类获取节目单的数据(我也是这样找出来的)。

格式化数据

开始格式化之前,建议保存好原始文件。

替换完毕后可以将名字带有 PIP 的删除,这是用于机顶盒画中画功能的,说白了就是降低了分辨率的,我们就留下正常的和高清的就行了。

M3U8

此格式文件可以在 PC 中直接使用 VLC media player 和 PotPlayer 打开并播放

查找目标

1
.*ChannelName="(.*)",UserChannelID="(.*)",ChannelURL="igmp://(.*)",TimeShift=.*

替换为

1
#EXTINF:-1, \1\r\nhttp://192.168.10.1:8888/udp/\3

M3U8 替换中

将文档中被格式化了的数据,复制到新文档,并在文档首行写入

1
#EXTM3U

处理完毕后效果如图,最后将文件另存为 .m3u8 即可。

M3U8 替换完毕

超级直播

此文件可以在 Android 端的超级直播使用,电脑打开 在软件里面按返回时提示的网址,可以将自定义源上传至该软件。

查找目标

1
.*ChannelName="(.*)",UserChannelID="(.*)",ChannelURL="igmp://(.*)",TimeShift=.*

替换为

1
\1,http://192.168.10.1:8888/udp/\3

再次查找目标,删除空白行

1
\n\s*\r

替换为空白

全选改文本所有内容后复制,在顶部 编码 - 编码字符集 - 中文 - GB2312,确认切换到该字符集。然后删除文本所有内容,并粘贴。最后将文件保存为 txt 即可。

超级直播中文本编码格式必须为 GB2312 否则中文会乱码

修改编码字符集

处理完毕后效果如图

超级直播效果图

获取 IPTV 内网地址

四川电信是 DHCP 获取,我在网上看很多地方都是 PPPOE 所以用户名和密码你们就需要自己翻翻 IPTV 的设置拉~

这边也会使用到抓包的数据,应该就是前几个了,找到 Dynamic Host Configuration Protocol (Request) 请求,展开 Option: (60) Vendor class identifier 和Option: (12) Host Name 以及 Client MAC address 。都需要右键 - 复制 - 值 。

DHCP

如果你没有找到 DHCP 的数据包,可以通过 IPTV 盒子底部的贴纸查看。我这款盒子,最后一个就是 Option: (12) Host Name 当然了 MAC 地址上面也有,而 Option: (60) Vendor class identifier 我已经在上图给你了,就是 SCITV 。

IPTV盒子

接下来就开始路由器的设置了。

首先进入路由器设置 - 网络 - 交换机,将之前用于抓包的 数据包镜像 功能关掉。随后将插有 ITV 口的 LAN 4 在 VLAN 1 中设置为 untagged 。添加一个 VLAN 3 ,将 CPU (eth0) 设置为 tagged ,然后将 VLAN 3 的 LAN 4 设置为 untagged 。设置完毕后,效果如下图。

VLAN

进入路由器设置 - 网络 - 接口 - 添加新接口。命名为 IPTV 注意全部大写,接口协议为 DHCP 客户端 包括接口 VLAN:eth0.3 。设置如下图。

添加新接口

然后设置端口的 请求 DHCP 时发送的主机名 对应的就是之前获取的 Option: (12) Host Name,以及高级设置里面的 请求 DHCP 时发送的 Vendor Class 选项 也就是之前获取的 Option: (60) Vendor class identifier 即 SCITV,最后是 重设 MAC 地址 填入 Client MAC address 也就是你 IPTV 盒子的 MAC 地址。

还有不要勾选 使用内置的 IPv6 管理,使用网关跃点为 20 。

IPTV 接口设置

保存并应用设置后,再进入你的 WAN 接口设置,将它的 网络跃点设置为 10,否则你会无法正常使用互联网

进行到这里,你的 IPTV 接口应该就可以正常的获取到 10 开头的内网 IP 了。如果你不是四川的朋友,那么你地区的运营商可能是 PPPOE 验证或验证逻辑与我这里不同,如果你是四川的朋友,那么请你检查 之前抓包或者是在机顶盒上面看到的 Option: (12) Host Name 以及 Option: (60) Vendor class identifier 和 MAC 地址是否填写正确。如果你是通过抓包获取的数据,那应该不会有错,如果你是抄的机顶盒上面的,那么可能是因为你所在的地区与我的验证逻辑不同。

所以我强烈建议,还是通过抓包来分析 IPTV 盒子获得内网 IP 的全过程,因为不管你是 PPPOE 还是 DHCP 它都可以分析出来。

配置 igmpproxy 和 udpxy

使用 SSH 连接到路由器

修改配置文件时需要使用 SSH 连接到路由器进行修改,进入路由器设置 - 系统 - 管理权,在接口 lan 下设置端口为 22,同时打开 密码验证和允许 root 用户凭密码登录。

路由器SSH设置

下载 Xshell https://www.netsarang.com/zh/free-for-home-school/ ,官网提供了免费的供家庭和学校使用的版本,足够本次教程所用。

新建连接,名称随意,主机填上路由器的 IP。点击左侧连接中的用户身份验证,将方法设置为 Password 用户名为 root 密码则为登录 Web 端后台时的密码,我提供的固件默认是 password

30

安装 igmpproxy 和 udpxy

如果你的路由器使用的我提供的固件则无需安装,因为固件是自带该软件包的。

我建议在安装之前,在 Web 端后台的系统 - 备份/升级 中备份当前配置文件。因为我尝试了多个固件,在安装了 udpxy 后 Web 端就会无法正常使用,有很多报错。只有恢复到出厂设置才恢复正常。最后找到了一个自带 udpxy 的固件才解决我的问题。

使用 Xshell 连接到路由器后执行以下命令。

1
opkg update && opkg install igmpproxy udpxy luci-app-udpxy

opkg update 是用来更新软件列表的,因为大陆对 OpenWrt 软件源地址连通性不佳,所以可能需要等很久或者是多次尝试。

查看命令返回的结果或查看系统 - 软件包中的已安装软件包中是否存在 igmpproxy udpxy luci-app-udpxy 来判断是否安装成功。

配置 igmpproxy

关于 igmpproxy 它主要是将所有来自 lan 的 IGMP 数据都传到 IPTV 接口去,为了防止组播的 udp 数据在 lan 里面乱串,影响网络效率。但是我这里在 lan 里面是无法播放 igmp:// 地址的数据的,我也不清楚是什么情况。而且据恩山网友测试,OpenWrt 的 igmpproxy 是失效的,如果有人在 lan 里面观看组播地址视频或者是使用 IPTV 盒子,都会导致局域网内的组播风暴,会导致网络堵塞。所以主要是后面的 udpxy 在起作用。

执行以下命令,一定要复制全一起粘贴进去然后再回车执行。

1
2
3
4
5
6
7
8
9
10
11
12
echo "config igmpproxy
	option quickleave 1

config phyint
	option network IPTV
	option direction upstream
	list altnet 0.0.0.0/0

config phyint
	option network lan
	option zone lan
	option direction downstream" > /etc/config/igmpproxy

配置 udpxy

在路由器 Web 端设置 - 服务 - udpxy 中,勾选启动、Respawn、状态。将端口设置为 8888,将 Source IP/Interface 设置为 IPTV 接口的 ifname,也就是在路由器 Web 端设置 - 网络 - 接口 中 IPTV 接口图标下方的小字。在我这里为 eth0.3

udpxy

保存并应用后,打开 http://路由器IP:8888/status 查看 udpxy 运行是否正常。当你在播放视频的时候,这个页面也会显示正在播放客户端的 IP 与它的实时流量。

udpxy status

然后你就可以在 PotPlayer 和 VLC media player 播放之前处理好的连接了,可以直接打开 M3U8 播放列表,也可以播放一个单独的地址。

例如你获取的地址为 igmp://239.93.22.6:6666

那么使用 udpxy 转换后的地址为 http://192.168.10.1:8888/udp/239.93.22.6:6666

如果你仍然无法播放,请将下面的防火墙规则添加进 /etc/config/firewall

如果你会使用 vim 那么直接在 Xshell 里面修改即可,如果你不会可以在 Xshell 窗口中点击 新建文本传输(Ctrl+Alt+F),将该文本下载到本地使用 notepad++ 进行修改,再上传上去。请注意你的防火墙配置可能已经存在,请你仔细的排查每一个设置项。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
config rule
        option name 'Allow-IGMP'
        option target 'ACCEPT'
        option family 'ipv4'
        option src 'iptv'
        option proto 'IGMP'

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

config rule
        option name 'Allow-UDP-igmpproxy'
        option target 'ACCEPT'
        option family 'ipv4'
        option src 'iptv'
        option proto 'udp'
        option dest 'lan'
        option dest_ip '224.0.0.0/4'

如何在外播放家中 IPTV 源

首先需要公网 IP,你可以在 在路由器 Web 端设置 - 网络 - 接口中,查看 WAN 获得的 IP 是否与你在 https://ip.sb/ 看到的 IP 一致。如果不一致的话,可以向电信人工客服反映「我需要公网 IP」即可。

在路由器 Web 端设置 - 网络 - 防火墙 - 端口转发 中,添加协议为 tcp,外部区域为 wan,外部端口为 8888,内部 IP 地址为 192.168.10.1,内部端口为 8888 的规则即可。

端口转发

那么你在外要播放的话,只需要把路由器的 IP 地址换为你的公网 IP 即可。

例如你的本地播放地址为 http://192.168.10.1:8888/udp/239.93.22.6:6666

那么当你的公网 IP 为 125.60.90.40 时

你的互联网播放地址则为 http://125.60.90.40:8888/udp/239.93.22.6:6666

因为公网 IP 都在变,你可以使用 DDNS 也就是 动态 DNS 使用域名来防火,你可以使用路由器内自带的服务商。如果你和我一样将域名放置于 DNSPod 管理,也可以使用我制作的 DdnsWithDnspod 使用一个子域名来专供 IPTV 的播放。

结语

首先非常感谢各位前辈,我也是通过阅读现有的教程总结出来的。本文用了接近 5000 字,详细的介绍了有关 IPTV 与互联网的融合,希望能够对需要的朋友有帮助。因为本人能力有限,文中难免有一些问题也希望有发现的朋友能够及时的指出,我将感激不尽。

参考

恩山无线论坛@鲲翔 - IPTV融合进普通网络一般步骤

恩山无线论坛@footlog - K2P/K2 padavan双线接入,宽带+IPTV,udpxy+xupnpd详细设置

恩山无线论坛@lcsuper - 小白的IPTV折腾教程(3)—双网融合、IPTV共享

恩山无线论坛@kangtao022 - 最新四川南充电信IPTV组播地址,及整理出地址列表的方法!

恩山无线论坛@橙子_MAX - 【附固件】全网首发,新三OpenWRT路由器IPTV内网融合视频教程

橙子的个人博客 - IPTV内网融合,实现任意设备观看IPTV

恩山无线论坛@angelkyo - 四川电信DHCP抓包能获取到IP,但是抓不到option60信息

恩山无线论坛@wengmingao - 简单的的IPTV 0成本抓包!

恩山无线论坛@莫问归期 - 在openwrt里安装udpxy后主题界面就会乱

 

 


原文地址:https://blackyau.cc/23.html

点赞
  1. Tobacco说道:
    Google Chrome Windows 10
    若问一下,软路由可否实现?
    1. 博主说道:
      Google Chrome Windows 10
      可以
  2. ninoke说道:
    你好,请问下有出现一开始无线宽带是100多兆,但是组播转单播后无线宽带只有40多兆的情况吗?
    1. 博主说道:
      Google Chrome Windows 10
      无线的速度?这个不好说是哪里的原因。
  3. klxs说道:
    Google Chrome Windows 10
    老师,按照流程,能够获取到10.开头的地址,但访问 http://路由器IP地址:8888/status/,始终提示“无法访问此网站”“拒绝了我们的请求”是什么原因呢,也无法使用VLC播放HTTP的地址
    1. klxs说道:
      Google Chrome Windows 10
      一直卡在这了,我也是四川电信的,始终解决不了,大大可以帮帮我吗 :lei:
      1. 博主说道:
        Google Chrome Windows 10
        不好意思,每个人使用的环境都不一样,这个帮不了,请自行研究。
    2. 博主说道:
      Google Chrome Windows 10
      每个人的网络环境都不一样,你这个问题我没法答复。
  4. 飞翔的企鹅说道:
    Google Chrome Windows 10
    成都电信,单线复用的话能融合吗?
    1. 飞翔的企鹅说道:
      Google Chrome Windows 10
      同一个网线,同一个网口接路由器和光猫,光猫已经取消绑定,所有的口都可以Iptv和拨号上网。
    2. 博主说道:
      Google Chrome Windows 10
      你可以把iptv的拨号放到软路由里面来做
      1. 飞翔的企鹅说道:
        Google Chrome Windows 10
        我用的群主的op全功能版本,成都电信的iptv应该是鉴权dhcp,我把盒子的信息填进去就能获取到10开头的地址了。但是这个版本的op没有虚拟交换机了,不能添加vlan,同一个网口设置成dhcp后pppoe拨号上网就连接不上了。
        1. 博主说道:
          Google Chrome Windows 10
          不是我编译的OP没有这个功能,是你不会设置!所有的OP增加VLAN设置的方法都一样的:在OP的菜单-网络-接口-添加新接口-物理设置-自定义接口,写上“eth0.100”,带小数点后面 这个就是VLAN的ID,设置好就行了。
          1. 飞翔的企鹅说道:
            Google Chrome Windows 10
            感谢!!! 已经添加上了,但是tagged untagged在哪里设置呢,不设置dhcp和拨号都失败。
          2. 博主说道:
            Google Chrome Windows 10
            这个是硬路由的Op才有这个功能,软路由不需要搞VLAN的,利用负载均衡的功能设置好上网和iptv分流就好了。
  5. ForgetY说道:
    Google Chrome Mac OS X 10.15.7
    主路由和其他设备之间加个交换机的话要增加什么配置吗
    1. 博主说道:
      Google Chrome Windows 10
      普通的交换机可以随意加,没有要求。
      1. ForgetY说道:
        Google Chrome Mac OS X 10.15.7
        如果主路由只有两口网口,光猫的IPTV接到交换机上这样可以吗?

发表回复