上海电信 IPTV通过 Hyper-V OpenWrt 转 HTTP 单播实践

前言

家里的主路由已经承担了所有上网功能,但我希望能够在电脑、手机、平板、安卓电视 等设备上直接观看上海电信 IPTV 直播频道,而不依赖运营商机顶盒。

因此搭建了一台专门负责 IPTV 转发的 OpenWrt 虚拟机:

需要特别说明:

本文方案不是为了让主路由后面继续连接运营商原机顶盒,而是为了将 IPTV 组播流转换成 HTTP 单播流,供局域网内各种播放器直接访问。

因此:

  • 不需要使用电信给的机顶盒
  • 不需要机顶盒认证(添加DHCP Option)
  • 不需要 IGMP Snooping
  • 不需要 IGMP Proxy
  • 不需要 VLAN51

一、虚拟化环境

宿主机

  • Windows 10
  • Hyper-V

虚拟机

  • OpenWrt 25 (Immortalwrt),虚拟机名称我设为iptv。
  • 两个网卡配置两个虚拟交换机,一个作为lan口(eth0)连接主路由(192.168.2.0),一个作为wan口(eth1)连接光猫。wan口的虚拟交换机直通给openwrt(选择External Switch),以免影响宿主机上网。

Hyper-V 网卡 VLAN 配置Trunk模式

  • 宿主机在Powershell中更改wan口网卡的设置
Set-VMNetworkAdapterVlan -VMName "iptv" -VMNetworkAdapterName "网络适配器" -Trunk -NativeVlanId 0 -AllowedVlanIdList "1-4094"

二、OpenWrt 网络配置

/etc/config/network的配置如下。完成配置后,IPTV85接口即可通过dhcp获得获得类似30.x.x.x的 IPTV 地址。

config device
    option name 'br-lan'
    option type 'bridge'
    list ports 'eth0'

config interface 'lan'
    option device 'br-lan'
    option proto 'static'
    option ipaddr '192.168.2.8'
    option netmask '255.255.255.0'

config device
    option type '8021q'
    option ifname 'eth1'
    option vid '85'
    option name 'eth1.85'

config interface 'IPTV85'
    option proto 'dhcp'
    option device 'eth1.85'

config device
    option name 'eth1'
    option ipv6 '0'

config interface 'wan'
       option device 'eth1'
       option proto 'dhcp'
       option defaultroute '0'
       option peerdns '0'

为什么不配置 LAN 网关

曾经尝试:

config interface 'lan'
    option gateway '192.168.2.1'

结果IPTV 无法播放。原因是 Linux 默认路由影响了 IPTV 流量选择。

因此最终方案:

LAN 不配置默认网关,OpenWrt 仅承担 IPTV 转发职责。在这种方案下openwrt是无法上网并update opkg的,如果需要安装插件,先把gateway加回去。

通过配置网关跃点值可以解决上网问题,但是我没有继续尝试。

三、防火墙配置

由于 OpenWrt 不承担路由功能,因此防火墙可以极度简化,甚至可以直接关闭防火墙。

创建 IPTV85 区域:

config zone
    option name 'iptv'
    list network 'IPTV85'
    option input ACCEPT
    option output ACCEPT
    option forward ACCEPT

允许IPTV85 → LAN即可,不需要 NAT,不需要 Masquerade。

四、为什么不需要 IGMP Proxy

网上大量教程都会配置igmpproxy

但经过实际验证:

停止 igmpproxy后,频道仍然可以正常播放。

因此,HTTP 单播方案下,igmpproxy 完全没有作用,最终直接卸载。

五、为什么不需要 VLAN51

很多上海电信 IPTV 教程会同时配置VLAN51和VLAN85。

实际抓包:

tcpdump -i eth1.51 udp

结果:

0 packets captured

而:

tcpdump -i eth1.85 udp

可以看到大量233.x.x.x:5140组播流量。

因此在当前地区和当前光猫配置下,VLAN85 即可满足 IPTV 播放,VLAN51 未发现实际用途。

六、使用 msd_lite 代替 udpxy

最初采用udpxy。

虽然可以播放:

http://192.168.2.8:4022/udp/233.x.x.x:5140

但对于高码率频道支持一般。

最终改为msd_lite,播放4k频道时明显更流畅。

msd_lite的设置页面,只需更改绑定地址(我的设置为0.0.0.0:4022),源接口IPTV85。

七、Hyper-V 关键优化

设置好以上内容,即可实现播放,但是会有明显的卡顿。

经过排查,发现问题全部来自 Hyper-V 网卡卸载功能。

因此需要做以下优化设置:

Hyper-V 的wan口虚拟网卡:

  • Virtual Machine Queue (VMQ),设置Disabled

宿主机wan口物理网卡:

  • 关闭 Large Send Offload v2 (IPv4)
  • 关闭 UDP Checksum Offload
  • 关闭TCP Checksum Offload

参考资料

本次实践完全通过和Chatgpt共同探索完成,blog也是在完成后直接生成。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>