由于不怎么爱看国内电视节目,所以距离上次折腾IPTV也好多年了。这段时间一直用组播播放着,逢年过节偶尔看一下,但是不能回看。近期看到了恩山一个可以快速切换台FCC的帖子,来了点兴趣正好目前有点时间,就又折腾了下。这次折腾的目标是,1能够快速换台,虽然目前tivimate换台也不慢但是新技术总要尝尝鲜;2是局域网内播放设备能够回移和回放;3是自动获取IPTV的时移源,rtsp时移源这里需鉴权才能观看,且IPTV口IP变化鉴权信息就失效,可能还有有效期限制,不能自动获取的话回移和回放就毫无意义。
经过几天奋战,在AI的帮助下,全部完成目标。目前用Tivimate基本达到了和运营商盒子同样的播放效果。留下这篇记录,以便再次折腾时能够少走弯路,希望明白为什么要这么做,为以后接入多线做准备。网络接线方式是这样的,光猫IPTV口接到软路由eth4口,eth5口是pppoe拨号,eth0-3是br-lan桥接的lan口。由于没有网线限制,所以没有搞单线复用,几年前折腾过单线复用看IPTV。iptv单独使用网口,也就不需要进行光猫VLAN等等设置。要使路由器网络正常使用,相当于要进行多网合一(同时接入电信、移动等),必须进行策略路由,确保不同网络相互不影响。也就是说必须要建立相关路由规则,保证访问不同IP地址走相关的网络接口。如果不追求能回看的话,其实很简单,都无需抓包,只需要手工定义该接口的IP信息(在IPTV的网段内),防火墙设置后就能看组播了,没有很多的复杂配置操作。但是IPTV的可看性大大下降。现在可以时移和7天回看,使用乐趣大大增加。
我这里抓包后,IPTV节目链接信息的格式是的:
其中239.0.0.0:1234 是组播地址,|后的是rtsp单播地址,TimeShiftURL 后的是rtsp时移回放地址,RTSP是基于SDP协议(会话描述协议)。我这里播放会多次302重定向到新地址,ChannelFCCServerAddr 后的是FCC快速换台服务器地址。AuthInfo 后的是一大推认证鉴权信息。原先不确定带一大堆认证鉴权信息的时移回放地址能否播放,几年前试过是无法播放(当时没设置好),这次也没底,经过多次测试后这种格式的完美播放。rtsp单播地址实际也能时移回放,但是IPTV口IP变化鉴权信息就失效,无法播放,另外鉴权可能有时间限制。时移回放地址能回看7天内节目。
一、抓包
距离上次抓包已经四五年了,都忘了怎么抓包的了。要想完成上述目标,抓包是必不可少的,不然无法获取相关IPTV认证信息。Wireshark具体就不细说了,网上很多,只留接线图,一看便会。需要一个能镜像流量的openwrt硬路由。

抓包完成后,在Wireshark搜索框输入dhcp进行筛选,选择info信息里的 DHCP Request ,在 Option:(60) Vendor Class Identifier这行上,鼠标右键选择复制—-as a Hex Stream就可以复制出Option60的信息了,这个就是加密后的itv的账号和密码。这个值每次连接可能会变,只要选择任意一个即可。
同时将 Option 12 、MAC地址等也复制出来。
二、软路由设置
按照软路由的接线接好后,我们要让路由器能够自动获取到IPTV的内网IP地址。
1、电信盒子是通过DHCP+获取IP的,DHCP需要附带Option 60 Vendor Class Identifier(厂商类别标识)进行认证,Option 60 用3DES+MD5加密传送,写入明文信息就无法认证,我们这里也是这样。不过我们可以直接发送已加密的16进制Option 60 值,我们刚才抓包信息里就有,Option 60对应一串加密字符,Openwrt需要修改脚本,否则发送两个Vendor Class信息,旧版本还不自动转换为16进制。
2026年1月前的官方openwrt版本需要将 ${vendorid:+-V "$vendorid"} \ 修改为 -V '' \ 或 ${vendorid:+-V "" "-x 0x3c:$vendorid"} ,其中第一个修改后 DHCP 请求时发送的供应商类别 要写0x3c:??????,第二个直接写加密的16进制option60值。今年2026年1月份官方openwrt修改了dhcp.sh 文件,防止重复发送Vendor Class,且直接将字符转换为 0x3c 16进制信息了。原来的方法不行了,但是修改也很简单的,执行:
sed -i '/\[ -n "\$vendorid" \] && append dhcpopts /d' /lib/netifd/proto/dhcp.sh sed -i '/\[ -n "\$clientid" \]/a\ [ -n "$vendorid" ] && append dhcpopts "-x 0x3c:$vendorid"' /lib/netifd/proto/dhcp.sh
这样就可以在IPTV网口配置信息里直接填写加密后的16 进制Option 60值。
2、修改网卡的MAC地址,我们需要修改软路由eth4端口的MAC地址,使得IPTV认证服务器认为我们是盒子,否则有可能被拒绝接入。在 网络 — 接口 —设备 处修改MAC地址,输入我们盒子的MAC地址。

