SmartOS+Openwrt+IPTV+VLAN+单线复用折腾

最近不知怎么回事,突然又有兴趣继续折腾电信IPTV局域网内的转播,很久前就折腾过,不过一度以为电信的IPTV做了特殊的授权鉴定,导致始终配置不成功,网上的确也有类似的说法。但是在以前的折腾过程中,用电脑PPPoe拨IPTV后,VLC是可以直接播放的,但是用单独的梅林、Openwrt路由器拨号后,始终无法用Udpxy、Igmpproxy转iptv数据,一度让自己也相信了本地的IPTV做了某些特殊的限制。不过最近,想想应该还是某些配置不到位,所以就再折腾了一次。

我的设备清单及软件和功能:

*光猫:华为hg8120C
*路由:梅林固件,1个wan口,4个lan口,承载对外的网络出口
交换机:BL-SG1082,8口,可配置VLAN、端口聚合、镜像等等
*服务器:HP Gen8,1管理口,两个数据口,跑SmartOS,里面跑着nas、软路由(KVM+Openwrt)等等,软路由只有一个网卡只是作为lan下的客户端,主要是做一个旁路由,就是降低一些路由器加密访问网络时的CPU负载
*IPTV盒子:就是办理IPTV时的普通盒子
*辅助设备:斐讯N1、斐讯K2p刷Openwrt

设备连线图

IPTV.png

这样连线,主要是因为有nas,客厅的播放设备较多,我都偏好有线连,其他设备在图上就未标识了。光猫上的IPTV口折腾前大部分时间就直接连IPTV盒子了,偶尔会直接连上交换机,这样在房间来到处都可以IPTV拨号,可以移动IPTV盒子观看。
这套环境下,要折腾主要困难是,SmartOS的资料比较少,官方文档感觉也是简单的一些基本操作,相比esxi跑nas、软路由什么的资料少太多了,我之所以用SmartOS主要的原因就是跑nas,SmartOS不像esxi需要直通的阵列卡才能尽量保证磁盘IO的性能;另外毕竟不是专业网络工程师,Openwrt留给用户的选项实在是太多了,主要也是用梅林为主;另外我对Vlan的理解也局限在专业网络设备上的Vlan概念的非常非常初级的认识,和实际使用的设备的vlan概念相差很多。

折腾后的效果

软路由是全功能软路由,可直接PPPoe拨号WAN和IPTV,可转发IPTV流量,实现局域网内智能终端播放IPTV(IGMPProxy,udpxy均工作正常),网络设备之间的连线都通过VLAN简化成了一根线。连接图如下:


IPTV_n.png

这样路由器上的空闲的接口从两个变成了4个,提高了一倍。IPTV的盒子暂时也不用了,实际上IPTV也绝大部分时间是在折腾的时候使用。

主要步骤

1.SmartOS安装Openwrt

这部分大概是两年前折腾的,网上的资料也比较少,我的主要做法是:首先创建一台KVM的Linux虚拟机,linux的操作系统关系不大,再下载OpenWrt的X86的镜像文件,然后再操作系统内执行如下格式的命令即可:
dd if=//Openwrt_XXX.img of=/dev/sda
这条命令执行完后,通过vmadm reboot 重启系统吧,因为这时已经无法用操作系统的命令重启了。
特别注意:以上命令特别危险,会直接覆盖整个系统,就是用一个镜像文件覆写整个磁盘,一定是一个新虚拟机上执行,或者知道自己在干什么。

2.修改虚拟机mac地址

这一步不是必须的,这一步的目的确保mac地址的第7bit一定是0,往往在创建虚拟机的时候如果是用的一些配置文件不包含mac地址的话,smartos会自动创建,自动创建的mac第7bit是1,第7bit标识这个网卡是本地管理mac地址,不是分配给个网卡制造商的地址。可以在创建的时候直接指定mac地址,避免进行修改。smartos修改网卡信息是根据mac地址进行修改。所以修改mac实际上是把网卡删掉再重新加,为了方便,如果需要修改的话建议采用如下步骤:

  1. 获取网卡信息
    vmadm get | json nics > add_nic.json
  2. 修改add_nic.json,只需要再头尾加上如下内容即可:
{
  "add_nics": [
xxxxx这部分内容就是前面自动生成的部分,包含前后的方括号
  ]
}
  1. 删除网卡,根据1步获取到的mac地址删除网卡,命令如下:
    echo '{"remove_nics": [""]}' |vmadm update
  2. 添加网卡
    cat add_nic.json | vmadm update
  3. 重启虚拟机,不要在vm内执行重启命令,不然不生效
    vmadm reboot

