最近不知怎么回事焰枢,突然又有興趣繼續(xù)折騰電信IPTV局域網(wǎng)內(nèi)的轉(zhuǎn)播蚓峦,很久前就折騰過,不過一度以為電信的IPTV做了特殊的授權(quán)鑒定济锄,導致始終配置不成功暑椰,網(wǎng)上的確也有類似的說法。但是在以前的折騰過程中荐绝,用電腦PPPoe撥IPTV后一汽,VLC是可以直接播放的,但是用單獨的梅林低滩、Openwrt路由器撥號后召夹,始終無法用Udpxy、Igmpproxy轉(zhuǎn)iptv數(shù)據(jù)恕沫,一度讓自己也相信了本地的IPTV做了某些特殊的限制监憎。不過最近,想想應該還是某些配置不到位婶溯,所以就再折騰了一次鲸阔。
我的設(shè)備清單及軟件和功能:
*光貓:華為hg8120C
*路由:梅林固件,1個wan口迄委,4個lan口褐筛,承載對外的網(wǎng)絡(luò)出口
交換機:BL-SG1082,8口跑筝,可配置VLAN死讹、端口聚合、鏡像等等
*服務器:HP Gen8曲梗,1管理口赞警,兩個數(shù)據(jù)口,跑SmartOS虏两,里面跑著nas愧旦、軟路由(KVM+Openwrt)等等,軟路由只有一個網(wǎng)卡只是作為lan下的客戶端定罢,主要是做一個旁路由笤虫,就是降低一些路由器加密訪問網(wǎng)絡(luò)時的CPU負載
*IPTV盒子:就是辦理IPTV時的普通盒子
*輔助設(shè)備:斐訊N1、斐訊K2p刷Openwrt
設(shè)備連線圖
這樣連線,主要是因為有nas琼蚯,客廳的播放設(shè)備較多酬凳,我都偏好有線連,其他設(shè)備在圖上就未標識了遭庶。光貓上的IPTV口折騰前大部分時間就直接連IPTV盒子了宁仔,偶爾會直接連上交換機,這樣在房間來到處都可以IPTV撥號峦睡,可以移動IPTV盒子觀看翎苫。
這套環(huán)境下,要折騰主要困難是榨了,SmartOS的資料比較少煎谍,官方文檔感覺也是簡單的一些基本操作,相比esxi跑nas龙屉、軟路由什么的資料少太多了呐粘,我之所以用SmartOS主要的原因就是跑nas,SmartOS不像esxi需要直通的陣列卡才能盡量保證磁盤IO的性能叔扼;另外畢竟不是專業(yè)網(wǎng)絡(luò)工程師事哭,Openwrt留給用戶的選項實在是太多了,主要也是用梅林為主瓜富;另外我對Vlan的理解也局限在專業(yè)網(wǎng)絡(luò)設(shè)備上的Vlan概念的非常非常初級的認識,和實際使用的設(shè)備的vlan概念相差很多降盹。
折騰后的效果
軟路由是全功能軟路由与柑,可直接PPPoe撥號WAN和IPTV,可轉(zhuǎn)發(fā)IPTV流量蓄坏,實現(xiàn)局域網(wǎng)內(nèi)智能終端播放IPTV(IGMPProxy价捧,udpxy均工作正常),網(wǎng)絡(luò)設(shè)備之間的連線都通過VLAN簡化成了一根線涡戳。連接圖如下:
這樣路由器上的空閑的接口從兩個變成了4個结蟋,提高了一倍。IPTV的盒子暫時也不用了渔彰,實際上IPTV也絕大部分時間是在折騰的時候使用嵌屎。
主要步驟
1.SmartOS安裝Openwrt
這部分大概是兩年前折騰的,網(wǎng)上的資料也比較少恍涂,我的主要做法是:首先創(chuàng)建一臺KVM的Linux虛擬機宝惰,linux的操作系統(tǒng)關(guān)系不大,再下載OpenWrt的X86的鏡像文件再沧,然后再操作系統(tǒng)內(nèi)執(zhí)行如下格式的命令即可:
dd if=/<path>/Openwrt_XXX.img of=/dev/sda
這條命令執(zhí)行完后尼夺,通過vmadm reboot 重啟系統(tǒng)吧,因為這時已經(jīng)無法用操作系統(tǒng)的命令重啟了。
特別注意:以上命令特別危險淤堵,會直接覆蓋整個系統(tǒng)寝衫,就是用一個鏡像文件覆寫整個磁盤,一定是一個新虛擬機上執(zhí)行拐邪,或者知道自己在干什么竞端。
2.修改虛擬機mac地址
這一步不是必須的,這一步的目的確保mac地址的第7bit一定是0庙睡,往往在創(chuàng)建虛擬機的時候如果是用的一些配置文件不包含mac地址的話事富,smartos會自動創(chuàng)建,自動創(chuàng)建的mac第7bit是1乘陪,第7bit標識這個網(wǎng)卡是本地管理mac地址统台,不是分配給個網(wǎng)卡制造商的地址》纫兀可以在創(chuàng)建的時候直接指定mac地址贱勃,避免進行修改。smartos修改網(wǎng)卡信息是根據(jù)mac地址進行修改谤逼。所以修改mac實際上是把網(wǎng)卡刪掉再重新加贵扰,為了方便,如果需要修改的話建議采用如下步驟:
- 獲取網(wǎng)卡信息
vmadm get <vm_uuid> | json nics > add_nic.json
- 修改add_nic.json,只需要再頭尾加上如下內(nèi)容即可:
{
"add_nics": [
xxxxx這部分內(nèi)容就是前面自動生成的部分流部,包含前后的方括號
]
}
- 刪除網(wǎng)卡戚绕,根據(jù)1步獲取到的mac地址刪除網(wǎng)卡,命令如下:
echo '{"remove_nics": ["<mac>"]}' |vmadm update <vm_uuid>
- 添加網(wǎng)卡
cat add_nic.json | vmadm update <vm_uuid>
- 重啟虛擬機枝冀,不要在vm內(nèi)執(zhí)行重啟命令舞丛,不然不生效
vmadm reboot <vm_uuid>
3.VLAN設(shè)置
VLAN的配置表如下:
VLANID | 用途 | 交1口1 | 交1口2 | 交1口3 | 交1其他 | 路WAN | 路LAN | 交2口1 | 交2口2 | 交2其他 |
---|---|---|---|---|---|---|---|---|---|---|
1 | 主要承載局域網(wǎng)數(shù)據(jù) | 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設(shè)置
光貓的配置比較簡單户辱,我只配置IPTV的VLAN使得與交1口1連接的光貓口可以發(fā)送IPTV的數(shù)據(jù)鸵钝,即做VLAN綁定,如下圖:
注:用戶側(cè)的VLAN就是上表中在交換機中配置的vlanid焕妙,只是我這里和光貓中的vlan剛好配成了一樣的蒋伦。
梅林的VLAN設(shè)置
梅林的配置即簡單也復雜,復雜的是界面上沒有配置的地方焚鹊,簡單的是只需要執(zhí)行以下一條命令:
robocfg vlans reset vlan 1 ports "0 1 2 3 4 5t" vlan 2 ports "4t 5u"
注:這個port端口每臺設(shè)備不完全一樣痕届,最好是先執(zhí)行robocfg show看看自己設(shè)備的端口對應關(guān)系韧献。這條命令的意思就是將wan口(端口4)加入到vlan1即本地局域網(wǎng),在vlan1是untag的研叫,在vlan2是tag的
交換機的VLAN設(shè)置
交換機上的配置則相對簡單锤窑,在界面上按表格中的配置完成即可。注意PVID和VLAN都需要設(shè)置嚷炉。
SmartOS的VLAN設(shè)置
SmartOS上渊啰,并未找到虛擬機中單網(wǎng)卡配置多VLAN的方法,我的辦法是直接為軟路由的虛擬機增加兩塊新的網(wǎng)卡分別指定vlanid是2和45申屹。命令和修改mac地址的添加網(wǎng)卡的步驟很相似绘证,只需要把添加網(wǎng)卡的json配置文件修改vlanid以及mac地址即可。添加后vmadm reboot使添加的設(shè)備生效哗讥。
4.軟路由創(chuàng)建或修改IPTV嚷那,WAN接口
創(chuàng)建接口和普通openwrt創(chuàng)建接口的方式一樣,注意選擇網(wǎng)絡(luò)接口時杆煞,IPTV的接口應該是對應vlanid是45的虛擬網(wǎng)卡魏宽,WAN接口的應該是vlanid為2的虛擬網(wǎng)卡。也可以在宿主機smartos上執(zhí)行命令確認:
vmadm get <vm_uuid> | json nics
命令輸出的網(wǎng)卡接口編號和虛擬機內(nèi)ethx的編號是對應的决乎,也是和添加網(wǎng)卡的順序號對應的队询。
創(chuàng)建的接口名字、防火墻區(qū)域名字后續(xù)需要使用构诚,防火墻區(qū)域的名字建議和接口名字一樣蚌斩。
5.IPTV轉(zhuǎn)發(fā)配置
這部分需要配置兩個軟件udpxy和igmpproxy。
udpxy的主要功能是將多播的udp數(shù)據(jù)流轉(zhuǎn)成TCP的單播數(shù)據(jù)流唤反,直觀感受就是可以使用vlc之類的播放工具可用http://x.x.x.x:8888/udp/y.y.y.y:z 網(wǎng)絡(luò)流地址進行播放IPTV埂奈,對無線路由器的負載會小很多竿刁。
igmpproxy的主要功能是實現(xiàn)IGMP協(xié)議的自動路由轉(zhuǎn)發(fā),IPTV用IGMP協(xié)議較多随常,直觀感受就是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#把組播的網(wǎng)絡(luò)地址找出來寫在這里也可以告材,直接用這個簡單
config phyint #下行流量配置,默認就可以古劲,只是需要確認你的LAN的名稱在軟路由中是lan即可
option network lan
option zone lan
option direction downstream
服務的啟動命令:
/etc/init.d/igmpproxy start
軟路由上IGMP版本設(shè)置
操作很簡單斥赋,但很關(guān)鍵,就是這一小步是導致幾年前的折騰不成功的主要原因绢慢,以前只是改了本地操作系統(tǒng)的IGMP的版本灿渴,改了之后電腦撥號后是可以用vlc播放rtp格式的iptv鏈接的。修改路由上IGMP版本只需要執(zhí)行一條命令即可胰舆,后面會將它加到開機腳本骚露。
echo 2 > /proc/sys/net/ipv4/conf/all/force_igmp_version
這條命令就是修改igmp的默認版本號為2,如果不改的話缚窿,這個值默認是0棘幸,使用的IGMPv3,本地電信IPTV用的IGMPv2.
6.路由設(shè)置
在我的網(wǎng)絡(luò)環(huán)境下倦零,上網(wǎng)還是用的硬路由误续,iptv是軟路由,所以還需要做一些路由設(shè)置扫茅。如果使用同一個路由蹋嵌,則做的路由設(shè)置或負載均衡策略的配置是不一樣的。主要目的就是將IPTV的流量數(shù)據(jù)轉(zhuǎn)發(fā)至正確的接口葫隙。
主路由 梅林
網(wǎng)絡(luò)地址是IPTV的服務器的地址段栽烂,網(wǎng)關(guān)是我軟路由的地址。
軟路由 Openwrt
軟路由上也需要設(shè)置路由策略恋脚,畢竟我的軟路由上也還跑了一些其他服務腺办,策略和主路由上的類似,只是將其轉(zhuǎn)到IPTV的網(wǎng)絡(luò)接口上糟描。
7.防火墻設(shè)置
IPTV主要是在局域網(wǎng)內(nèi)播放怀喉,所以防火墻上的設(shè)置主要是在軟路由上進行配置。
Openwrt的防火墻配置個人覺得比較復雜船响,了解的還不是很清楚躬拢,所以暫時軟路由只配置了IPTV的策略躲履,也不確認開的策略是不是大了。WAN口的策略未做過多的配置估灿,WAN的撥號只是測試了正常撥號崇呵,基本上WAN口未啟用。上圖的策略總共做了四條馅袁,分別是允許LAN網(wǎng)絡(luò)的數(shù)據(jù)到IPTV區(qū)域的數(shù)據(jù)轉(zhuǎn)發(fā)域慷;允許IPTV網(wǎng)絡(luò)的數(shù)據(jù)通過LAN區(qū)域轉(zhuǎn)發(fā);允許IGMP協(xié)議從IPTV網(wǎng)絡(luò)區(qū)域到軟路由轉(zhuǎn)發(fā)汗销;允許UDP協(xié)議的數(shù)據(jù)從IPTV轉(zhuǎn)發(fā)至LAN區(qū)域犹褒。
完成這步后,IPTV撥號成功后弛针,應該就可以通過VLC等播放器看IPTV的節(jié)目了叠骑。
8.開機腳本配置
由于修改了梅林的默認VLAN,以及指定了路由IGMP的版本削茁,這些配置重啟后會失效宙枷,所以需要通過一些腳本將其在重啟后自動設(shè)置,實現(xiàn)的方式應該有多種茧跋,我的方法不一定最合理的慰丛。
主路由梅林的VLAN設(shè)置
創(chuàng)建開機啟動腳本,保存路徑/jffs/scripts/init-start瘾杭,腳本內(nèi)容:
#!/bin/sh
robocfg vlans reset vlan 1 ports "0 1 2 3 4 5t" vlan 2 ports "4t 5u"
軟路由Openwrt的IGMP版本設(shè)置
在udpxy的服務的啟動腳本加入指定Igmp版本的命令诅病,路徑 /etc/init.d/udpxy:
start_service() {
echo 2 > /proc/sys/net/ipv4/conf/all/force_igmp_version #在啟動函數(shù)中增加此行
config_load udpxy
config_foreach start_instance udpxy
}
解決問題的一些思路
斷斷續(xù)續(xù)折騰這個問題也有了幾年了,也放棄過幾次了粥烁。這次折騰的環(huán)境實際上是比以前折騰的環(huán)境更復雜了贤笆,smartos虛擬化的設(shè)置,OpenWrt的配置讨阻,VLAN的配置芥永,IPTV數(shù)據(jù)轉(zhuǎn)發(fā)的配置,IPTV和WAN單線復用撥號都最多只能算半懂钝吮,就是只知道原理恤左,實際配置都是找參考看手冊。為了降低折騰的復雜度搀绣,用了一些輔助設(shè)備和工具,逐步排除一些不確定的影響因素戳气。
1. 排除虛擬化的未知影響链患,N1模擬旁路由
開始時比較擔心不確定因素較多的時候不好排錯,軟路由畢竟運行在smartos中瓶您,虛擬化的一些配置也是第一次麻捻,也不太容易確定是否正確纲仍,網(wǎng)上也幾乎找不到相似用途的參考,所以用N1刷了Openwrt的固件模擬了軟路由贸毕。在未折騰前郑叠,我的軟路由也只有一個虛擬網(wǎng)卡,所以和N1做軟路由的場景很相似明棍。當N1成功后乡革,至少知道了OpenWrt和IPTV的配置。
2. K2p刷OpenWrt摊腋,確保Vlan配置正確
為了解決單線復用IPTV和WAN沸版,需要在這帶一些網(wǎng)管功能的交換機上進行配置,關(guān)鍵它的配置和以前接觸到的VLAN概念差異還比較大兴蒸。而且SmartOS的vlan配置也沒做過视粮,所以先用K2p刷OpenWrt確保交換機上的VLAN配置正確,再去解決SmartOS的VLAN配置橙凳。
3. WireShark抓包排錯
這次最終能折騰成功蕾殴,多虧wireshark進行網(wǎng)絡(luò)報文的分析。通過wireshark分析路由器上撥號用的網(wǎng)絡(luò)端口上獲取的數(shù)據(jù)岛啸,發(fā)現(xiàn)路由器內(nèi)部使用的IGMP協(xié)議的版本是3钓觉;通過分析軟路由PPPoe撥號的數(shù)據(jù)和N1PPPoe撥號的數(shù)據(jù),發(fā)現(xiàn)本地管理的mac的撥號請求值戳,光貓是不會響應的议谷。這兩個問題基本是最不容易發(fā)現(xiàn)的問題,其他做路由轉(zhuǎn)發(fā)IPTV的參考資料中都很少提到堕虹,特別是PPPoe撥號的問題卧晓。
避坑要點
- 虛擬網(wǎng)卡的Mac不能是本地管理地址,否則PPPoe撥號請求不會響應
- IGMP的版本必須是2赴捞,路由器中轉(zhuǎn)發(fā)時也必須是IGMPv2逼裆,默認v3
-
非網(wǎng)絡(luò)專業(yè)人士使用普通家用網(wǎng)管交換機時忘掉專業(yè)設(shè)備上的VLAN概念,不用去做概念上的對應赦政,不然更容易把自己搞糊涂胜宇。個人理解家用網(wǎng)管交換機就是靠vlanid、tag恢着、untag桐愉、pvid來實現(xiàn)所有vlan的功能,創(chuàng)建vlan時掰派,指定vlanid選擇端口號設(shè)置tag从诲、untag,表示這個vlan的數(shù)據(jù)會在這些端口內(nèi)進行轉(zhuǎn)發(fā)靡羡,tag表示從這個端口出去的數(shù)據(jù)會打上vlan標簽系洛,untag則是去掉標簽發(fā)出去俊性,主要是避免一些網(wǎng)絡(luò)客戶端不支持剝離vlan tag(目前大部分設(shè)備應該是支持自動剝離的),下圖上的清掉選項則表示這個端口不參與該vlan的數(shù)據(jù)轉(zhuǎn)發(fā)描扯,網(wǎng)絡(luò)設(shè)備間的連接端口參與vlan內(nèi)數(shù)據(jù)轉(zhuǎn)發(fā)時一定要設(shè)置為tag定页;pvid就是表示這個端口收的數(shù)據(jù)沒有vlan tag時默認打上值為pvid的vlan tag然后數(shù)據(jù)轉(zhuǎn)發(fā);還有一個特殊的vlan id=1绽诚,這個vlan是包含了所有的端口典徊,都是untag,而且是不可以修改的憔购,雖然有些辦法可以繞過限制修改但最好還是不要改宫峦,整個內(nèi)網(wǎng)環(huán)境也主要是跑在這個vlan內(nèi)。
- SmartOS的網(wǎng)絡(luò)配置修改了后記得通過vmadm reboot重啟生效玫鸟,而非OS內(nèi)reboot导绷,不然還以為是配置錯了或者功能不支持
- OpenWrt的Vlan設(shè)置,接口創(chuàng)建時選擇eth0.45的設(shè)備就表示使用網(wǎng)卡0上vlan tag是45的的數(shù)據(jù)包
- SmartOS 虛擬機內(nèi)沒找到單虛擬網(wǎng)卡指定多vlan tag的配置屎飘,可以針對不同的vlan創(chuàng)建不同的虛擬網(wǎng)卡妥曲,區(qū)別只是在不同的位置虛擬網(wǎng)卡
- RTP防火墻未放通IGMP和UDP的時,igmpproxy是無法正常工作的
- Udpxy轉(zhuǎn)發(fā)UDP數(shù)據(jù)時的上游IP地址通過綁定接口設(shè)置時可能會因為bug出現(xiàn)和PPPoe取得的IP地址不一致的情況
感覺已經(jīng)好久好久沒有做成一件事了钦购。