前言

前段时间在网上看到一个视频,大致讲的是软路由系统性能大比拼。视频里拿 RouterOS, iKuai 和 OpenWrt 做了些对比。后来偶然看到,iKuai会对所有流量做分析分类,不管是否开启策略流控。

此前笔者的主路由系统一直是 iKuai 爱快,我想上述情况势必会为我性能低下的 J4125 软路由造成一定影响。于是乎…

秉着拥抱开源 闲着没事干瞎搞 和学习的心理,我在这次暑期放假开始了路由系统的迁移工作,在这里记录一下在本次迁移中,关于 iPTV 的配置方案。

浙江电信 iPTV 使用 DHCP 鉴权方案,在机顶盒设置中呈现为 IPoE 方式上网。

准备工作

  • 运营商 iPTV 机顶盒
    需要事先完成认证,确保将其接入光猫 iTV 口时,能直接正常使用
  • 一根网线
    用于连接 iPTV 机顶盒和电脑主机
  • WireShark 软件
    用于抓包 官网下载
  • 搭载 OpenWrt 系统的路由设备
    如果你不具备光猫后台访问权限,则可能需要两根网线接入路由。
  • 其他基础资源

抓包工作

要获取后续 DHCP 鉴权所使用的 Option 60 信息,我们需要对机顶盒发出的数据进行抓包。

我们假设你的机顶盒已处于未被修改的状态(即准备工作中提到的状态)。按如下步骤进行:

  1. 将网线两端分别接入机顶盒网口和电脑有线网络接口a
  2. 打开 WireShark 软件,选取对应网络接口,开始抓包
    (如没有网络接口,请使用管理员权限运行 WireShark)
  3. 为机顶盒上电,等待数据包出现b

a 若你的电脑仅靠这个网口上网,那么你的电脑将会断网,请提前准备好 WireShark 软件
b 机顶盒会无法联网,这是预期内的情况,无需在意

当你在 WireShark 软件中,看到 Protocol 为 DHCP 的包时(形如下图),可停止抓包。随后,单击对应包查看详情。

WireShark 抓包信息

浙江电信 iPTV 在鉴权时,只要求 Vendor Class identifier (Option 60) 以及 Host Name (Option 12) 有效即可。

在这里,我们将 Option 60 以如图中选项 (右键 - 复制 - …as a Hex Stream) 的形式复制出来,并将 Host Name 复制出来 (右键 - 复制 - 值) 保留备用。

如果没有差错,那么这个时候机顶盒的任务已经完成了,可以将电脑网线复原了。

设置 IPTV 接口

网络设备配置

由于笔者具有修改光猫 VLAN 绑定的权限,因此本文以单线复用为例。
多线配置方法类似,只需为接入 iTV 口的网卡分配 VLAN 号即可。

按照下图指示,找到网络设备配置项:

设备配置

在图中,圈起来的四个选项需要修改。

  • 设备类型 选择 VLAN (802.1q)
  • 基础设备 选择可以访问 iPTV VLAN 的设备
    (对于已在光猫侧修改 VLAN 绑定的单线而言,选择当前 WAN 口即可;否则,请选择链接 iTV 口的设备)
  • VLAN ID 根据光猫中的情况填写 (浙江电信为 43)
  • 设备名 可自定义,此处保持默认
  • 其他:MAC 地址无需修改,IPv6 可关闭

随后,返回接口页面。

接口配置

在接口设置界面,添加新接口,名称自拟,本文使用 iptv

接口配置

大体按照上图配置即可。画横线处需要留意,解释如下:

  • 协议:DHCP 客户端
  • 设备:选择上文中配置的 VLAN 设备
  • 请求 DHCP 时发送的主机名 (Hostname):填写抓包获取的 Option 12
  • 请求 DHCP 时要发送的供应商类别 (Vendor Class): 填写抓包获取的 Option 60
  • 使用默认网关:取消勾选(否则会导致网关错误,路由器无法上网)

dhcp.sh 脚本修改

注意:本人暂不清楚 OpenWrt 系统升级后该脚本是否会被覆盖,若升级系统后不可用,请尝试重新修改。

配置完成后,暂时无法直接使用。需要修改 OpenWrt 的 DHCP 脚本,使刚刚填写的 Vendor Class 支持 16 进制 Stream。

