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

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

  •  1
     
  •   jsq2627 · 2023-09-07 18:09:14 +08:00 · 6415 次点击
    这是一个创建于 378 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    正因为 openwrt 没有简易直观的 DMZ 设置,迫使我抓包找到了我要的目标端口 😂
    lqzhgood
        3
    lqzhgood  
       2023-09-07 18:57:05 +08:00
    openwrt DMZ 你试试这样设置可以不?
    https://smms.app/image/JwNSmIscl4C3jb2

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

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

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

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

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

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

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

    FCC 不是标准协议,估计很难有 app 主动去实现。
    rebecca554owen
        35
    rebecca554owen  
       2023-09-09 09:44:34 +08:00 via Android
    移动的魔百盒用网络就可以直接看。
    jsq2627
        36
    jsq2627  
    OP
       2023-09-10 15:32:39 +08:00
    @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  
       2023-09-14 15:05:18 +08:00 via iPhone
    这个和 udpxy 有什么区别吗,还有能把那个插件弄到 op 软件包里吗。
    jsq2627
        38
    jsq2627  
    OP
       2023-09-14 17:58:06 +08:00 via iPhone
    @Rinndy 有 FCC 服务器时可以快速换台,效果见 github 里的视频
    暂时仅供高阶玩家自行交叉编译跑在 openwrt 上
    Rinndy
        39
    Rinndy  
       2023-09-15 11:32:42 +08:00 via iPhone
    @jsq2627 我抓包没看到哪个是 fcc 地址。。
    cpstar
        40
    cpstar  
       2023-09-15 22:34:04 +08:00
    折腾了半天,igmp 也没有转发进来。也就是方法 5 没有搞定。不知道哪里该怎么搞
    jsq2627
        41
    jsq2627  
    OP
       2023-09-16 04:30:20 +08:00 via iPhone
    l123456789jy
        42
    l123456789jy  
       314 天前
    现在的路由都支持,IPTV 口了 ,根本没这么麻烦,教程地址:
    pensz
        43
    pensz  
       271 天前
    @l123456789jy 请教下,这个原理是什么呢,iptv 和上网的流量都没有 vlan tag ,路由器和光猫是怎么区分这个流量的呢。
    l123456789jy
        44
    l123456789jy  
       212 天前
    @pensz 小米这款路由支持自动识别 iptv ,还有光猫其实一直是网络和 iptv 都是一起发送的,并不区分网口。
    ttizard
        45
    ttizard  
       171 天前
    @jsq2627 大佬直播源好像无效了不?
    ttizard
        46
    ttizard  
       170 天前
    重启 IGMP 故障排除又可以用了,直播源没问题~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4887 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 03:47 · PVG 11:47 · LAX 20:47 · JFK 23:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.