3.VLAN设置

VLAN的配置表如下:

VLANID 用途 交1口1 交1口2 交1口3 交1其他 路WAN 路LAN 交2口1 交2口2 交2其他
1 主要承载局域网数据 U U U U U U U U U
2 连接光猫进行internet拨号 U T T C T C T T C
45 连接光猫进行IPTV拨号 T C T C / / T T C
PVID 每个端口默认VLAN ID 2 1 1 1 / / 1 1 1

注:交1口1表示第一个交换机第一个口,路WAN表示路由器WAN口,U表示untag,T表示tag,C表示这个端口不在这个VLAN。为什么交1口1的pvid是2,因为我的光猫internet连接开启vlan后就无法正常拨号了。

光猫的VLAN设置

光猫的配置比较简单,我只配置IPTV的VLAN使得与交1口1连接的光猫口可以发送IPTV的数据,即做VLAN绑定,如下图:

光猫的VLAN.png

注:用户侧的VLAN就是上表中在交换机中配置的vlanid,只是我这里和光猫中的vlan刚好配成了一样的。

梅林的VLAN设置

梅林的配置即简单也复杂,复杂的是界面上没有配置的地方,简单的是只需要执行以下一条命令:
robocfg vlans reset vlan 1 ports "0 1 2 3 4 5t" vlan 2 ports "4t 5u"
注:这个port端口每台设备不完全一样,最好是先执行robocfg show看看自己设备的端口对应关系。这条命令的意思就是将wan口(端口4)加入到vlan1即本地局域网,在vlan1是untag的,在vlan2是tag的

交换机的VLAN设置

交换机上的配置则相对简单,在界面上按表格中的配置完成即可。注意PVID和VLAN都需要设置。

SmartOS的VLAN设置

SmartOS上,并未找到虚拟机中单网卡配置多VLAN的方法,我的办法是直接为软路由的虚拟机增加两块新的网卡分别指定vlanid是2和45。命令和修改mac地址的添加网卡的步骤很相似,只需要把添加网卡的json配置文件修改vlanid以及mac地址即可。添加后vmadm reboot使添加的设备生效。

4.软路由创建或修改IPTV,WAN接口

创建接口和普通openwrt创建接口的方式一样,注意选择网络接口时,IPTV的接口应该是对应vlanid是45的虚拟网卡,WAN接口的应该是vlanid为2的虚拟网卡。也可以在宿主机smartos上执行命令确认:
vmadm get | json nics
命令输出的网卡接口编号和虚拟机内ethx的编号是对应的,也是和添加网卡的顺序号对应的。
创建的接口名字、防火墙区域名字后续需要使用,防火墙区域的名字建议和接口名字一样。

5.IPTV转发配置

这部分需要配置两个软件udpxy和igmpproxy。
udpxy的主要功能是将多播的udp数据流转成TCP的单播数据流,直观感受就是可以使用vlc之类的播放工具可用http://x.x.x.x:8888/udp/y.y.y.y:z 网络流地址进行播放IPTV,对无线路由器的负载会小很多。
igmpproxy的主要功能是实现IGMP协议的自动路由转发,IPTV用IGMP协议较多,直观感受就是vlc的播放rtp://y.y.y.y:z这种格式的地址,对无线的负载会比较高,我基本只用有线播放。
这两个工具可以直接使用OpenWrt的官方源进行安装,安装命令如下:
opkg install updxy luci-app-udpxy igmpproxy
注:luci-app-udpxy 是udpxy的配置页面

udpxy配置

udpxy的配置比较简单,基本默认配置文件即可,如果路由上有管理页面配置更简单,配置文件(/etc/config/udpxy)如下:

config udpxy
        option respawn '1'
        option verbose '0'
        option status '1'
        option port '8888'
        option disabled '0'

管理页面配置如下图,基本只需要改一下自己想要的端口

image.png

没有管理页面配置的话,也可以从命令行启动,8888是端口:
/usr/bin/udpxy -T -S -p 8888
运行成功后,可以看看它的后台页面:
image.png

这个地方出问题,往往是Multicast address不是IPTV拨号后的地址,如果写成0.0.0.0也是可以的。以前的配置文件是绑定到iptv连接的接口上,可是碰见过一次bug,地址和iptv拨号好的地址不对,重启服务也没解决,后来就直接写成了0.0.0.0。

igmpproxy配置

igmpproxy的配置主要是改它的配置文件(/etc/config/igmpproxy):

config igmpproxy
        option quickleave 1#换台速度会快一些,但我没测试
#       option verbose [0-3](none, minimal[default], more, maximum)

config phyint
        option network iptv#和自己建的IPTV连接的名称要保持一致
        #option zone iptv
        option direction upstream#表示上行流量
        #list altnet 192.168.1.0/24
        list altnet 0.0.0.0/0#把组播的网络地址找出来写在这里也可以,直接用这个简单

config phyint #下行流量配置,默认就可以,只是需要确认你的LAN的名称在软路由中是lan即可
        option network lan
        option zone lan
        option direction downstream

服务的启动命令:
/etc/init.d/igmpproxy start

软路由上IGMP版本设置

操作很简单,但很关键,就是这一小步是导致几年前的折腾不成功的主要原因,以前只是改了本地操作系统的IGMP的版本,改了之后电脑拨号后是可以用vlc播放rtp格式的iptv链接的。修改路由上IGMP版本只需要执行一条命令即可,后面会将它加到开机脚本。
echo 2 > /proc/sys/net/ipv4/conf/all/force_igmp_version
这条命令就是修改igmp的默认版本号为2,如果不改的话,这个值默认是0,使用的IGMPv3,本地电信IPTV用的IGMPv2.

6.路由设置

在我的网络环境下,上网还是用的硬路由,iptv是软路由,所以还需要做一些路由设置。如果使用同一个路由,则做的路由设置或负载均衡策略的配置是不一样的。主要目的就是将IPTV的流量数据转发至正确的接口。

主路由 梅林

image.png

网络地址是IPTV的服务器的地址段,网关是我软路由的地址。

软路由 Openwrt

image.png

软路由上也需要设置路由策略,毕竟我的软路由上也还跑了一些其他服务,策略和主路由上的类似,只是将其转到IPTV的网络接口上。

7.防火墙设置

IPTV主要是在局域网内播放,所以防火墙上的设置主要是在软路由上进行配置。


image.png

Openwrt的防火墙配置个人觉得比较复杂,了解的还不是很清楚,所以暂时软路由只配置了IPTV的策略,也不确认开的策略是不是大了。WAN口的策略未做过多的配置,WAN的拨号只是测试了正常拨号,基本上WAN口未启用。上图的策略总共做了四条,分别是允许LAN网络的数据到IPTV区域的数据转发;允许IPTV网络的数据通过LAN区域转发;允许IGMP协议从IPTV网络区域到软路由转发;允许UDP协议的数据从IPTV转发至LAN区域。
完成这步后,IPTV拨号成功后,应该就可以通过VLC等播放器看IPTV的节目了。

8.开机脚本配置

由于修改了梅林的默认VLAN,以及指定了路由IGMP的版本,这些配置重启后会失效,所以需要通过一些脚本将其在重启后自动设置,实现的方式应该有多种,我的方法不一定最合理的。

主路由梅林的VLAN设置

创建开机启动脚本,保存路径/jffs/scripts/init-start,脚本内容:

#!/bin/sh
robocfg vlans reset vlan 1 ports "0 1 2 3 4 5t" vlan 2 ports "4t 5u"

软路由Openwrt的IGMP版本设置

在udpxy的服务的启动脚本加入指定Igmp版本的命令,路径 /etc/init.d/udpxy:

start_service() {
        echo 2 > /proc/sys/net/ipv4/conf/all/force_igmp_version #在启动函数中增加此行
        config_load udpxy
        config_foreach start_instance udpxy
}