使用 SSH 或其他方式登入 OpenWrt 的 shell,编辑文件 /lib/netifd/proto/dhcp.sh (大约位于第 72 行)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
...
proto_dhcp_setup() {
 # 省略
        proto_run_command "$config" udhcpc \
                -p /var/run/udhcpc-$iface.pid \
                -s /lib/netifd/dhcp.script \
                -f -t 0 -i "$iface" \
                ${ipaddr:+-r ${ipaddr/\/*/}} \
                ${hostname:+-x "hostname:$hostname"} \
                # ${vendorid:+-V "$vendorid"} \ 原本是这样
                ${vendorid:+-V '' "-x 0x3c:$vendorid"} \  # 修改成这样
                $clientid $defaultreqopts $broadcast $norelease $dhcpopts
 # 省略
}

修改完成后,重启网络接口。稍等片刻,刷新页面,这时候你应该能获取到对应的内网 IP 了!(一般为 10.0.0.0/8 的 IP)

组播流代理

我们将需要一个组播流代理程序,使得 IPTV 接口上的视频数据能通过代理被访问。

安装插件

本文以 msd_lite 为例,你也可以使用 udpxy 插件,效果是一样的。

由于 OpenWrt 官方软件包仓库并没有 msd_lite,我们可以前往 immortalwrt 的软件包仓库获取这个包 (需要同时下载 luci 包和 packages 包)。
以我的 OpenWrt 24.10.2 为例,软件包下载链接如下:

1
2
3
4
5
https://downloads.immortalwrt.org/releases/24.10.2/packages/x86_64/packages/msd_lite_2024.04.29~db583386-r1_x86_64.ipk
https://downloads.immortalwrt.org/releases/24.10.2/packages/x86_64/luci/luci-app-msd_lite_25.168.43206~c81ed60_all.ipk

// (可选) msd_lite luck-app 的中文语言包
https://downloads.immortalwrt.org/releases/24.10.2/packages/x86_64/luci/luci-i18n-msd_lite-zh-cn_25.168.43206~c81ed60_all.ipk

如果你的 OpenWrt 软件版本不同,请到 ImmortalWrt 软件包仓库 中查找对应版本和架构的包。

简单配置插件

msd_lite 的配置非常简单。在服务选项卡中找到 Multi Stream daemon Lite (组播转换) ,勾选启用,并将源接口配置为刚刚的 iptv 接口即可。

修改完成后,保存并应用,你应该就可以使用路由器代理的组播源地址播放 IPTV 直播流了~
以浙江电信的 CCTV 1 源为例,可以使用如下地址观看直播:

1
http://192.168.1.1:7088/udp/233.50.201.118:5140

当然啦,IP,端口,组播地址之类的得根据自己路由设置和当地情况修改

这里附上一个浙江电信 IPTV 组播地址仓库 (Github),理论上全省通用,下过来自己改改路由器地址和端口就能用啦 ˋ( ° ▽、° )

组播源地址一般不怎么修改,不知道本地组播地址的可以去网上搜搜,大概率会有其他人抓好的地址可供使用。如果很不幸地没有人抓的话,可以搜搜教程自己试试抓包qwq

进阶玩法

如果你想要在这样操作之后,让原来的机顶盒依然能用,可能需要对机顶盒需要访问的IP进行抓包,并配置相应的静态路由。操作会相对麻烦一些,这里不提供详细教学。

一个简单的思路是:

1
在 OpenWrt 上安装tcpdump 以供后续抓包使用 -> 取消勾选 OpenWrt 默认上网接口中的 “使用默认网关” -> 然后将 IPTV 接口设置为默认网关(前提是你已经完成了上述步骤) -> 进入机顶盒的设置页面 (我这电信机顶盒默认密码为 10000),将上网设置改为 DHCP,自动从路由器上获取 IP -> 打开 WireShark,抓取 br-lan(默认情况下是这个接口,如有修改以实际情况为准)接口,过滤 ip.dst 和 ip.src 为机顶盒IP -> 退出设置页面(可能需要重启机顶盒),重新走认证流程,查看 WireShark 中,抓到了机顶盒访问的哪些网段 -> 添加对应网段到 OpenWrt 静态路由表

我这边用到的网段如下,仅供参考:

1
2
3
4
5
6
10.255.247.0/24
61.130.250.16
115.233.200.0/24
220.186.0.0/16
220.191.0.0/16
233.50.0.0/16

记得操作完把默认网关调回去哟

最后

呼…总算是填完了第一个坑!没什么好唠嗑的啦,先这样。如果文章中有任何疏漏等问题,请在下方评论区提出,我会定期检查邮箱查看更改滴(o゜▽゜)o☆