单线融合IPTV到家庭局域网最简单的方法:路由+桥接混合模式

以北京联通为例。同时也兼容VLAN绑定或双网线物理端口绑定的情况。

目录

前言

注意,你应该用有线网进行操作!如果你只有WiFi,那么你需要进行到组播转单播才可以正常观看

注意,如果你用的不是官方Openwrt,而是魔改版本,那么本文涉及的一些软件包可能并不兼容,它们只保证兼容官方的正式版Openwrt。

如今,光纤入户得到普及,运营商往往提供具有路由功能的光猫(家庭网关)。默认情况下,路由模式的光猫已经配置好IPTV业务,用户可以即插即用。但是,运营商提供的光猫路由可能不能满足一些具有动手能力的用户的需要,所以我们往往只把光猫作为光网桥接设备,然后使用自己购买的路由器作为真正的家庭网关。

光猫桥接+自购路由,会使得IPTV业务可能无法在自购路由器上实现。这种情况下,只能再单独用一根网线把IPTV机顶盒接到光猫上,失去了灵活性。而且,这样一来,也无法在家中的其它任何设备上观看IPTV的直播流了。

如果你需要在光猫桥接上网的情况下,获得光猫路由一样的IPTV体验,那么本文适合你。

本文虽然是以单线融合为目标,但作为一种融合方法,也适用于非单线,或者使用VLAN的情况。这两种情况的朋友可以按需参考。

  • 单线、光猫不绑定VLAN、不绑定物理端口:本文说的就是这种情况
  • 单线、光猫可以绑定VLAN:第二步的时候,用不同的VLAN建立对应接口即可
  • 双线、光猫绑定物理端口:第二步的时候,用不同的物理端口建立对应接口即可

基础知识

本文虽然是讲的北京联通IPTV的使用经验,但IPTV的原理大同小异,其它地区和ISP也可以参考。

一般来说,国内运营商是通过机顶盒连接以太网提供IPTV内容服务的。其中主要包括三个方面:

  • 组播(multicast)数据代理到家庭网络,这是IPTV直播视频流的数据来源
  • 将IPTV内容服务网络连接到家庭网络,这是IPTV的机顶盒界面、点播等应用的数据来源
  • 对IPTV的用户权限进行认证,这个认证可能是机顶盒做的,也可能是光猫做的

组播是标准的协议,这部分最容易实现。

但是,各家把IPTV的内容服务网络接入家庭,以及对用户权限认证的方法各不相同。如果你仅仅是需要在电脑或其它设备上观看IPTV直播内容,那么后两者不解决也没问题。但如果你想进行节目时移回看,就必须在机顶盒里进行操作,这就需要后两者的实现了。

北京联通对IPTV的用户认证都是在机顶盒里进行的,所以光猫或路由器不涉及认证的操作。其它地区,例如上海电信的IPTV,采用了较为复杂的DHCP Option、AB面认证,可能不适用于本文。你如果在其它地区,也可以尝试本文所提供的方法;如果你对整个过程的技术原理有自己的理解,欢迎你补充其它地区所需的方法。

不使用VLAN实现单线传输需要满足以下条件:

  • Internet和IPTV业务都不绑定端口
  • 机顶盒没有复杂的DHCP Option、AB面认证
  • IPTV业务在光猫中配置为路由模式
  • Internet在光猫中配置为桥接模式(不然它是路由模式的话,本文也就失去了意义)

第一步:光猫改桥接

运营商的光猫通过TR069协议,从局端下发配置到家。运营商一般把光猫设置为路由模式,这种情况下光猫如果再接路由器,就成了两层路由,需要两层NAT,会损失很多功能和性能。

以往,许多运营商拒绝给用户改光猫桥接。但今年北京联通开始支持局端下发配置改桥接,你只需要拨打客服电话,或者联系小区的宽带维修师傅,就可以改桥接了。

桥接的方法

推荐通过运营商客服改桥接,这是最简单、稳定的办法,也不受以后运营商参数调整的影响。

如果运营商拒绝改桥接,那么只能选择:

  • 破解光猫的管理权限,网上有不少教程
  • 淘宝上买光猫,配置好认证参数

然后再自己设置桥接。

自己设置桥接,推荐Internet采用桥接模式,IPTV采用路由模式,并且不要绑定端口。也不需要设置VLAN之类的更复杂的东西。

以下这个配置是北京联通官方采用的配置。可以看到,Internet是Bridge,IPTV是DHCP。这是指,路由器连接到光猫的时候,可以通过PPPoE拨号连接Internet,以及通过DHCP获取光猫的路由地址,从而访问IPTV的网络。

北京联通官方的桥接上网配置

北京联通的IPTV光猫配置一般是:

  • IPoE封装
  • VLAN ID:3964
  • 组播VLAN:4000

