利用镜像交换机获取本地直播源 OpenWRT 双 WAN 口实现局域网任意设备观看 IPTV
最近收拾屋子,发现了好久没用过的电信 IPTV 机顶盒。
自从家里买了小米的激光投影仪以后,一直看的网络电视,就想着利用这个盒子把直播源抓下来,然后配合 OpenWRT 让局域网内任意设备随时都可以观看电视直播,甚至可以分享到公网,方便其它人。
于是我特意从京东买了一款带端口镜像功能的 TP-LINK 千兆 8 口交换机,型号是 TL-SG2008D
。
获取直播源
整体思路
思路是这样,准备两根网线:
- 将交换机的
千兆口 1
连接到光猫的 ITV 接口。 - 将交换机的
千兆口 8
连接到我的 Mac 上。 - 将机顶盒随便插入到交换机上的任意网口上。
然后在交换机的控制台里设置把 千兆口 1
镜像到 千兆口 8
,因为我的 Mac 连接到了 千兆口 8
上,所以我可以用 WireShark 软件进行抓包分析。
设置交换机的端口镜像
在按照上述思路将设备连接好以后,机顶盒先不要开机。
进入到交换机管理控制台,我手里这款交换机的 IP 是的 10.18.18.251
,先将我的 Mac 改为同一网段下的任意 IP,比如 10.18.18.252
。
在交换机后里的进入到 监控
-> 端口监控
页面,配置如下:
监控端口
- 端口监控使能:
启用
。 - 监控端口:
端口 8
。
点击应用。
被监控端口
- 被监控端口:选中
端口 1
。 - 入口:
启用
。 - 出口:
启用
。
点击应用。
至此,交换机端口镜像功能就设置好了。
WireShark 抓包
在电脑上进行抓包前,最好先将机顶盒开机查看能否正常观看 IPTV,如果没有问题再往下进行。
安装 WireShark
Mac 上安装 WireShark 非常简单,如果已经安装了 Homebrew 的情况下可以直接使用 Homebrew 进行安装:
1 | brew install wireshark |
选择要进行抓包的网卡
打开 WireShark,先选择要抓包的网卡,我这里是 en0
:
抓包
将机顶盒开机,WireShark 中可以看到数据包疯狂滚动,当看到协议都是 UDP
,目标地址都是同一个 IP 的时候就可以停止抓包了,记录一下这个目标地址:10.237.233.38
,有个眼熟就行,因为这个地址应该就是机顶盒的 IP 地址,如果不放心也可以进入到机顶盒里查看一下。
分析数据包
- 在 WireShark 导航栏里点击
放大镜
图标。 - 在下方的协议搜索栏里输入
http
。 - 分组搜索栏里输入
igmp://
。 Destination
目标地址按照升序
排序。- 找到在上一步中记录下的目标地址
10.237.233.38
,且响应为(text/html)
的包,一个一个点击查看。
在左下角的黑色区域内会显示这个包的内容,如果看到像下图中所示有 ChannelName
或者电视台名称字样的,那么这些响应文本就是我们需要的,直播源都在里面了。
保存直播源
在上一我们找到的数据包中,包含了所有的直播源信息,此时我们只需要在这条数据包上点击 鼠标右键
,点击 追踪流
,点击 HTTP Stream
,则会打开一个新的窗口,里面是完整的 HTML 内容,且包含了我们要找的直播源信息。
在弹出窗口中,下方 Show data as
选择 UTF-8
编码,向下滑动鼠标,可以看到直播源相关信息。
将窗口里的内容全部复制并保存下来,我们就得到了完事的直播源信息。
处理直播源信息
在上述过程获取到的直播源信息中,igmp://239.37.0.8:5540
这种字样的就是我们真正需要的直播地址了。
如果只是到这样肯定是不能观看的,我们可以用记事本将所有的频道信息手动整理成 M3U8
格式,然后拿到其它的设备上播放,但以我本地为例,直播源有 260 多个,手动岂不是搞死个人,所以我写了个程序放在了 这里,只需要你将弹窗中获取到的完整的直播源信息复制粘贴进去,就可以得到整理好的 M3U8
文件了。
重要声明:这个程序并不能处理全国所有地区的直播源信息,需要你的直播源信息和我的格式一样才行。
如果你的直播源信息和我的直播源信息格式不一样,那么就需要你想想其它办法解决啦。
M3U8 文件格式
我们可以处理好的直播源保存为 iptv.m3u8
文件,内容如下:
1 | #EXTINF:-1,CCTV-1综合高清 |
其中:
CCTV-1综合高清
是电视台的名字(废话)。http://192.168.1.1:4022/udp/
是我们即将用 OpenWRT 设置的单播地址。239.37.0.8:5540
是我们获取到的电视台直播源。
OpenWRT 双 WAN 口配置组播转单播
我下面介绍这种方案,不需要拿到光猫管理员(实测长春电信现在什么小冀抓包都不好使了),不需要设置 VLAN(麻烦),只需要多占用一个软路由的网口,简单配置一下插件即可。
网络拓扑
先说一下网络拓扑情况:
- 光纤入户到光猫,光猫设置桥接模式。
- 光猫的一个千兆口连接软路由
WAN(ETH 0)
口,然后通过软路由拔号上网。 - 光猫的 ITV 口连接软路由
ETH 3
。
以我手里这台 J4105 为例,它有 4 个千兆网口,ETH 0
用来当作 WAN
口,ETH 3
则用来当 IPTV 的转播口,软路由我使用的 iStoreOS(OpenWRT 套壳,简单好用好看)。
释放 LAN 口
以下操作均以 iStoreOS 为例,其它编译的 OpenWRT 版本请自行对应
在 网络 -> 接口 -> 设备 -> br-lan -> 配置 -> 常规设备选项 -> 网桥端口
中取消勾选 ETH 3
,保存并应用。
新建 IPTV 接口
在 网络 -> 接口 -> 接口
中,点击 添加新接口
。
名称:IPTV
,名称随意写,不过 IPTV 才是它正确的命名不是吗?
协议:静态地址
。
设备:ETH 3
。
点击 创建接口
。
在 常规设置
中,IPv4 地址 设置为 192.168.10.10
(随便设置,不和路由在一个网段就行)。
在 高级设置
中,使用网关跃点 设置为 20
。
保存,会看到 接口
页面上多出来一个 IPTV
的接口。
防火墙
进入 网络 -> 防火墙
页面。
在 常规设置
中:
- 入站数据:
接受
。 - 出站数据:
接受
。 - 转发:
接受
。
在 区域
中,添加一个:
- 名称:
IPTV
。 - 入站数据:
接受
。 - 出站数据:
接受
。 - 转发:
接受
。 - 允许转发到目标区域:选择
LAN
。 - 允许来自源区域的转发:选择
LAN
。
保存。
设置 UDPXY
我使用的 iStoreOS 中已经集成好了 UDPXY 插件,如果你的 OpenWRT 系统并没有集成,那么你需要去 系统 -> 软件包
中手动进行安装。
安装好以后,进入到 服务 -> udpxy
设置:
启用
。- 绑定 IP/接口:
192.168.1.1
(路由地址)。 - 端口:
4022
(没有需要不用改)。 - 源 IP/接口:
eth3
。 - 最大客户端数量:
99
这个是指同时可以观看直播源的客户端数量。
保存并应用。
验证 UDPXY
在浏览器里访问 http://192.168.1.1:4022/status
(IP 和端口换成你自己的),可以查看到如下页面,说明 UDPXY 配置成功:
插放验证
可以从我们上面抓取出来的直播源里随便选一个频道的 IGMP 的 IP和端口,修改为 http://192.168.1.1:4022/udp/239.37.0.8:5540
,格式为:
1 | http://[路由器 IP]:[UDPXY 端口]/udp/[直播源 IGMP 协议 IP]:[直播源 IGMP 协议端口] |
使用一个能播放流的应用打开此 URL 即可正常播放,Mac 上可以直接使用 IINA:
如果能正常播放,就可以将前面我们整理的 M3U8 文件里的端口和地址修改正确了,然后使用播放器打开,即可看到所有的频道列表。
这位女士长得好像我们财务,赶紧换一个。
其它平台的播放器
- MacOS:
IINA
。 - iOS & iPad:
APTV
。