华硕路由器实现iptv组播转单播和单线复用

/ mess

想要组播转单播通过外网播放iptv和路由器下设备wifi看iptv,同时保证iptv盒子的正常使用。

环境

运营商

不同地区的运营商的iptv鉴权方式不一样,我这里是成都电信,采用的是dhcp方式验证,可以参考 这里 了解鉴权相关东西。

这篇文章都是基于成都电信,光猫型号:HS8145V,且已经修改光猫为桥接。
其他地区和运营商可以网上查找下有人分享过iptv相关的东西没。
如果没有那就比较麻烦了,需要自己去抓包验证。

路由器

GT-AC5300

理论上大部分华硕的路由器都支持iptv功能,中高端路由器都有双拨功能,这就满足了单线复用和组播转单播功能,不需要额外的设备。

准备

光猫里vlan 43用于iptv,1173用于pppoe拨号上网,用于iptv的43是无法修改的,且绑定了itv口,所以没法通过绑定端口来实现多口itv了,只能通过vlan绑定的方式。

vlan绑定需要获取光猫超级管理员密码,可以参考 这里 进行获取。
光猫登陆时候只要有超级密码不用看用户名,登陆进去就是超管。

单线复用

VLAN 绑定

用超管进入光猫管理页面:网络 - VLAN绑定 。路由器的第一wan口接入的是光猫千兆口1上网,按照如下进行绑定:

用户侧端口用户侧VLANWAN侧VLAN
千兆口14343
千兆口111731173
其实就是将VLAN 43和VLAN 1173都绑定到千兆口1上。

路由器iptv设置

进入设置 内部网络 - iptv 将iptv配置到路由器 lan5/lan6 lan1和lan2需要配置第二wan。

选择ISP设置档,手动配置。

互联网VLAN设置为1173,优先级(PRIO)和光猫上的优先级(802.1p)一致都是 0;
LAN 5 VLAN设置为43,优先级(PRIO)也和光猫保持一致:3;
这里的设置保存之后路由器会重启。

这样lan5口就可以直接插上iptv盒子了,同时光猫的itv口也空出来给下面的组播转单播配置。

组播转单播

很多华硕路由器其实是支持udpxy的,就在iptv配置页面的下方,但是我们不在这里配置,因为这里的udpxy不和上面的iptv功能兼容。同时udpxy配置也是只能设置端口,默认绑定eth0网口,但是我们的第二wan口lan1对应的接口是eth2。

配置第二wan口

路由器主wan口保持原有的pppoe拨号上网不变动,开启双线路:外部网络 - 双线路 - 开启
首选是wan保持不变,第二wan选择lan1口,双线路模式选择负载均衡,然后开启路由规则,将路由器子网ip流量全部转到第一wan口,毕竟第二wan口是没法联网的。

连接路由器lan1口与光猫itv口,进入外部网络,配置第二wan口,选择动态ip。

在这个 分享 里提到,需要配置dhcp的option60和61用于鉴权,成都电信60的值是固定 SCITV,61是iptv盒子的mac地址。其他配置保持默认即可。

我这里实测,两个都填上其实还是不能获取到正确的iptv内网ip(10开头),需要在上面配置页面最下面设置mac地址,不要点击获取计算机mac地址,那个获取的是路由器的,这里手动填写电视盒子的mac地址(盒子背面可以看到)。

所以最终要的是伪装设备的mac地址进行鉴权。

保存之后ssh进入路由器就可以看到eth2口的地址已经获取到了,10.x.x.x 的内网地址,获取失败则是光猫的内网地址,192.169.1.x

但是这样会出现iptv盒子间歇性的卡初始化进度条,很奇怪(后面会说明为啥)。

华硕路由器那个物理lan口和内部网络接口的对应关系我是真没看明白,lan1对应的是eth2,wan和lan1-lan8,eth0-eth8。

udpxy

华硕路由器的udpxy执行程序位于 /usr/sbin/udpxy

1
/usr/sbin/udpxy -m eth2 -p 8686 -B 65536 -c 8 -a br0

运行之后就可以访问 http://192.168.50.1:8686/status 看到udpxy状态了,注意 Multicast addres 是第二wan获取到10开头的内网ip。

路由器固件是华硕官改,这款不支持梅林,创建udpxy开机启动脚本 /jffs/scripts/init-start ,加入上面的启动命令。