如果你自己设置光猫,确认以上参数后,记得WAN类型选“路由WAN”而不是“桥接WAN”之类的。许多地区的ISP应该是类似的。

下面的步骤都在这个前提下进行。

当然,如果你的光猫支持配置VLAN,也可以使用VLAN来同时传输Internet和IPTV业务,以下的步骤也兼容用VLAN的方式。你也可以采用端口绑定,用两根网线分别传输Internet和IPTV,也是一样的。但IPTV路由+Internet桥接,是最简单的方式,也是北京联通官方的配置方式。

确认你的网络结构

  1. 如果是联通官方的桥接配置,或者根据上一节建议的配置

     光纤 —— 光猫 —— 路由器 —— 各种设备
  2. 如果你的Internet和IPTV业务分别绑定了不同的光猫端口(不推荐,不适用于本文)

     光纤
     │
     光猫
     │
     ├─路由器
     └─IPTV机顶盒

第二步:Openwrt 路由器及基本配置

Openwrt是一个嵌入式的Linux操作系统。你可以在这里查看你的硬件是否被支持,网上也能找到很多刷机教程。或者你可以一步到位,去淘宝选购x86架构的软路由,得到最佳的性能和可扩展性。

在这里我推荐官方版本的固件,而不是别人修改、编译的固件。因为Openwrt的功能都是可以通过软件包的形式扩展的,你完全可以从官方固件开始定制自己的版本。Openwrt的编译也很容易,你完全可以自己编译一个适合自己的硬件和应用需求的固件。这些本文都不讨论。

目前,Openwrt的最新版本是19.07,本文都是基于这个版本。我们从安装了官方版的19.07系统开始。

设置接口

默认状态下,Openwrt 19.07会生成3个接口,分别是LAN、WAN、WAN6。在在北京联通的桥接状态下,WAN6是用不到的,可以先直接删除。

以x86软路由为例,默认是LAN绑定eth0,WAN绑定eth1。你可以修改LAN勾选添加其它物理接口,但我不建议你交换默认的WAN/LAN物理接口,因为这样会给以后刷机带来不便。把台式电脑接到eth0,以后重置固件配置也不会引起问题。

这时候去看一下光猫底部的标签,默认是什么网关地址。你必须修改LAN的地址为另一个网段,比方说192.168.2.1。你也可以选择连接光猫的无线网络,用光猫底部的用户名和密码登录,修改光猫的网关地址,比如把光猫改为192.168.100.1。只要保证二者的网关地址不同,你应该就可以直接在连接路由器的情况下直接访问光猫的管理界面了。

这时候有两个选择:

  • 选项1:保留WAN作为光猫和IPTV的上行链路,然后新建一个PPPoE连接来访问Internet
  • 选项2:修改WAN作为Internet的PPPoE连接,再新建一个IPTV的上行链路。

我采取选项1。(如果你采用选项2,那么下面的一些设置将不一样,需要注意。)

首先关闭WAN,然后新建一个叫做internet的接口,防火墙选WAN区域。用PPPoE协议,填入你的宽带账号密码。

image.png

这时候应该可以上网了,检查下能不能上网,然后继续。

网关跃点

下面设置网关跃点,也就是不同接口的优先级顺序。

image.png

把INTERNET设为10,WAN设为20。

应用生效后,重新启用WAN接口

最后在“概览”里,看到的路由器接口配置如下:

image.png

这时候,应该能够正常上网了,检查一下是否能正常上网。但还不能观看IPTV,因为组播还是不生效的。因为我们需要利用组播代理软件把组播引入家庭网络中来。

第三步:组播代理到家庭网络

接下来是要让IPTV组播正常工作,设置完这一节的内容,你就可以在电脑、手机或者智能电视上观看IPTV直播流了。

组播代理

启用LAN的IGMP嗅探。

image.png

luci-app-omcproxy 现在包含在官方的 luci 软件源中了,使用 openwrt 21.02 或 19.07 分支就能找到它。

image.png

如果你使用Openwrt 18.06,则需要自己编译

在系统-软件包里先点更新,如果没有错误(有错误基本上是因为网络或者防火长城的问题),就上传软件包安装。

在“服务-组播代理”里,上行链路选WAN(以你配置的IPTV接口为准),下行链路选LAN。应用生效。

image.png

北京联通可以参考这个项目最好用的北京联通IPTV频道列表,你可以存为m3u文件,或直接打开该m3u地址。推荐使用VLC播放。

Snipaste_2019-12-08_16-13-21.jpg

这时候应该可以看IPTV的直播节目了。你也可以自己扫描节目单。python win linux

如果你的电脑还是无法观看节目,请检查下它是否有多个以太网接口。如果是多个的话,把连接路由器的那个以太网适配器的TCP/IP协议的网关跃点,设成所有接口的最小值。

但注意,这时只能用组播方式观看IPTV。组播意味着只有有线局域网(以太网)支持。

组播转单播

