桥接电信光猫IPTV链接跨三层网络转发进内网

/ 4评 / 8

条件

1、IPTV来自湖北武汉电信
2、IPTV通过PPPOE拨号进入电信内网
3、IPTV本身由光猫拨号,达到最佳兼容性,而不是由路由器或者别的设备拨号
4、Internet网络由路由器桥接到光猫,并由路由器拨号
5、路由OpenWrt内网为192.168.1.1/32
6、光猫内网和IP地址为192.168.0.1/32

可以看出,本方案需要将光猫当中PPPOE拨号的IPTV组播流,跨越192.168.0.1/32网段,转发到192.168.1.1/32网段,从而使得局域网内部设备可以任意观看IPTV

网上对于IPTV转发到内网任意设备观看,使用的软件无非就是igmp proxy 和udpxy,其中前者作为一个proxy,对于客户端作为一个服务器接受组播请求,再对服务器作为客户端将组播请求转发出去,所以被称作一个proxy,而后者则是将组播流转发成单播流让不支持组播的播放器可以任意播放IPTV流,同时可以指定监听的组播端口,提高效率。

通过原理来看,转发IPTV流进入内网同样有多种实现方式
1、通过路由器拨号,路由内部直接转发到路由器的Lan口
2、通过光猫拨号,并关闭光猫DHCP,同时将光猫接入到Lan网络,该方案类似1,只是拨号对象不同而已
3、通过光猫拨号,光猫为一个独立的广播域,路由器的Lan为一个独立的广播域,路由器和光猫相连并在路由当中转发光猫广播域当中的组播流进入到Lan网络的组播流

本文采用方案3只是为了做技术验证,同时1,2,3三种方案作者都做过测试,通过光猫拨号后,播放端对IPTV播放的兼容性明显有优势。

设置光猫IPTV拨号

1、破解光猫超级管理员密码

首先需要破解一下光猫的超级管理员密码,一般名称是telecomadmin,密码则随光猫不同而不同,有时候还会因为电信的配置变动重新下发超级管理员密码,这里不做讨论,只给出湖北电信光猫的破解方案,不同地区不同品牌的光猫有不同的方法,可以直接在网上搜索

1.首先用普通账号登陆光猫界面
2.浏览器地址栏输入 192.168.1.1/backupsettings.txt 。将backupsettings.txt文件做好备份,存在电脑上。如果找不到backupsettings.txt文件,重新输入 192.168.1.1/backupsettings.conf ,并做好备份。
3.用txt打开下载好的文档“backupsettings.txt”,搜索“TeleComAccount”,两个password间就是超级密码。超级账号是telecomadmin。

2、设置光猫的IP地址

由于在这里我们会将光猫所在的地址段作为一个单独的广播域,所以光猫的IP地址一定要跟Lan网络的IP地址有所区别,这里我将光猫的IP地址段设置为192.168.0.1/32,而Lan网络地址则是192.168.1.1/32,当然也 可以设置成别的地址,不影响本文的操作。
光猫IP地址:192.168.0.1
路由器网关IP:192.168.1.1

3、光猫当中添加IPTV拨号连接

由于本方案的核心是在光猫当中做IPTV拨号,并将组播流从光猫的广播域传递到Lan的广播域,所以这里需要单独在光猫当中设置IPTV的拨号连接,方式如下

连接名称是自动生成的,填写相应的IPTV信息即可,注意最后一行LAN端口绑定需要留空,一旦填写则只有某一个端口可以可以收发相关数据流,而不会在广播域当中传播。

可以在下列菜单当中查询新增连接是否正常拨号,正常拨号的状态是能够获取到相关的IP地址

4、修改光猫IGMP设置

需要打开IGMP Proxy光能才能转发组播流,如下图填写,这里我把两个功能都打开了

设置路由器转发组播流

本节路由器以Openwrt为例。
要点
1.设置路由器接口连接光猫
2.配置路由器其他接口网关跃点
3.设置路由器防火墙
4.设置路由器MWAN负载均衡

1.设置路由器接口连接光猫

即将路由器的一个WAN口与光猫的任意一个接口相连,并设置成和光猫一致的IP内网地址,该接口用于接受光猫当中组播流,并作为网关转发相关数据包。

基本设置

高级设置

注意此处设置网关跃点为30,后面可以设置WAN口为20,Lan口为10,保证流量出口的顺序。

物理配置

物理配置当中需要选择路由器当中连接到光猫的物理接口,这里是eth2,以实际情况为准。

防火墙配置

防火墙需要新建一个对应接口的独立防火墙,后续会对该防火墙进行配置,主要配置与WAN口防火墙类似,但是具体会放行IGMP和组播UDP流量,会在后续配置当中列出。

其他接口跃点设置


IPTV防火墙设置


这里设置防火墙规则的目的是允许IGMP请求透过IPTV接口传播,同时允许从IPTV接口接受组播的UDP包。
至此,路由器端可以和光猫端进行通讯,可以尝试访问192.168.0.x即光猫的IP地址,应该是可以跨网段直接访问。

路由器当中设置igmproxy

除了让路由器可以和光猫当中的内网通讯,还需要设置igmpproxy使得IPTV接口对于Lan网络作为IGMP的server,接受IGMP请求,而对于光猫及后端的IPTV服务器则是IGMP client,可以将Lan网络当中接收到的IGMP请求转发再次请求,从而达到跨网段传播IGMP流的目的。