解决问题的一些思路

断断续续折腾这个问题也有了几年了,也放弃过几次了。这次折腾的环境实际上是比以前折腾的环境更复杂了,smartos虚拟化的设置,OpenWrt的配置,VLAN的配置,IPTV数据转发的配置,IPTV和WAN单线复用拨号都最多只能算半懂,就是只知道原理,实际配置都是找参考看手册。为了降低折腾的复杂度,用了一些辅助设备和工具,逐步排除一些不确定的影响因素。

1. 排除虚拟化的未知影响,N1模拟旁路由

开始时比较担心不确定因素较多的时候不好排错,软路由毕竟运行在smartos中,虚拟化的一些配置也是第一次,也不太容易确定是否正确,网上也几乎找不到相似用途的参考,所以用N1刷了Openwrt的固件模拟了软路由。在未折腾前,我的软路由也只有一个虚拟网卡,所以和N1做软路由的场景很相似。当N1成功后,至少知道了OpenWrt和IPTV的配置。

2. K2p刷OpenWrt,确保Vlan配置正确

为了解决单线复用IPTV和WAN,需要在这带一些网管功能的交换机上进行配置,关键它的配置和以前接触到的VLAN概念差异还比较大。而且SmartOS的vlan配置也没做过,所以先用K2p刷OpenWrt确保交换机上的VLAN配置正确,再去解决SmartOS的VLAN配置。

3. WireShark抓包排错

这次最终能折腾成功,多亏wireshark进行网络报文的分析。通过wireshark分析路由器上拨号用的网络端口上获取的数据,发现路由器内部使用的IGMP协议的版本是3;通过分析软路由PPPoe拨号的数据和N1PPPoe拨号的数据,发现本地管理的mac的拨号请求,光猫是不会响应的。这两个问题基本是最不容易发现的问题,其他做路由转发IPTV的参考资料中都很少提到,特别是PPPoe拨号的问题。

避坑要点

  1. 虚拟网卡的Mac不能是本地管理地址,否则PPPoe拨号请求不会响应
  2. IGMP的版本必须是2,路由器中转发时也必须是IGMPv2,默认v3
  3. 非网络专业人士使用普通家用网管交换机时忘掉专业设备上的VLAN概念,不用去做概念上的对应,不然更容易把自己搞糊涂。个人理解家用网管交换机就是靠vlanid、tag、untag、pvid来实现所有vlan的功能,创建vlan时,指定vlanid选择端口号设置tag、untag,表示这个vlan的数据会在这些端口内进行转发,tag表示从这个端口出去的数据会打上vlan标签,untag则是去掉标签发出去,主要是避免一些网络客户端不支持剥离vlan tag(目前大部分设备应该是支持自动剥离的),下图上的清掉选项则表示这个端口不参与该vlan的数据转发,网络设备间的连接端口参与vlan内数据转发时一定要设置为tag;pvid就是表示这个端口收的数据没有vlan tag时默认打上值为pvid的vlan tag然后数据转发;还有一个特殊的vlan id=1,这个vlan是包含了所有的端口,都是untag,而且是不可以修改的,虽然有些办法可以绕过限制修改但最好还是不要改,整个内网环境也主要是跑在这个vlan内。


    image.png
  4. SmartOS的网络配置修改了后记得通过vmadm reboot重启生效,而非OS内reboot,不然还以为是配置错了或者功能不支持
  5. OpenWrt的Vlan设置,接口创建时选择eth0.45的设备就表示使用网卡0上vlan tag是45的的数据包
  6. SmartOS 虚拟机内没找到单虚拟网卡指定多vlan tag的配置,可以针对不同的vlan创建不同的虚拟网卡,区别只是在不同的位置虚拟网卡
  7. RTP防火墙未放通IGMP和UDP的时,igmpproxy是无法正常工作的
  8. Udpxy转发UDP数据时的上游IP地址通过绑定接口设置时可能会因为bug出现和PPPoe取得的IP地址不一致的情况

感觉已经好久好久没有做成一件事了。

你可能感兴趣的:(SmartOS+Openwrt+IPTV+VLAN+单线复用折腾)