V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jsq2627
V2EX  ›  宽带症候群

把 IPTV 和宽带融合到同一个 LAN,一些心得

  •  1
     
  •   jsq2627 · 233 天前 · 5146 次点击
    这是一个创建于 233 天前的主题,其中的信息可能已经有所发展或是发生改变。

    众所周知 IPTV 因为是一个独立网络,会给家里网络布线带来一些不便。例如很多人家里弱电箱到客厅只有一根网线,如果想要光猫放弱电箱,IPTV 、路由器、游戏机等放客厅,那么就会有麻烦。一般常用方式要不是把一根 8 芯网线分成两根 4 芯降速到 100M 跑,要不是用带有 VLAN 管理的交换机实现单线复用。

    这里我提供另一个思路,即把 IPTV 网和宽带网同时接入到主路由器上,然后用静态路由来分流。这个方案好处是不再依赖 VLAN ,因为很多家用路由器不支持 VLAN 管理; IPTV 盒子随意接到家里任何一个网口上都可以使用。

    其实思路很简单,但是有一些坑,特别是涉及组播相关。下面以我所在地 海南电信 为例。

    我的网络拓扑很简单:

    光猫 <--> 主路由器 <--> AP

    其中主路由器是 x86 软路由,安装了原版 openwrt 。AP 是市面上常见的家用 mesh 路由器,我的是华硕系列。光猫桥接模式,主路由拨号上网。

    通过前期的抓包分析,我已经知道:

    • 我的 IPTV DHCP 无需认证,可以直接获得 10.254.0.0/19 下的地址,默认网关是 10.254.0.1
    • IPTV DHCP 下发的 DNS 和宽带网是一样的地址,DNS 是一个普通省内公网 IP 。经过测试在 IPTV 网络下,DNS 并无任何特殊解析行为。
    • IPTV 盒子访问的所有 IPTV 网内资源都处于 10.39.0.0/16 和 10.255.0.0/16 这两个网段下
    • IPTV 盒子也偶尔会访问一小部分公网资源,经过测试这部分公网资源在普通宽带网下面也可以正常访问,并不专属于 IPTV 网
    • IPTV 盒子的直播都是走的 IGMP 组播。这些组播源我已经都抓出来整理好了,分享在了这里
    • IPTV 盒子每次切换频道时都是秒切,几乎无等待,体验丝滑。而众所周知如果使用 IGMP 组播的话,因为要等待 I 帧到达,换台没有这么快速。分析发现使用了名为 Fast Channel Change (FCC) 的技术,在每次换台时,盒子会先向 FCC 服务器请求单播流,这个单播流因为是以 I 帧开头,所以立即可以解码播放。等 FCC 服务器认为时机合适的时候,会告知盒子无缝切换到组播流上继续解码。

    有了上面这些抓包分析之后,配置方法就明确了:

    1. 从光猫连两根网线到主路由,一根属于宽带,一根属于 IPTV (连接光猫 iTV 口)。理论上这里也可以通过 VLAN 简化成一根网线,但是我没有光猫超级密码,不想折腾了。
    2. 在主路由配置两个 WAN ,WAN1 属于宽带,通过 PPPoE 拨号获取 IP 。WAN2 属于 IPTV ,通过 DHCP 获取 IP 。WAN1/WAN2 同属于同一个防火墙 zone 下面。把 WAN2 的默认网关和自动获取 DNS 选项关闭。
    3. 在主路由上配置两条静态路由:10.39.0.0/16 via 10.254.0.1 dev wan2 和 10.255.0.0/16 via 10.254.0.1 dev wan2
    4. 此时把 IPTV 盒子通过网线接到主路由或者任意 AP 下面,发现已经可以通过开机认证并且显示主界面了。只是不能播放直播频道。
    5. 这是因为我们还没有解决 IGMP 组播转发问题。对于 openwrt ,需要安装 omcproxy 和 luci-app-omcproxy 。omcproxy 的上行链路设置为 wan2 ,下行链路设置为 lan 。
    6. 此时 IPTV 盒子已经可以播放直播频道。任意电脑连接网线接入家庭局域网后,也可以用本地播放器直接播放上面我整理好的 RTP 组播地址。
    7. 但是发现 IPTV 盒子切换频道非常慢,每次换台需要等待 3-5 秒。如果 IPTV 盒子直接接入光猫,可以秒换台,很丝滑。看来 FCC 机制没有生效。
    8. 在主路由添加一条端口转发规则:将从 wan2 入站的 UDP 20000-21000 端口转发到 IPTV 盒子上。
    9. IPTV 盒子切换频道重新变得丝滑起来,秒切无卡顿。原因是当 FCC 服务器返回单播流时,是用一个新端口直接给盒子的 20000-21000 的某个随机端口打流,因此必须开启端口转发来放行

    关于 FCC 的这部分我找了很多资料,过去应该很少有人提到过它。我折腾了很久,反复抓包对比才发现它的工作方式类似 FTP 主动模式,需要在防火墙上开端口映射才行。希望大家点个赞。

    目前还有一个遗留问题,是 DHCP 获取的地址,1-2 天后会失效且不会自动重新获取。猜测有某种保活机制,但是我还没有逆向出来。现在我的应对办法是在路由器上通过脚本定期重启 wan2 interface 和 omcproxy 。

    第 1 条附言  ·  230 天前
    我尝试实现了一下 FCC 协议
    https://github.com/stackia/rtp2httpd
    如果你能抓到自己本地的 FCC 服务器地址,可以用这个东西取代 udpxy 把组播转单播
    第 2 条附言  ·  229 天前
    用上面这个支持 FCC 的 rtp2httpd 的话,那就不用端口转发了,已经自动处理了 NAT 打洞。
    46 条回复    2024-04-03 08:34:35 +08:00
    lqzhgood
        1
    lqzhgood  
       233 天前
    看起来 wan2 --DMZ--> 机顶盒 可以完全解决端口问题~ 免得机顶盒还有什么奇怪的交互~
    jsq2627
        2
    jsq2627  
    OP
       233 天前
    @lqzhgood 是的,我抓包甚至看到有 STUN 协议相关的交互,只是 STUN 协商跑一半就终止了,估计厂商根本没想到有人会把盒子放到 NAT 之后,没有测试打洞流程。

    正因为 openwrt 没有简易直观的 DMZ 设置,迫使我抓包找到了我要的目标端口 😂
    lqzhgood
        3
    lqzhgood  
       233 天前
    openwrt DMZ 你试试这样设置可以不?
    https://smms.app/image/JwNSmIscl4C3jb2

    不过我不知道源区域 你的 wan1 和 wan2 能不能分开选择
    jsq2627
        4
    jsq2627  
    OP
       233 天前
    @lqzhgood 我的 luci ui 上提示“外部端口”必填。不过直接改 /etc/config 下的配置是应该可以做到,我搜索到的资料有人这样能成功

    其实我自己是把 wan1 wan2 分成了 2 个防火墙 zone ,上文为了简化描述才把他两放同一个 zone 。
    lqzhgood
        5
    lqzhgood  
       233 天前
    如果从 机顶盒的通讯 是个黑盒且变化的角度考虑~

    主路由单 wan 接外网,IPTV 接入主路由 lan 口,也可以让机顶盒插任意网口看电视,相当于
    机顶盒 ---> 主路由-交换机 ---> 光猫 IPTV

    这样只要解决 主路由-交换机 存在两个 DHCP 的问题。
    如果主路由通过 ARP MAC 绑定家里设备 IP ,关闭 DHCP 对其他设备的分配,就能让机顶盒获取到 IPTV DHCP

    这样只要麻烦一次(绑定家里全部设备 IP ),但是可以保证机顶盒不会出问题(没有 NAT ,相当于交换机直连了)
    jsq2627
        6
    jsq2627  
    OP
       233 天前
    @lqzhgood 这样也有缺点,把整个家里的二层网络桥接到 IPTV 大网下了,有严重的安全问题

    我在 IPTV 接口上抓包的时候,确实看到很多奇奇怪怪的 ARP 请求,估计这样用的人不在少数 :doge:
    fish3125
        7
    fish3125  
       233 天前 via iPhone
    我这边现在不用这么麻烦,福建电信是走 pppoe,验证信息在盒子上,把这个盒子拿到其他地方有网络也可以看。
    jsq2627
        8
    jsq2627  
    OP
       233 天前
    @fish3125 各个地区确实有差异。
    我曾经在广州电信实验过,IPTV 盒子接入到普通宽带网下面都可以正常播放,但是不再是走组播,而是普通单播。其实这时候它和其他 OTT 盒子已经没有任何区别了。当时电信给我的 IPTV 盒子都自带 WIFI 功能,用 WIFI 连接家里网络后,一样可以观看。
    海南电信就不行,抓出来直播源只有组播地址,没有 RTSP 单播地址。盒子也只能接入到 IPTV 专网下才能用,也没有 WIFI 能力(组播和 WIFI 天生势不两立)。
    0ranger
        9
    0ranger  
       233 天前
    最近也打算弄 iptv ,但是到客厅只有一条网线,而且已经插了路由器。关于玩 iptv 有比较系统些的教程文章推荐吗
    xiaozecn
        10
    xiaozecn  
       233 天前 via Android
    我这便宜路由器打开 IPTV 功能,光猫拨号,设置好。家里其他联网设备都可以用组播了。手机,平板,电视,电脑都行了,VLC 可以串流,Kodi 装电视上方便。
    hanguofu
        11
    hanguofu  
       233 天前
    谢谢分享宝贵经验~ 顺便问问 : 没有光猫超级密码 也可以把光猫 设置为 桥接 模式吗 ?
    465456
        12
    465456  
       233 天前
    https://github.com/ruur/cmcc-iptv 网上教程一大把,现在新的路由器都有 iptv 功能,没有就刷 openwrt 吧
    sunulin
        13
    sunulin  
       233 天前 via iPhone
    前几天还想这个,我这主路由器是 ikuai ,也可以通过光猫把两条线查到 ikuai 上实现
    youx
        14
    youx  
       233 天前
    武汉电信 有这个业务 叫一线同传,
    ochatokori
        15
    ochatokori  
       233 天前 via Android
    @jsq2627 #8 广州的之前是可以这样,只要盒子随便连个网络就可以了,iptv 走公网。现在都要求 iptv 盒子拨号,不给走公网了
    HOOC
        16
    HOOC  
       232 天前 via Android
    我父母家情况和楼主类似,我是 wan1 双拨宽带,wan2 拨 iptv ,盒子 dmz 和全走 wan2 ,内网设备访问单播网段时走 wan2 ,我这边已经没有组播了,只有单播,且单播地址有效期是 1 个月,所以我又根据 V2EX 上老哥给出的方法写了个 python 脚本自动抓单播源。
    jcxq5200
        17
    jcxq5200  
       232 天前 via iPhone
    我现在都是用的 ipv6 直播源
    MeteorVIP
        18
    MeteorVIP  
       232 天前 via iPhone
    @jcxq5200 #17 具体分享一下~是你家的直播源?还是网上找的?
    lcy630409
        19
    lcy630409  
       232 天前
    武汉电信 直接粗暴的解决
    把光猫的 iptv 的 lan 直接接在路由的 lan 上,关闭光猫里 iptv 口的 dhcp ,电视盒子 选择 pppoe 拨号解决
    lookookok
        20
    lookookok  
       232 天前
    lan 中使用了傻瓜交换机,组播过来时候会不会泛洪?
    planenalp
        21
    planenalp  
       232 天前
    电力猫猫
    FightPig
        22
    FightPig  
       232 天前
    刷了 op 后很简单的,可能和地区有关,我设置了固定 ip ,一直没改过,一直用
    TerraNova
        23
    TerraNova  
       232 天前
    @lcy630409 这样双播的方式会影响带宽吗
    lcy630409
        24
    lcy630409  
       232 天前
    @TerraNova 不会,路由这一层会拦截 pppoe 的协议,去不了上网的口,出口只能在 iptv 的口了
    persistpot
        25
    persistpot  
       232 天前
    iptv 这个东西该淘汰了吧,直接在线看视频不好吗?整这么复杂
    YGBlvcAK
        26
    YGBlvcAK  
       232 天前
    有支持 FCC 的 iptv app 吗?
    xhcnb
        27
    xhcnb  
       232 天前
    @persistpot #25 一是电视台直播, 一是电视台节目回看, 这两个功能我家是刚需, IPTV 还是有存在意义的, 而且每月只要 10 块钱, 还没有广告, 比那些视频 app 良心多了
    txydhr
        28
    txydhr  
       232 天前 via iPhone
    @0ranger 最简单的就是网管交换机
    JensenQian
        29
    JensenQian  
       232 天前 via Android
    我自己抓了下,我这移动,我疫情前的抓的,他现在还能用,不过家里现在也没人看电视
    lyu594
        30
    lyu594  
       232 天前
    软硬通吃!路由器 IPTV 革新设置指南 https://www.bilibili.com/video/BV1524y1h7Wq/?share_source=copy_web&vd_source=cf341dfb1428d1a989240363afd9cb28

    我是广西电信,用的这个 up 主的方案实现的,我折腾了才知道 iptv 能单播和组播,需要光猫 vlan 设置对了才行。

    我电视盒子直接连光猫,测过换台速度,比广电还快,不知道这个 FCC 功能是不是内置在电视盒子(TY1608),我用 potplayer 播放就要缓冲 3 秒左右。
    jsq2627
        31
    jsq2627  
    OP
       232 天前 via iPhone
    @lcy630409 这运营商是个很好的解决办法。

    现在很多地方做 IPoE 改造,为了兼容桥接的路由器,也采用了同样的办法:光猫充当 PPPoE server ,兼容了路由器的拨号行为。
    huihuilang
        32
    huihuilang  
       232 天前 via Android
    我觉得最麻烦的不是网线,而是光猫改桥接了 iptv 用不了了,不知道怎么解决
    jsq2627
        33
    jsq2627  
    OP
       232 天前 via iPhone
    @lookookok 要看交换机是否支持 IGMP snooping 了。傻瓜交换机没有标明的话很难区分。
    jsq2627
        34
    jsq2627  
    OP
       232 天前 via iPhone
    @YGBlvcAK 我也在找,但是目前没有找到

    FCC 不是标准协议,估计很难有 app 主动去实现。
    rebecca554owen
        35
    rebecca554owen  
       231 天前 via Android
    移动的魔百盒用网络就可以直接看。
    jsq2627
        36
    jsq2627  
    OP
       230 天前
    @YGBlvcAK
    @lyu594

    我今天在 rtp2httpd 上魔改了下,增加了 FCC 的实现
    https://github.com/stackia/rtp2httpd

    rtp2httpd 和 udpxy 类似,是一个组播转单播流工具
    可以用类似这样 http://10.0.0.2:5140/rtp/239.253.64.120:5140?fcc=10.255.14.152:15970 的 URL 作为播放地址,将能够从 FCC 服务器上拉取单播流来加速初始播放。具体 fcc 地址要自己从所在地 iptv 上抓包了
    Rinndy
        37
    Rinndy  
       226 天前 via iPhone
    这个和 udpxy 有什么区别吗,还有能把那个插件弄到 op 软件包里吗。
    jsq2627
        38
    jsq2627  
    OP
       226 天前 via iPhone
    @Rinndy 有 FCC 服务器时可以快速换台,效果见 github 里的视频
    暂时仅供高阶玩家自行交叉编译跑在 openwrt 上
    Rinndy
        39
    Rinndy  
       225 天前 via iPhone
    @jsq2627 我抓包没看到哪个是 fcc 地址。。
    cpstar
        40
    cpstar  
       224 天前
    折腾了半天,igmp 也没有转发进来。也就是方法 5 没有搞定。不知道哪里该怎么搞
    jsq2627
        41
    jsq2627  
    OP
       224 天前 via iPhone
    l123456789jy
        42
    l123456789jy  
       169 天前
    现在的路由都支持,IPTV 口了 ,根本没这么麻烦,教程地址:
    pensz
        43
    pensz  
       126 天前
    @l123456789jy 请教下,这个原理是什么呢,iptv 和上网的流量都没有 vlan tag ,路由器和光猫是怎么区分这个流量的呢。
    l123456789jy
        44
    l123456789jy  
       67 天前
    @pensz 小米这款路由支持自动识别 iptv ,还有光猫其实一直是网络和 iptv 都是一起发送的,并不区分网口。
    ttizard
        45
    ttizard  
       25 天前
    @jsq2627 大佬直播源好像无效了不?
    ttizard
        46
    ttizard  
       24 天前
    重启 IGMP 故障排除又可以用了,直播源没问题~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3000 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 14:00 · PVG 22:00 · LAX 07:00 · JFK 10:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.