RouterOS单线实现局域网任意设备看IPTV

发布于 2023-04-01  2494 次阅读



闲来无事折腾一下,自己抓IPTV虽然麻烦,但是速度快,也可以把源丢到Apple TV上彻底把运营商盒子扔掉,自己抓的源很难失效,换台延迟低,而且放送延迟没有超过10秒的,放送延迟很多人不是很重视,但是我们这边经常会地震,所以我个人认为还是很重要的,当然实时的地震预警通知也只是我众多需求的其中之一,我更在乎的是用公开源看球的时候公开源经常3分钟以上的放送延迟,朋友们在群里讨论得热火朝天,这边甚至球都还没进。。。话归正题,IPTV这块在ROS上的使用近乎白板,我在操作之前也搜过很多教程,几乎都是到IGMP Proxy这块就断了,甚至是错误的,然后我按照自己的想法,并参考了很多OpenWrt的教程才融合出了这片文章,操作比较混乱,如果你觉得还有需要优化的地方可以联系我修改。


0x01 前期准备

开始前你需要知道的一些事
  • 光猫的超级管理员密码

  • Wireshark抓包工具

  • 一个支持端口镜像功能的交换机(演示为Netgear GS105E)
    交换机仅做抓包使用,后续网络架构中不会用到,你要是手上没有这种交换机也可以用“Throwing star lan tap”这种四个口的专门用来流量镜像的工具来抓包,淘宝搜的话搜网络抓包神器应该就能搜到,不贵,一个也就10来块的样子。

    0x02 抓包盒子过IPOE认证以及获取IPTV直播源

    这部分其实比较复杂,但是现成的教程很多,如果你实在不想抓包,也可以直接抄盒子的IP使用静态IP接入,但是一个是怕冲突造成不稳定,一个是出现故障不好快速排查。另外请在这个步骤确定你的运营商IPTV是使用IPOE(也就是带认证的DHCP)接入的,我尝试抓过PPPOE的,无法抓到明文密码,如果你是PPPOE接入,那这篇文章对你用处不大。

  • 设置交换机端口镜像功能

    开启端口镜像功能,将1口设置为源端口,并将此端口连接到iptv盒子,二口设置为镜像端口,并将此端口连接到电脑,稍后抓包使用,然后将光猫的IPTV口连接到剩下三个普通端口的任意一个,之后可以先把机顶盒开机一下看看能否正常获取到IP地址,此时只要机顶盒能联网便算是成功了,直播看不了或者看一下就断属于正常情况(交换机没开iGmp Snooping的问题),确认能联网后将机顶盒关机。
    交换机设置


  • 打开Wireshark开始抓包

    选择接入了镜像交换机的网卡后会直接开启抓包,开始后打开机顶盒电源,并尝试观看直播,换几个台,然后机顶盒就可以关机了,你可以把当前抓到的数据保存下来方便之后分析,另外如果你看不到你的网卡,请按照软件内的提示安装npcap后再开启软件进行抓包。

  • 查找DHCP包用于过IPOE认证

    先分析DHCP包,IPOE认证的信息是通过DHCP发送的,这部分可以让我们的ros自动获取IP地址。
    先在上方搜索栏内搜索dhcp,过滤后应该会看到4条数据,选择Request或Discover数据即可查看机顶盒向服务器发送了那些信息用于IPOE认证,dhcp数据包内我们提取到下面三个数据即可,60的数据非常重要,请一定仔细检查,有的地区可能不会验证12和61,请自行验证。
    option12(hostname 注:请在右侧hex窗口复制16进制值)
    option60(Vendor class identifier)
    option61(mac地址)
    以上三个数据保存备用
    抓包分析


  • 分析直播源

    在搜索栏中搜索json,按信息排序,重点看applictio/json,状态码为200 OK的数据。
    源地址分析


    如果你找到了类似数据则说明成功了,将数据复制出来保存备用,如果你没找到类似数据,就再多看几条。
    源地址获取


    如果你觉得上面找直播源的方式太慢,也可以点击左上角的文件选项,选择导出对象---HTTP,按大小(一般源的大小在50K-200K左右)和类型(application/json)筛选并导出所有对象,再用文本编辑器来确认,也可以尝试在搜索栏搜索类似channel、chlist、list等关键词快速定位,但是不同运营商的系统不同,不一定能找得到,找数据还是挺耗时间的。
    分析源


    0x03 光猫设置

    使用超级账户登录光猫,确定VLAN ID,只需要知道上网和IPTV的即可,我这里分别是101和102。
    VLANID


    设置网络端口VLAN让一个口可以同时走ITV和上网的数据,找到你光猫的VLAN绑定设置,不同光猫设置可能不一样,这里我的光猫绑定VLAN对的User对应你刚刚找到的VLAN值,WAN对应等下ROS里需要设置的值,可自行更改,如当我的设置为101/303,102/304时,等下ROS里就需要设置303和304,设置好了以后这个端口即可同时走两个链路的数据了,不用更改已有的端口绑定设置,只在空闲端口上做VLAN绑定,如果出问题可以立马换回原来的端口就能快速恢复,而且如果你的光猫口比较多的话这么做可以在不影响原IPTV功能的情况下还能继续在局域网内观看,也省了路由器一个口。当然你说你是千兆宽带,有强迫症,怕同时走IPTV造成宽带跑不满你也可以分别绑定VLAN到不同端口,路由器也插两条线分别走数据也行。
    VLAN设置


    0x04 ROS的设置

    现在准备好刚刚拿到的IPOE数据和VLAN ID,ROS需要开启IGMP Proxy和Container容器功能,这部分请自行百度,教程很多而且很简单。

  • VLAN接入

    新建两条VLAN,分别对应上网和IPTV

    # 命令格式
    /interface/vlan/add interface=你网线连接的网口 name=随意 vlan-id=光猫设置的WAN VLAN
    /interface/vlan/add interface=WAN name=VWAN vlan-id=101
    /interface/vlan/add interface=WAN name=VITV vlan-id=102
  • 互联网接入

    这部分没什么好说的,只需要将pppoe连接建立在上面设置的VLAN接口上就行了,如果你有多拨之类的,也是同样道理把VRRP建立在VLAN接口上就行。

  • IPTV接入

    首先在dhcp-client中新建我们刚刚抓到的option值。你可以在mac值和hostname值里加一定量的偏移,以免和自己本身的机顶盒ip冲突,比如把最后一位从1改到2之类的,但是option60的值别动。

    # options12
    /ip/dhcp-client/option/add name=itv-hostname code=12 value=0x你抓到的数据
    # option60
    /ip/dhcp-client/option/add name=itv-vid code=60 value=0x你抓到的数据
    # option61
    /ip/dhcp-client/option/add name=itv-mac code=61 value=0x你抓到的数据

    然后新建一个dhcp-client获取观看iptv需要的ip,命令参数请按自己实际修改。如果你按照下面设置了却不能获取到ip那可能是运营商鉴权mac没过,因为VLAN接口是没办法直接改MAC的,你可以把VLAN加入桥接用网桥更改MAC地址,并把dhcp-client建立在网桥上即可。

    # dhcp建立命令
    /ip/dhcp-client/add interface=VITV use-peer-dns=no use-peer-ntp=no add-default-route=no dhcp-options=itv-hostname,itv-vid,itv-mac
    # 网桥建立命令,如果你上面建立DHCP直接获取到ip了就跳过这步
    # 如果要进行这一步记得更改上面dhcp建立命令里的interface值
    # 把原先的VLAN接口改为下面新建的网桥接口即可。
    /interface/bridge/add name=ITV-Br admin-mac=mac值
    # 将IPTV的VALN接口加入网桥
    /interface/bridge/port/add interface=VITV bridge=ITV-Br
  • Ciontainer的设置

    前面已经提到过需要提前开启Container功能,到这里默认你们已经安装好了该功能,我们需要拉取udpxy或者msd_lite的镜像,两个程序各有优劣,udpxy的优势是提供了一个简单的web界面可以查看当前有多少条数据流转换,但是不支持ipv6,msd_lite速度更快且支持ipv6(可以做ddns解析让你在外面也能方便的直接使用直播源),下面的教程我将主要以msd_lite做演示,两个容器都不需要额外环境配置,直接可以开启使用。要是你们地区网络不太好镜像拉取不下来的话可以手动上传镜像包到ros内手动启动容器。
    msd_lite镜像和二进制包:

    Github

    udpxy镜像:tinyserve/udpxy

    # 拉取命令(需要udpxy的请自己替换命令中对应值)
    /container/add remote-image=tinyserve/msd_lite interface=veth1 start-on-boot=yes
    # 开启容器 number值自行替换你的容器,要是你之前没新建过其他容器那这个值就是0
    /container/start number=0
    # 查看容器状态,status=running就是正常运行了
    /container/print
  • IGMP Proxy的设置

    到这里ros的设置基本结束了,下面就是整理IPTV源和观看了

    # 将刚刚获取到了IP的IPTV接口设置为上行接口
    /routing/igmp-proxy/interface/add interface=VITV upstream=yes alternative-subnets=0.0.0/0
    # 将容器网桥设置为下行接口
    /routing/igmp-proxy/interface/add interface=Container-Br

    0x05 IPTV源的整理和使用

    接上面获取到的iptv源数据,我获取到的数据样本整理后得到类似数据,我们提取name和livePlayUrl即可

    {"uuid":
    "ysten-cctv-1","name":"CCTV-1","num":"1",
    "livePlayUrl":"rtp://@239.11.0.65:5140?ChannelFCCPort=8027&ChannelFCCIP=183.223.164.65&channelFECPort=5142",
    "multicastUrl":"rtp://@239.11.0.65:5140?ChannelFECPort=5142&ChannelFCCPort=8027&ChannelFCCIP=183.223.164.65",
    "actionType":"cctv","isSupportThumbnail":"false","channelFlag":null,"isShowBack":1,"isSupportAction":1,"isReport":1,"isContinuePlay":0,"noPlayIsStop":1,"isCumulativeDuration":0,"isCollect":1,
    "defaultResolution":"标清",  
    "resolution":[
    {"uuid":
    "ysten-cctv-1","name":"标清",
    "url":"rtp://@239.11.0.65:5140?ChannelFCCPort=8027&ChannelFCCIP=183.223.164.65&channelFECPort=5142",
    "multicastUrl":"rtp://@239.11.0.65:5140?ChannelFECPort=5142&ChannelFCCPort=8027&ChannelFCCIP=183.223.164.65",
    "backPlayUrl":null,
    "timeShiftAlias":"rtsp://223.87.18.62:1556/11111111/ch19052405404444840887",
    "timeShiftRule":"sczx","weight":2,"trialLength":null,"trialTimes":null,"corner":null,"ppvList":null,"trialTip":null,"compareImgUrl":null,"isShield":0,"shieldCycle":null,"trialCycle":null,"trialTipDelay":null,"poster":[]}]},

    将获取到的源数据整理为以下格式保存为TXT就可以在局域网内用potplayer或者其他播放器直接播放或者用网上公开的EPG转换器转换为m3u格式添加台标了

    # msd_lite使用格式
    CCTV1,http://你的容器ip地址:7088/udp/239.11.0.65:5140
    CCTV2,http://172.16.5.1:7088/udp/239.11.0.65:5140
    # udpxy使用格式
    CCTV1,http://你的容器ip地址:4022/udp/239.11.0.65:5140
    CCTV2,http://172.16.5.1:4022/udp/239.11.0.65:5140
    # 查看udpxy状态
    http://172.16.5.1:4022/status

    0x06 放一些使用效果