Guide: Telia IP-TV med valfri router (ej bryggat, internt IP, Zappa fungerar m.m)
UPPDATERING! Dessvärre är min guide nedan inte fullständig, en viktig parameter saknas och det är möjligheten att starta om program i boxen och titta på Play/hyrfilmer. Längre ner i tråden finns en diskussion om detta, men kortfattat handlar det om att Tomato (iaf den version jag använder) inte kan skriva om boxens LAN-IP i RTSP-paketen som skickas till Telias VOD-servrar (troligtvis pga att Telias servrar använder sig av port 5055, istället för 554 som är standard för RTSP...suck).
I övrigt funkar resten av den routade lösningen, men den fallerar tyvärr på den här funktionaliteten. Jag har inte hittat någon alternativ lösning på problemet heller, så har fått gå tillbaks till bryggad konfiguration istället.
Om någon provar min guide, och kanske får till det med RTSP ALG (kanske med en annan router eller Tomato version?) så får ni jättegärna skiva här i tråden hur ni gjort!
UPPDATERING 150611
Nu har jag, lite av en slump, kommit över en lösning som gör att guiden blir komplett trots de begränsningar som funnits. Det har dock varit mycket trial and error för att få det sista att funka, men det slipper ju ni som läser detta!
Jag uppdaterar stegen nedan (9a och 9b) med komplett information hur man också numera kan använda boxens alla funktioner, dvs starta om program, spela upp i Play m.m.
Jag har tidigare spenderat en del tid i nedan tråd efter att nyligen blivit kund hos Telia med IP-tv, men den tråden har gått från att handla om Tomato till Asus egna firmware och en bryggad lösning.
Det har dock efterfrågats i tråden om det är möjligt att få till en lösning där TV-boxen befinner sig i routerns lokala nätverk, den enda riktiga fördelen jag kan se med detta är att kunna använda t.ex Zappa-appen eller inspelningsboxs-appen (om man har en sådan).
Jag lyckades få till båda lösningarna, dvs bryggat och routat, med en gammal Netgear WNR2000v2 router och Tomato mini (begränsat flashutrymme). Jag körde först med en Linksys WRT54GL, men insåg snabbt att prestandan inte klarade av min 100Mbps-uppkoppling hos Bahnhoff (ca 30mbps througput WAN-till-LAN). Detta funkar betydligt bättre med Netgearen, den klarar mellan 90 och 95Mbps.
Det var lite bakgrunsinformation, nu kommer själva stegen som behöver tas i Tomato för att få den routade lösningen att fungera. Observera att så länge din router kan köra Tomato så kan du använda valfri router, med hänsyn till prestanda såklart, i mitt fall med Netgearen så har jag inte kört det så länge men det verkar funka. Det enda problemet jag märker just nu är att när jag t.ex kör Bredbandskollen samtidigt som TVn är igång, så börjar det hacka lite, så det är möjligt att Telias egna Thomson är kraftfullare.
Att få till den här routade lösningen för min del har mestadels varit av nyfikenhet.
Då kör vi!
1. Börja med att installera Tomato på din router. Jag kommer inte gå in på detta utan förutsätter att ni vet hur/redan har gjort detta, i annat fall finns det gott om info på Google
2. Konfigurera routern så att det grundläggande fungerar, t.ex Internet.
Konfigurera sedan upp VLAN845 på routern samt taggning på WAN-porten för detta VLAN så att tv-trafiken kommer in i routern. Detta är samma steg som behövs för en bryggad lösning i grunden, så jag kommer inte gå in på det heller, men om någon frågar så ska jag göra mitt bästa att svara.
3. Nu börjar det specifika för en routade lösningen, vill man köra vidare bryggat så får man konfigurera Tomato så att en eller flera av LAN-portarna tillhör VLAN845 (otaggat) och kopplar in boxen på så sätt. Alternativt taggat om man har en switch med i bilden, men denna infon finns att finna i den andra tråden som är länkad ovan.
4. Det första steget är att det nya VLANet behöver få en IP adress, i det här fallet en publik IP från Telia, istället för boxen. Nedan kommando och tillhörande script löser detta.
udhcpc -i vlan845 -b -s /jffs/wan2up.sh -V TeliaSonera_VIP1113 -m
Det viktiga här är -i vlan845, dvs att DHCP-klienten ska efterfråga en IP på TV-vlanet, därefter -V TeliaSoner_VIP1113 som identifierar efterfrågan att komma från en Telia box. Utan detta får man ingen IP från deras DHCP-server!
Jag har fått denna infon genom vanlig hederlig sniff i Wireshark, och jag tror att detta funkar oavsett vilken box man nu har där hemma. Självklart kan ni sniffa själva om ni inte får det att funka.
Kommandot ovan kan lämpligtvis läggas in i WAN-UP scriptet under Administration->Scripts i Tomato webbgränsnitt, så att det överlever omstarter.
Här nedan kommer ett script som ska köras av udhcpc ovan, när en IP-adress tilldelats. Det intressanta med detta är att ingen default gateway läggs till i routing-tabellen, vilket Tomatos egna dhcp-event script annars gör.
#!/bin/sh
# udhcpc simple.script for Tomato dual dynamic wan
[ -z "$1" ] && echo "Error: should be called with parameter from udhcpc" && exit 1
if [ "$interface" = "vlan845" ]; then # only handle vlan2 here
case "$1" in
bound)
logger vlan845 udhcpc bound request to IP "$ip" NM "$subnet" received
/sbin/ifconfig $interface $ip netmask "$subnet"
/sbin/route add -host "$router" dev "$interface"
nvram set wan2_ipaddr="$ip"
nvram set wan2_netmask="$subnet"
nvram set wan2_gateway="$router"
nvram set wan2_get_dns="$dns"
nvram set wan2_server="$serverid"
# nvram commit
;;
renew)
logger vlan845 udhcpc RENEW request to IP "$ip" NM "$subnet" received
;;
deconfig)
logger vlan845 udhcpc deconfigure request receieved
/sbin/ifconfig $interface 0.0.0.0
/sbin/route del -host "$(nvram get wan2_gateway)" dev "$interface"
nvram set wan2_ipaddr="0.0.0.0"
nvram set wan2_gateway="0.0.0.0"
# nvram commit
;;
*)
logger vlan845 udhcpc unknown "$@" request received
;;
esac
fi
exit 0
Det bästa är att bara copy paste, jag har sparat det på JFFS i Tomato men det går att lösa på annat sätt också. Tänk bara på att skriva rätt sökväg i udhcp-kommandot ovan om scriptet inte sparas på JFFS.
Startar man om routern nu så ska routingtabellen innehålla några ny routes, och kör man kommandot "ifconfig vlan845" ska där finnas en publik IP på VLANet!
5. Nästa steg är att ge Telias box en intern IP, vilket den får om man kopplar in den i en vanlig LAN-port på routern. Det räcker däremot inte, utan boxen identifierar sig mot Telia med ovan vendor-specific information och då svarar Telias DHCP-server med en sträng som DHCP option 45. Den svarar också med specifika DNS-servrar inom Telias IP-tv nät, som jag misstänker behövs för bl.a uppstart m.m. Jag har sniffat mig fram till detta i Wireshark också, och kommer klistra in DNSMASQ konfigurationen som behöver göras i Tomato (Under Advanced-menyn) nedan, men kan inte garantera att DHCP-optionen är samma för varje individuell box. Återigen, Wireshark är din vän i den hör lösningen
dhcp-vendorclass=set:tvbox,VIP1113
dhcp-option=tag:tvbox,43,01:05:33:2c:31:2c:33:02:05:33:2c:31:2c:33:64:01:00:0a:12:32:33:39:2e:31:36:2e:31:36:2e:32:30:32:3a:35:35:35:35:0b:01:03:0c:01:0a
dhcp-option=tag:tvbox,option:dns-server,195.67.199.39,195.67.199.40
Vad ovan gör är att när tv-boxen begär en IP-adress från routerns DHCP-server så kommer den identifiera sig med en speciell tagg (VIP1113), vartefter vi säger att DHCP-servern ska imitiera Telias DHCP och skicka ut option 43. Det är den strängen som kanske kan vara individuell för varje box?
Sista raden tilldelar boxen Telias DNS-servrar, utan detta fungerar det inte.
6. Nu har vi kommit en bra bit! Det som återstår är att konfigurera något som heter IGMProxy, som finns i Tomato, och är en proxy som hanterar multicast-strömmar och routningen av dessa.
6a. Aktivera IGMPProxy och kryssa för LAN (under Advanced->Firewall)
6b. Aktivera "Efficient multicast forwarding" (under Advanced->Routing) * Detta är Tomatos implementation av IGMP snooping
6c. Nu behöver IGMP-proxy konfigureras, konfigurationsfilen finns i /etc/igmp.conf men skrivs över av Tomato vid omstart, så kopiera nedan och spara t.ex i en ny fil i /jffs på routern.
quickleave
phyint vlan845 upstream
altnet 192.168.0.0/24 # Din routers lokala nät
altnet 194.22.194.0/24
altnet 193.44.56.0/24
altnet 81.231.201.0/24
altnet 78.71.84.0/24
phyint br0 downstream ratelimit 0
phyint eth1 disabled
Ovan konfiguration funkar för mig, jag kan inte garantera att den kommer funka för er men misstänker att så är fallet.
Vad man anger ovan är att vlan845 är där multicast-strömmarna (TV-nätet) kommer in, "altnet" är de nät som strömmarna skickas ifrån (ovan verkar vara samtliga) och således ska routas in till LANet, och de sista raderna säger att "br0" är det lokala nätet dit strömmarna ska routas och "eth1" (WLAN) skall inte ta del av det. Huruvida detta är nödvändigt vet jag inte, då standard konfiguration är ju att WLAN är bryggat till LANet (br0).
För att rätt instans av IGMPproxy och rätt konfigurationsfil skall startas har jag lagt till nedan kommandon i WAN-UP-scriptet i Tomato.
cp /jffs/igmp.conf /etc/igmp.alt
killall igmpproxy
igmpproxy /etc/igmp.alt
Koden ovan startar om IGMPproxy vid omstart, och kopierar ovan sparade konfiurationsfil från /jffs till /etc.
7. Nu är det strax klart! Det som återstår är att konfigurera brandväggen i Tomato så att rätt trafik tillåts komma in på vlan845, t.ex. multicast-trafiken.
iptables -t nat -A POSTROUTING -o vlan845 -j MASQUERADE
iptables -A FORWARD -i br0 -o vlan845 -j ACCEPT
iptables -A FORWARD -s 239.16.16.0/24 -i vlan845 -o br0 -j ACCEPT
iptables -A FORWARD -s 195.67.199.0/24 -i vlan845 -o br0 -j ACCEPT
iptables -A FORWARD -s 194.236.188.0/24 -i vlan845 -o br0 -j ACCEPT
iptables -A FORWARD -s 193.44.56.0/24 -i vlan845 -o br0 -j ACCEPT
iptables -A FORWARD -s 213.64.59.0/24 -i vlan845 -o br0 -j ACCEPT
iptables -A FORWARD -s 194.22.194.0/24 -i vlan845 -o br0 -j ACCEPT
iptables -A FORWARD -s 81.231.201.0/24 -i vlan845 -o br0 -j ACCEPT
iptables -A FORWARD -s 78.71.84.0/24 -i vlan845 -o br0 -j ACCEPT
Ovan brandväggsregler gör först och främst att trafik som går ut på VLAN845 NAT-as (med Telias publika IP-adress), därefter tillåts inkommande trafik från de nät som vi konfigurerat IGMPproxy med precis samt några nät boxen behöver kontakt med.
8. Routa trafik rätt
Det finns ett sista steg man ska ha med i beräkningen, ovan konfiguration verkar funka men jag har inte testat alla funktioner i boxen (tex hyrfilm m.m.) då det är möjligt att viss trafik (ex. unicast) från boxen på det här sättet kan ta vägen ut via den vanliga internetuppkopplingen. Jag ser två möjligheter till att säkra upp att så inte är fallet, att boxen uteslutet kommunicerar ut över VLAN845.
Alternativ 1.
Ta reda på samtliga ev. nätverk som boxen kan behöva ha åtkomst till, och lägga in dessa som statiska routes i DHCP-scriptet längst upp.
Själv vet jag inte vilka dessa är, så jag har tagit en genväg och gjort enligt alternativ 2 nedan.
UPPDATERING! Nedan statiska routes kan läggas till i Tomatos brandväggsscript, istället för alternativ 2 nedan. Det är de näten som boxen kommunicerar med, t.ex för att ladda ner gränssnittet, kontakta DNS-servrar och streama VOD.
route add -net 195.67.199.0 netmask 255.255.255.0 gw $(nvram get wan2_gateway) dev $(nvram get wan2_ifname) metric 0
route add -net 194.236.188.0 netmask 255.255.255.0 gw $(nvram get wan2_gateway) dev $(nvram get wan2_ifname) metric 0
route add -net 213.64.59.0 netmask 255.255.255.0 gw $(nvram get wan2_gateway) dev $(nvram get wan2_ifname) metric 0
route add -net 194.22.194.0 netmask 255.255.255.0 gw $(nvram get wan2_gateway) dev $(nvram get wan2_ifname) metric 0
Alternativ 2.
Jag har använt mig av en funktion i Linux IP-tables som kallas "policy based routing". Lägg till nedan brandväggsregler så säkerställer man att bara trafik från boxen automatiskt går ut via VLAN845, dvs den kommer inte alls ha tillgång till den vanliga internetuppkopplingen.
ip route add default via $(nvram get wan2_gateway) dev vlan845 table 200
ip rule add from [BOXENS LAN-IP] table 200
Jag har funderat lite på ovan, och vet inte om det kräver mer av routern att routa på detta sätt (prestandamässigt) eller genom statiska routes till förutbestämda nät, om någon har någon åsikt eller kunskap om detta är det bara att hojta till!
9. Möjliggöra Play (VOD) och hyra film --> UPPDATERING 150611
Med reservation för att detta bara drabbar vissa routrar, versioner av Tomato eller kanske kombinationer av detta, så lägger jag till två steg till som behövs ifall ni upplever problemen som står längst upp i guiden (samt har diskuterats längre ner i tråden). I stora drag handlar det om att inte kunna starta om tv-program, spela upp med Play etc. och det beror (troligen) på att Telias servrar använder sig av port 5055, istället för 554 som är standard för RTSP, alternativt att routern inte hanterar RTSP-protokollet korrekt (Telia använder sig av RTSP för VOD/on demand). Jag har dock börjat som sagt misstänka att "felet" ligger hos Telia, och ej i routern, då vissa tester från min sida (VLC) har visat på att RTSP på korrekt port verkar fungera utan nedan work arounds.
Hur som helst, om detta är fallet för er så kan ni följa nedan extra steg, om ni i övrigt följt guiden och allt funkar då behövs inte nedan steg.
9a. Ladda ned "Netsed" (löser "IP-problemet")
Netsed finns här: Ladda ned
- Färdigkompilerat för routrar på MIPS-arkitekturen
Readme: Läs
Dessvärre är det snålt med information på nätet om programmet, då det egentligen används för helt andra syften än vad jag använder det till i det här fallet... läs mer om det i Readme'n som är länkad ovan.
I det här fallet så använder vi oss av programmet för att skriva om den lokala IP-adressen som boxen skickar med när den ska kommunicera med Telias VOD-servrar. Detta är något som Telias router löser på ett annat sätt.
Det görs bara en gång per session, och bara i kontrollpaketen för RTSP-protokollet som skickas mellan boxen och VOD-servern, dvs själva videon går via UDP-portar. Därmed innebär det här programmet ingen märkbar prestandaförsämring i routern, utan det körs i bakgrunden och väntar på anslutningar att vidarebefordra (och skriva om). RTSP-paketen är väldigt små och styr tex play, stop, rewind m.m.
1. Filen som laddas ner via ovan länk behöver inte installeras, utan det räcker att man sparar det på lämpligt ställe i routern. I mitt fall har jag en router utan lagringsutrymme, så jag kör nedan kommando i start-scripten i Tomato vilket gör att programmet laddas ner varje gång routern startar om (tar 2 sek).
cd /tmp
wget http://files.lancethepants.com/Binaries/netsed/mipsel/netsed%...
chmod 755 netsed
2. Nu kan vi starta programmet, som kan och bör köras i bakgrunden. Nedan kommando kan läggas till även det i startscriptet
/tmp/netsed tcp 5000 0 0 's/[LAN-IP]/'$(nvram get wan2_ipaddr)'/o' &
Vi startar programmet som lyssnar efter anslutningar på TCP 5000 (valfritt), skickar vidare trafiken till VOD-servern och innan det gör det skriver det om er box lokala IP till publika IP från Telia.
Observera, har ni fler än en TV-box är det bara att lägga till flera 's/[LAN-IP]/'$(nvram get wan2_ipaddr)'/o' efter varandra.
3. Sista steget är att tala om för routern att trafik på port 5055 skall genom programmet innan det skickas ut på TV-nätet. Nedan kommando löser det.
iptables -t nat -A PREROUTING -p tcp --dport 5055 -j REDIRECT --to-port 5000
Detta är allt som behövs för att lösa IP-adress problemet.
Om detta löser så att ni kan titta på Play m.m. så är det bara att hoppa över nedan punkt (8b).
9b. Konfigurera DMZ eller automatisk portvidarebefordring
Det är möjligt att er router, precis som min (med Tomato), inte hanterar att videoströmmarna till boxen skickas via UDP och också därför dynamiskt behöver öppnas i brandväggen. Vissa routrar och mjukvaror löser detta automatiskt, i mitt fall fick jag lösa det med nedan brandväggsregler. Det är inte helt optimalt, men det är det bästa jag kan tänka mig och har iaf visat sig fungera tillfredställande än så länge. Återigen, troligtvis pga att Telias servrar och boxar kommunicerar på "fel" port!
1. En box
Gå in under Port forwarding -> DMZ och fyll i boxens LAN-IP (boxen måste alltså sen tidigare få samma IP-adress tilldelad via DHCP).
2. Två eller flera boxar (kan även användas för en box)
iptables -t nat -A PREROUTING -i $(nvram get wan2_ifname) -p udp --dport 1000:5554 -j TRIGGER --trigger-type dnat
iptables -t nat -A PREROUTING -i $(nvram get wan2_ifname) -p udp --dport 5556:65535 -j TRIGGER --trigger-type dnat
iptables -t nat -A PREROUTING -i br0 -p tcp --dport 5055 -j TRIGGER --trigger-type out --trigger-proto udp --trigger-match 5055 --trigger-relate 1000-65535
iptables -I FORWARD -i $(nvram get wan2_ifname) -p udp --dport 5554:65535 -j TRIGGER --trigger-type in
iptables -I FORWARD -i $(nvram get wan2_ifname) -p udp --dport 5556:65535 -j TRIGGER --trigger-type in
Ovan regler utnyttjar en funktion som kallas "port trigger", enkelt beskrivet så öppnar routern en serie UDP-portar när utgående trafik upptäcks på TCP port 5055 (när en box börjar spela upp något) och det innebär att Telias VOD-server kan skicka tillbaks videoströmmen till den boxen. Portarna är sedan öppna så länge som det går trafik (en uppspelning pågår) och när det upphör så stänger routern portarna en kort stund efteråt automatiskt (10 min). Detta sker alltså dynamiskt, och lämpar sig därför om ni har fler boxar hemma.
Jag har lagt till två port-serier, för att kunna undanta UDP 5555, då den porten är den som Telia sänder vanlig TV på och ska inte vidarebefordras till någon av boxarna (IGMPproxy på routern tar hand om den). I annat fall kan man inte se på vanliga kanaler på ena boxen om man spelar upp något via VOD på den andra.
I själva verket behöver egentligen boxen en enda UDP-port, men den slumpas fram och vi vet inte exakt vilken port som är aktuell varje gång. Därför säger jag att lösningen inte är optimal, men den är så nära som möjligt. Det optimala vore att routern öppnar en enda, korrekt port, men tyvärr gör inte min router detta iaf.
10. Klart!
Startar man om routern nu och boxen så borde det fungera.
Jag får tillägga att ovan nät som jag konfigurerat IGMPproxy med samt öppnat i brandväggen kanske inte är alla som behövs, men jag har bläddrat runt på alla TV-kanaler och det fungerar för mig än så länge.
Därmed innebär det också att hela denna guiden kan bli inaktuell om/när Telia gör någon förändring, vilket då kan resultera i att något slutar att funka. Har man Telias SMART-router så styr ju dem den, t.ex med mjukvaruuppdateringar, som kommer reflektera ändringar de gör i framtiden.
I vårt fall som kör med en egen lösning så får man helt enkelt felsöka när det inte visar sig funka längre fram. Det som t.ex skulle kunna ske är att de ändrar/lägger till nya nät som de sänder ifrån eller ändrar hur deras boxar identifierar sig och/eller vad de sänder ut för inställningar via DHCP. Allt detta kommer visserligen rätt snabbt märkas av i boxen, och jag kommer att åta mig att uppdatera guiden löpande så länge jag själv är kund hos Telia och använder lösningen själv.
Med ovan sagt, så vill jag också understryka att jag inte tar något ansvar för om lösningen slutar att fungera när ni minst anar det!
Det ska vara allt, jag hoppas någon får till det och att jag har skrivit ihop det någolunda förståeligt
Annars är det bara som sagt att fråga!
Referenser/källor:
http://blog.zipleen.com/2010/10/how-to-make-meo-fiber-iptv-service-work.html
http://crippledcanary.blogspot.se/2014/04/telia-iptv-med-egen...
http://www.projectiwear.org/~plasmahh/t_home.html
https://forum.vpn.ac/discussion/12/tomatousb-policy-based-routing-bypassing-the-vpn
Phenom II X3 720 BE 2,8ghz || Asus M4A785TD-V Evo || 4GB Corsair XMS3 DDR3 1600mhz