3、创建IPTV接口,通过DHCP协议获取IP。

4、进入网口设置,DHCP 请求时发送的主机名,填写抓包里面的Option12 机顶盒序列号(STBID)。

5、高级设置 里面,DHCP 请求时发送的供应商类别( Vendor Class )填入抓包文件里的Option 60 值,勾选 使用该接口的网关作为默认网关,然后必须填写 覆盖 IPv4 路由表 ,这里我们填入 168 或其他名称,如iptv也没问题。这样和主网络相互不影响了。覆盖IPV4路由表不知谁翻译的,这里不是覆盖默认的IPV4路由表,而是新建一个该接口的路由表。覆盖 IPv4 路由表 这里是为了做策略路由,让局域网内设备看单播rtsp走iptv口。同时也是为了不影响主路由规则。

防火墙设置里 ,新建一个 IPTV 防火墙规则,以便和其他防火墙规则进行区别。

DHCP服务器 ,不开启。
输入相关信息保存后看看是否能获取到相关IP,如果能获取到说明该接口设置正确,不能获取到IP的话仔细检查设置。
这里的几个注意点如下:
使用该接口的网关作为默认网关 这里应该选上,不选上你需要设置静态路由或路由规则,难点是重启后IPTV端口网关会变,也不是改成IPTV口IP的最后一位为0或1,再次设置IPTV静态路由网关。因为播放单播rtsp的链接地址需要走光猫iptv口才能播放(部分地区可以走公网播放),不设置静态路由无法达到FCC快速换台和rtsp单播 播放效果。我这里IPTV单播地址这里走pppoe拨号口是无法播放的。后来通过脚本来获取IPTV口的网关,自动修改静态路由解决了这个问题。
以下本段内容无需操作,仅供参考。IP为乱编,以了解折腾过程。
原先我这里没有选上使用该接口的网关作为默认网关 ,Openwrt也就不会自动创建路由信息,也不会和主路由冲突,也无需创建路由规则。然后通过配置静态路由让局域网内设备看iptv走iptv口,我们需要知道当地IPTV单播地址的IP段,我这里单播地址是公网IP。IPTV单播地址段可以搜索网站获得或根据抓包信息推断。难点是 静态IPv4路由 网关的自动获取,获取的IPTV口IP如果不是/24的话,网关最后一位就不是0或1。我这里获取的IP掩码是/20这种,需要计算出网关。这里留下折腾过程中热拔插事件发生后自动获取IPTV网关并刷新 静态IPv4路由 的脚本99-autoiptvgateway,放到/etc/hotplug.d/iface/里,重启路由器IPTV口就自动设置 静态路由。首先先手工创建静态IPv4路由 ,相当于下方:
config route
option interface 'iptv'
option target '188.18.0.0/20'
option gateway '10.235.235.12'
config route
option interface 'iptv'
option target '168.18.0.0/20'
option gateway '10.235.235.12'静态ipv4路由设定后,相当于加了下面几条route规则。命令: ip route show
10.235.235.12/20 dev eth4 proto static scope link
188.18.0.0/20 via 10.235.235.12 dev eth4 proto static
168.18.0.0/20 via 10.235.235.12 dev eth4 proto static
可以通过 ip route get 188.18.18.18 查看rtsp单播地址的ip是否走了iptv端口,如rtsp单播地址的ip是188.18.18.18 。
188.18.18.18 via 10.235.235.12 dev eth4 src 10.235.235.188 uid 0
cache
可见188.18.18.18走了10.235.235.12 网关,从iptv端口ip 10.235.235.188发出连接,此时你ping 188.18.18.1 应该也是通的。
hotplug 热插拔自动设置静态路由的脚本99-autoiptvgateway如下:
#!/bin/sh
LOG_DIR="/usr/share/myfile"
TARGET_IPTVIFACE="iptv"
TARGET_IPTVDEVICE="eth4"
echolog() {
local d="$(date "+%Y-%m-%d %H:%M:%S")"
echo "$d: [Hotplug iptv]$*" >> "$LOG_DIR/iptvgateway.log"
}
if [ "$INTERFACE" = "$TARGET_IPTVIFACE" ]; then
if [ "$ACTION" = "ifup" ] ; then
(
success=0
# 等待 IPTV端口 获得 IPv4 地址(最多 20 秒)
for i in $(seq 1 10); do
ADDR_LINE=$(ip -4 addr show dev "$TARGET_IPTVDEVICE" scope global \
| grep 'inet ' | head -n1)
if [ -n "$ADDR_LINE" ]; then
IPADDR=$(echo "$ADDR_LINE" | awk '{print $2}' | cut -d/ -f1)
MASK=$(echo "$ADDR_LINE" | awk '{print $2}' | cut -d/ -f2)
success=1
seconds=$((i * 2 + 2))
break
fi
sleep 2
done
[ "$success" -ne 1 ] && exit 0
# /32 无法计算网关
[ "$MASK" -eq 32 ] && exit 0
# ---------- 计算 network + 1 ----------
ip2int() {
IFS=. read a b c d <<EOF
$1
EOF
echo $(( (a<<24) + (b<<16) + (c<<8) + d ))
}
int2ip() {
echo "$(( ($1>>24)&255 )).$(( ($1>>16)&255 )).$(( ($1>>8)&255 )).$(( $1&255 ))"
}
IP_INT=$(ip2int "$IPADDR")
NETMASK_INT=$(( 0xFFFFFFFF << (32-MASK) & 0xFFFFFFFF ))
NETWORK_INT=$(( IP_INT & NETMASK_INT ))
GATEWAY_INT=$(( NETWORK_INT + 1 ))
GATEWAY=$(int2ip "$GATEWAY_INT")
echolog "IPTV端口已启动,当前IP为:${IPADDR}/$MASK 当前网关为 $GATEWAY"
uci show network | grep '=route' | while read line; do
INDEX=$(echo "$line" | sed -n 's/.*@route\[\([0-9]*\)\]=route/\1/p')
[ -z "$INDEX" ] && continue
IFACE=$(uci get network.@route[$INDEX].interface 2>/dev/null)
if [ "$IFACE" = "iptv" ]; then
OLD_GW=$(uci get network.@route[$INDEX].gateway 2>/dev/null)
if [ "$OLD_GW" != "$GATEWAY" ]; then
uci set network.@route[$INDEX].gateway="$GATEWAY"
fi
fi
done
echolog "IPTV路由网关更改成功!"
uci commit network
/etc/init.d/network reload
echo "" >> "$LOG_FILE"
) &
fi
fiIPTV接口重启命令:
ifdown iptv sleep 5 ifup iptv
三、路由规则

