最近收拾屋子,发现了好久没用过的电信 IPTV 机顶盒。

自从家里买了小米的激光投影仪以后,一直看的网络电视,就想着利用这个盒子把直播源抓下来,然后配合 OpenWRT 让局域网内任意设备随时都可以观看电视直播,甚至可以分享到公网,方便其它人。

于是我特意从京东买了一款带端口镜像功能的 TP-LINK 千兆 8 口交换机,型号是 TL-SG2008D

获取直播源

整体思路

思路是这样,准备两根网线:

  1. 将交换机的 千兆口 1 连接到光猫的 ITV 接口。
  2. 将交换机的 千兆口 8 连接到我的 Mac 上。
  3. 将机顶盒随便插入到交换机上的任意网口上。

然后在交换机的控制台里设置把 千兆口 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 地址,如果不放心也可以进入到机顶盒里查看一下。

分析数据包

  1. 在 WireShark 导航栏里点击 放大镜 图标。
  2. 在下方的协议搜索栏里输入 http
  3. 分组搜索栏里输入 igmp://
  4. Destination 目标地址按照 升序 排序。
  5. 找到在上一步中记录下的目标地址 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
2
3
4
5
#EXTINF:-1,CCTV-1综合高清
http://192.168.1.1:4022/udp/239.37.0.8:5540

...

其中:

  • 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