如果要用WiFi观看,还需要做一个组播转单播的代理。

在软件包里搜索安装luci-i18n-udpxy-zh-cn。设置上下行设备端口,并启用。Source Interface就是你连接光猫IPTV业务的那个物理设备的名称,你可以在“概览”里找到它。

image.png

添加一条防火墙规则。

image.png

把节目表里的rtp://批量替换成http://你的路由器地址:udpxy端口号/rtp/就可以了,这个播放列表支持任意设备播放。你甚至还可以通过设置端口转发,在任何地方观看家里的IPTV。

通过上传处理好的播放列表到手机版的VLC,就可以随时用移动设备观看IPTV直播了。

到这里,如果你仅仅是想观看IPTV的直播节目,这些已经足够了。如果你还需要使用机顶盒,那么继续……

第四步:融合IPTV内容服务网络到家庭网络

(不使用机顶盒的话可以跳过)

机顶盒的内容网络需要通过策略路由的方式来引入家庭网络。这样才能够正常启动机顶盒,使用节目回放等功能。

使用IPTV帮手

下载openwrt-iptvhelper里面的三个ipk包,没错,这也是在下的作品!

依次安装iptvhelerluci-app-iptvhelperluci-i18n-iptvhelper-zh-cn三个包。

确保IPTV的机顶盒通过以太网连接到了路由器,打开IPTV的电源。这时候IPTV应该是不能正常通过认证的,先别慌。

在“服务-IPTV帮手”里,选择机顶盒的MAC地址,确保勾选“创建ipset”。然后应用。

image.png

配置MWAN3

在软件包里搜索luci-i18n-mwan3-zh-cn安装。在“网络-负载均衡”里,第一次进入你会看到有好多规则已经创建了,首先你要删光每一页。

然后添加waninternet两个接口,其它选项一律默认。其余的设置,参考我的配置截图。

如果你想监测接口是否在线,你可以去光猫抄一下IPTV的DNS服务器,以及在Openwrt的概况中看到Internet的DNS服务器,把它们作为监测的IP。不要太频繁地ping,设为每1分钟或5分钟就好。

如果你设置好了两个接口的ping检测,你应该可以在概况里看到如下状态:

image.png

关键的来了,要在iptv_rule里,选择ipset的设置为iptvhelper_default

image.png

然后应用设置,你应该可以重启机顶盒,然后进入机顶盒的应用画面了。第一次启动可能时间会稍微就一点点。

在路由器的系统日志里,应该可以看到类似于iptvhelper.default:IN=br-lan OUT****这样的日志内容,那就是正确无误了。

如果你用ipset方式遇到问题,则可以不采用ipset方式,而是只给机顶盒ip(红框里的)地址配置路由策略:

Snipaste_2020-06-14_22-53-12.png

到此为止,IPTV业务已经完全无缝地融入家庭网络啦。你可以在任何网络接口用机顶盒了,也可以支持多个机顶盒。

总结

以上应用经验的要点有:

  • 单线融合IPTV其实并不一定需要VLAN。以往有许多朋友分享使用VLAN来进行IPTV与Internet的单线传输,需要光猫支持VLAN绑定,配置比较复杂。有的光猫不一定支持VLAN绑定,但支持同一个端口同时使用DHCP和PPPoE两种下行地址获取方式。但其实光猫如果使用IPTV路由模式、Internet PPPoE模式,是可以在Openwrt里用同一个物理接口创建两个不同的逻辑接口的,效果和VLAN一样。网关跃点的配置指定了Internet优先级最高,避免了IPTV的路由干扰。
  • 组播代理有很多Openwrt软件可以用,比方说igmpproxy,但它比较老了。还有mcproxy,它的功能更为复杂,配置也更为复杂,体积也比omcproxy大不少。所以我选择omcproxy,它对于那些廉价的普通路由器来说也很友好,并且支持最新的组播协议,包括IPv6组播(虽然暂时用不上)。
  • udpproxy实现了组播转单播,如果你打算转发到公网,确保你的地址没有被泄露或被扫描,不然你就免费提供了一个节目源……
  • mwan3本来是用来做多线wan接入的,玩多拨、多网的朋友会用到。会配置的话,想要同时融合多家IPTV运营商进来也是没问题的,我的iptvhelper也支持创建多个机顶盒的配置,omcproxy也支持多个实例……但这样玩的人应该是少之又少吧……

iptvhelper目前只对北京联通的IPTV使用情况进行了适配。不同的地区、不同的运营商,有别于北京联通IPTV的需求,可以在Github上提交issue。特别是当你已经通过自定义脚本、配置,设置成功了当地的IPTV,欢迎把经验告诉我,我会考虑把必要的功能放进未来的版本中,这样就能惠及更多地区的IPTV用户了。

如果你有问题想要咨询我,请发邮件到[email protected],评论里的问题我不一定会回复