上面我们使用该接口的网关作为默认网关解决了静态路由的网关问题,但是让局域网内设备看单播rtsp走iptv口还是要建立路由规则。不然rtsp单播ip会走默认的pppoe拨号网口。
在网络—路由—IPv4 规则中,分别添加188.18.0.0/20及168.18.0.0/20两个条目。

规则类型为unicast单播,其他选项的意义是:
Broadcast 广播 一对所有 ARP 广播
Multicast 组播 一对一组 IPTV、视频会议
Anycast 任播 一对最近的一个 DNS 服务器
高级设置 路由表 填写刚才设置的 路由表168。

这里相当于相当加了几个个IP规则,命令 :ip rule show
1: from all to 188.18.0.0/20 lookup 168
2: from all to 168.18.0.0/20 lookup 168
3: from all to 218.18.0.0/20 lookup 168
10000: from 10.235.235.188 lookup 168
20000: from all to 10.235.235.235/20 lookup 168
90006: from all iif lo lookup 168
前面的数字1、2、10000表明优先级,后面的是哪些入站出站的IP应该查找168路由表。
查看路由表,直接 ip route show 将不会显示自定义的168路由表,说明我们iptv路由和主路由隔离开了。我们查询168路由表用命令: ip route show table 168
default via 10.235.235.188 dev eth4 proto static src 10.235.235.235
10.235.235.235/20 dev eth4 proto static scope link
ip rule 决定出站入站IP应该“用哪张路由表”,ip route 决定“这张表里数据该怎么走”。此时我们可以查询rtsp单播ip从哪里出站的,ip route get 188.18.18.18就可以看到数据包的走向。
四、防火墙设置