后面测试过程中发现udpxy进程反复被杀掉,且开机启动脚本也没执行,排查半天没找到原因,最后还是路由器双清重置搞定。

组播地址和节目单

组播地址可以自己抓包,如果网上有人分享就更简单了,成都电信 这里 有人进行分享,所以直接用就行。
比如CCTV1的组播地址是 239.93.0.58:5140 ,那么播放地址就是 http://192.168.50.1:8686/rtp/239.93.0.58:5140 ,这个地址可以用各种播放器直接进行播放。再起个代理转发路由器udpxy服务,外网也能看。

这个站点站长也提供了台标匹配和节目单,直接写个脚本生成m3u播放列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 获取节目列表
curl "http://epg.51zmt.top:8000/e.xml" -o tv.xml
# 获取组播源
curl "http://epg.51zmt.top:8000/sctvmulticast.html" -o playlist-source.html

# 解析html并输出简单的播放列表
awk '/<tr class="odd">/ || /<tr class="even">/ {

while($0 !~ /<\/tr>/) {
        if($0 ~ /<td[^>]*>(.*)<\/td>/){
            count++
            if(count == 2 || count ==3) {
            match($1, />(.*)</, a);
            td[count] = a[1]
            }
        }
        getline
    }
printf "#EXTINF:-1 tvg-name=\"%s\",%s\nhttp://192.168.50.1:8686/rtp/%s\n", td[2], td[2], td[3]
    count=0
   
}' playlist-source.html \

| sed '1i #EXTM3U' > playlist-origin.m3u

# 上传播放列表匹配台标
curl -X POST -F "myfile=@playlist-origin.m3u;type='multipart/form-data'" \
"http://epg.51zmt.top:8000/api/upload/" -o upload-result.html

# 解析匹配好台标之后的文件下载地址
download_path=$(awk -F 'href="' '{print $2}' upload-result.html | awk -F '"' '{print $1}')

if [[ -n "$download_path" ]]; then
curl "$download_path" -o playlist.m3u
echo "更新iptv成功!"
else
echo "未从上传结果中获取到下载地址!"
fi

Emby配置

emby配置就很简单了,在 设置 - 电视直播 里进行配置,电视源就是m3u播放列表文件,指南数据源就是上面的 tv.xml 节目单。

注意如果是emby网页端播放直播,一定要开启位于每个用户设置里的转码,不然浏览器没法兼容有些直播流,用客户端就没有这些问题。

这样,电视盒子和组播都能正常使用,路由器下wifi用户也能使用各种播放器打开上面的m3u播放列表。

后续

经过反复的测试和折腾,发现:

成都电信只要把光猫上的接入设备修改和盒子拨号之后获取到的同一个IP段就能正常用udpxy转单播看直播了,盒子的鉴权方式只用于获取iptv内部ip,但看直播本身是没有任何鉴权的。

最终解法

上面配置主要是省了一个udpxy的设备,如果路由器不支持双wan或者udpxy那么就需要额外一个设备。

总结:纯瞎折腾

年后更新

家里换了千兆(家里都是千兆网口的设备,跑不满,嗅到了折腾的味道),同时也解决了光信号弱的问题,接到电线杆子的光纤信号灯直接红了,难怪。

和上门小哥聊了挺久,获取到不少信息:

中间调试的时候发现了一个华硕路由器非常坑的地方,在 系统管理 - 系统设置 - 开启 WAN 中断的浏览器导页通知 这个配置是默认开启的,也就是说当你的路由器wan口没有互联网连接时,访问路由器就会跳转到配置网络的导航页,哪怕你是访问的光猫。刚好新的2.5g猫没有wifi,装维师傅想连路由器Wi-Fi去配置光猫,结果就到了路由器页面。

一个非常奇怪的问题

群晖和路由器都是挂在光猫下各自拨号上网,群晖第二个网口(固定了ip)接入路由器给路由器下设备访问。
群晖网络服务顺序是 拨号 - 路由器 - 光猫
群晖配置了ddns域名,在路由器下的设备无法访问群晖的ddns域名,也无法访问群晖获取到的公网ip。
设备配置host将ddns域名指向群晖在路由器下的固定ip,能够正常访问群晖。

排查:

这个问题一直没解决,等后续有时间了再排查。