最近不知怎么回事,突然又有兴趣继续折腾电信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
设备连线图
这样连线,主要是因为有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简化成了一根线。连接图如下:
这样路由器上的空闲的接口从两个变成了4个,提高了一倍。IPTV的盒子暂时也不用了,实际上IPTV也绝大部分时间是在折腾的时候使用。
主要步骤
1.SmartOS安装Openwrt
这部分大概是两年前折腾的,网上的资料也比较少,我的主要做法是:首先创建一台KVM的Linux虚拟机,linux的操作系统关系不大,再下载OpenWrt的X86的镜像文件,然后再操作系统内执行如下格式的命令即可:
dd if=/
这条命令执行完后,通过vmadm reboot 重启系统吧,因为这时已经无法用操作系统的命令重启了。
特别注意:以上命令特别危险,会直接覆盖整个系统,就是用一个镜像文件覆写整个磁盘,一定是一个新虚拟机上执行,或者知道自己在干什么。
2.修改虚拟机mac地址
这一步不是必须的,这一步的目的确保mac地址的第7bit一定是0,往往在创建虚拟机的时候如果是用的一些配置文件不包含mac地址的话,smartos会自动创建,自动创建的mac第7bit是1,第7bit标识这个网卡是本地管理mac地址,不是分配给个网卡制造商的地址。可以在创建的时候直接指定mac地址,避免进行修改。smartos修改网卡信息是根据mac地址进行修改。所以修改mac实际上是把网卡删掉再重新加,为了方便,如果需要修改的话建议采用如下步骤:
- 获取网卡信息
vmadm get
| json nics > add_nic.json - 修改add_nic.json,只需要再头尾加上如下内容即可:
{
"add_nics": [
xxxxx这部分内容就是前面自动生成的部分,包含前后的方括号
]
}
- 删除网卡,根据1步获取到的mac地址删除网卡,命令如下:
echo '{"remove_nics": ["
"]}' |vmadm update - 添加网卡
cat add_nic.json | vmadm update
- 重启虚拟机,不要在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就是上表中在交换机中配置的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
命令输出的网卡接口编号和虚拟机内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'
管理页面配置如下图,基本只需要改一下自己想要的端口
没有管理页面配置的话,也可以从命令行启动,8888是端口:
/usr/bin/udpxy -T -S -p 8888
运行成功后,可以看看它的后台页面:
这个地方出问题,往往是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的流量数据转发至正确的接口。
主路由 梅林
网络地址是IPTV的服务器的地址段,网关是我软路由的地址。
软路由 Openwrt
软路由上也需要设置路由策略,毕竟我的软路由上也还跑了一些其他服务,策略和主路由上的类似,只是将其转到IPTV的网络接口上。
7.防火墙设置
IPTV主要是在局域网内播放,所以防火墙上的设置主要是在软路由上进行配置。
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拨号的问题。
避坑要点
- 虚拟网卡的Mac不能是本地管理地址,否则PPPoe拨号请求不会响应
- IGMP的版本必须是2,路由器中转发时也必须是IGMPv2,默认v3
-
非网络专业人士使用普通家用网管交换机时忘掉专业设备上的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内。
- SmartOS的网络配置修改了后记得通过vmadm reboot重启生效,而非OS内reboot,不然还以为是配置错了或者功能不支持
- OpenWrt的Vlan设置,接口创建时选择eth0.45的设备就表示使用网卡0上vlan tag是45的的数据包
- SmartOS 虚拟机内没找到单虚拟网卡指定多vlan tag的配置,可以针对不同的vlan创建不同的虚拟网卡,区别只是在不同的位置虚拟网卡
- RTP防火墙未放通IGMP和UDP的时,igmpproxy是无法正常工作的
- Udpxy转发UDP数据时的上游IP地址通过绑定接口设置时可能会因为bug出现和PPPoe取得的IP地址不一致的情况
感觉已经好久好久没有做成一件事了。