我们添加一个iptv防火墙规则。注意 IP动态伪装 必须勾选,因为从IPTV端口出去的数据必须NAT转变为IPTV端口的IP,你默认的192.168.1.1/24局域网IP是无法和IPTV服务器连接的。TCP MSS 钳制勾选与否无所谓,是为了解决 MTU 不匹配导致的 TCP 大包丢失问题。因为要局域网内设备都可以观看RTSP单播,出入站数据均应允许,也要允许lan口和iptv口相互转发数据。这样IPTV服务器rtsp发送无论tcp还是udp均可以进行转发。只要设置好这里就可以了,其他无需做。

五:测试
这样我们IPTV口就算处理好了,IPTV口正常获取了IP,如果没问题的话你可以用抓包出来iptvlist文件里的rtsp单播地址进行测试了。就不介绍如何查找节目列表了,我的sh脚本已经可以自动获取了,找iptvlist文件里面TimeShiftURL=”???” 里面任一rtsp单播地址rtsp://188.18.18.18:554/00000001/010000000000000030000000001234?AuthInfo=?&citycode=?&usercode=?&Playtype=1&programid=?&contentid=?&videoid=?&recommendtype=0&userid=?&boid=?&stbid=?&terminalflag=1&profilecode=&usersessionid=?进行播放。我电脑用了 Potplay 和 VLCmedia 2个播放器进行测试,电视tivimate进行播放测试,其中Potplay无论如何无法观看,电视端 tivimate 也无法观看;偶然将发现 VLC media 多次连续点击 就可以顺利观看了,TCP流UDP流均可以播放。为防止是网络问题,手机端用 MX播放器 进行播放,也是要多次点击就可以播放,查看Openwrt 状态 实时信息 发现是通过UDP转发的数据。设置了下M3U组播文件,Rtp2httpd 里面发现FCC快速切换生效的,说明网络没问题。

几经搜索,发现问题应该是,播放器请求服务的握手流程少了OPTIONS 请求,一些IPTV服务器比较特殊,对握手流程要求比较严格,会被拒绝。播放器没有这些请求,所以播放失败。RSTP播放请求OPTIONS请求不是必须,VLCmedia多次播放失败后会发起OPTIONS请求,走了RTSP播放流程后( OPTIONS DESCRIBE SETUP PLAY )就可以播放。Rtp2httpd增加了这些,所以播放就比较流畅。而其他播放器无法流畅起播。
Tivimate不知为什么不能播放,有说不支持的有说支持的,我这里是正版Tivimate,不能播放原因未知。原来都想放弃了,后用Rtp2httpd代理,Tivimate成功实现了实时视频用组播,回看时移用单播地址。
本文发布后几天又测试了下,发现rtsp单播应该是Tivimate本身程序不支持的原因,电视安装了 DIYP影音 是可以播放rtsp单播源的,解码方式需选为 智能 ,也就是会自动选择到的IJK解码,其他解码方式不支持。但是起播时间较长,估计在内部切换各种解码器耗费时间。如果电视机内置解码器用的是IJK解码,那么tivimate设置为使用第三方解码器估计也可以播放。另外,还有玄学问题,有时用脚本获取的IPTV单播列表实测可以不用带鉴权参数也能播放,也就是播放器可以直接播放如下链接:rtsp://188.18.18.18:554/00000001/010000030000000001234,无需长尾巴;有时又不能放。Potplay有时能播放带鉴权信息的单播链接,但这时VLC却无论如何不能播放了。
网络设置完毕后,下一步就是配置Rtp2httpd代理单播、组播资源、脚本自动IPTV认证、获取rtsp单播地址、编辑m3u文件使得可以时移和回放,也是不少坑。毕竟不能自动认证,获得的rtsp单播地址将毫无实用性,限于篇幅,下一章开始简介。
技术不断升级,请注意文章时效性。
本站文章,欢迎转发。转载请注明出处:https://www.bandwh.com/net/2571.html

评论列表(1条)
已收录到 https://rtp2httpd.com/reference/related-resources