由于Openwrt官方的package repo就提供最新版本的igmpproxy,所以我们只需要在编译openwrt的时候选择igmpproxy组件即可,对于igmpproxy来说是没有luci界面去编辑设置的,所以我们需要修改对应的配置文件保证igmpproxy正常工作。

一般来说,igmpproxy安装完成后会自动启动,启动的命令是
/usr/sbin/igmpproxy -n /var/etc/igmpproxy.conf
可以很明显的看出来,他的配置文件是在/var/etc/igmpproxy.conf当中,而实际上通过查阅igmpproxy的官方文档,发现此处的配置文件不是用于用于配制的,他会读取用户配置的一个配置文件,在/var/etc/igmpproxy.conf当中生成配置并传递给igmpproxy运行识别,所以我们用户编辑的配置文件实际上是在/etc/config/igmpproxy当中,那么仅需编辑这个文件即可达成我们之前提到的使得igmpproxy成为一个上下运行的代理,下面是我使用的/etc/config/igmpproxy配置文件细节。

config igmpproxy
        option quickleave 1

config phyint
        option network iptv
        option direction upstream
        list altnet 0.0.0.0/0

config phyint
        option network lan
        option direction downstream
        list altnet 192.168.1.0/24

这个配置文件很容易理解,即配置一个phyint接口iptv作为upstream,所以的igmp请求都会发送到这个接口,他接受0.0.0.0/0地址段的请求。而另一个phyint则作为下行链路downstream,所有udp视频流都会通过这个接口转发出去,转发的对象则是192.168.1.0/24即Lan网络。

验证igmpproxy是否正常工作

默认igmpproxy正常工作的时候并没有指定产生日志,所以我们也无存确认igmpproxy是否正常工作,但是我们可以手动运行igmpproxy使得他直接输出日志,可以了解igmpproxy是否正常运行。
先结束当前的igmpproxy进程

service igmpproxy stop

再手动运行即可

/usr/sbin/igmpproxy -vvd /var/etc/igmpproxy.conf

此时会看到运行igmpproxy的日志,可以详细了解到igmpproxy工作的情况,比如igmpproxy作为代理将上下行端口流量转发的过程

当然在测试的时候就可以直接使用抓包过的iptv节目ip地址在VLC或者Potplayer上观看节目了,彻底脱离了IPTV机顶盒的束缚,同时也可以在KODI这种软件上加上节目单在线观看节目了。

udpxy转换组播到http

对于直接获取UDP流来观看直播,很多软件支持不太好,并且一个IGMP请求就会在路由器内占用不少资源,如果多个IGMP请求发起的话不仅远端的运营商有可能发现,而且本地网络也有不小的影响,所以尽量使用udpxy这个软件,将UDP请求的视频流转换成http请求的视频流,实际上也是一个代理的作用,对Lan网络来说可以有N个http client请求直播,通过udpxy转换后,对于igmpproxy来说就只有一个请求,或者说一个台一个请求。

udpxy的设置方法很简单,并且也在openwrt的官方package源当中可以直接安装,仅仅只是版本比较旧而已,可以参考文章《Openwrt编译udpxy流程和相关设置解析》

再次简述一下设置/etc/config/udpxy,或者直接在luci界面也可以设置,这里以前者为例

config udpxy
        option respawn '0'
        option verbose '0'
        option status '1'
        option bind '192.168.1.1'
        option port '4022'
        option source 'pppoe-iptv'
        option max_clients '5'
        option log_file '/var/log/udpxy'
        option buffer_size '2097152'
        option buffer_messages '10'
        option mcsub_renew '300'
        option disabled '0'

而在使用播放地址的时候,需要显式的用udpxy去发起请求,例如我请求1.2.3.4:8080这个地址的UDP视频流,经过udpxy转换后,应该是这么写http://192.168.1.1/4022/udp/1.2.3.4:8080
这既代表通过udpxy去请求udp视频流。

测试使用

经过一番设置,可以使得电信的IPTV流直接转发到内网,非常稳定。

  1. 匿名说道:

    看了这么多就你这个讲得最清楚,另外后面的代理URL形式应该是http://192.168.1.1:4022/udp/1.2.3.4:8080

  2. magplus说道:

    大大你好!看了你的文章很受启发,感觉能解决我的需求。就是你前面说是在光猫上进行iptv拨号,后面udpxy中的source怎么会是pppoe-iptv呢,这表示是在iptv口子上进行拨号了吧。

    • 匿名说道:

      @magplus 这个可能是笔误,接口名称无所谓的,只看协议是pppoe还是静态地址,我现在的状态就是在光猫上拨号iptv,openwrt当中对接光猫的iptv口是静态地址,比如光猫是192.168.0.1的网关,则openwrt的iptv接口分配192.168.0.2,用于和光猫通讯即可。而本地openwrt的lan口则设定为192.168.1.x的网段。

  3. magplus说道:

    大大你好!看了你的文章很受启发,感觉能解决我的需求。就是你前面说是在光猫上进行iptv拨号,后面udpxy中的source怎么会是pppoe-iptv呢,这表示是在iptv口子上进行拨号了吧。

发表回复

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据