Este apunte forma parte de «Movistar Fusión Fibra + TV + VoIP con router Linux«. Aquí me ocupo en detalle de la configuración de los «Videos bajo demanda». Desde el Decodificador es posible seleccionar y ver videos bajo demanda en dos situaciones: 1) reproducir una grabación o 2) reproducir un video, serie, etc. desde la parrilla de Movistar TV, pero para que esto funcione tu Router debe soportar una cosa que se llama «Full Cone NAT» y como Linux no lo implementa en el kernel entonces no es sencillo hacerlo funcionar, así que he dedicado un artículo entero a este concepto.
Full Cone NAT vs «netfilter rtsp»
Hay varios tipos de NAT y no es el objeto describirlos aquí, lo que sí que tienes que tener en cuenta es que necesitas usar Full Cone NAT (o algo parecido) para poder ver los videos bajo demanda (si mirás la configuración del router que te deja Movistar verás que lo trae activo en el interfaz IPTV, vlan2). ¿Porqué hace falta? pues porque los Decos solicitan los videos mediante el protocolo RTSP a un servidor X pero el que realmente entrega el stream MPEG2(TS) es otro servidor Y completamente distinto, enviando tráfico desde una IP distinta y desconocida para el router, tráfico que se descartará si no tenemos algo «especial» configurado.
Como el Kernel de Linux no soporta Full Cone NAT tenemos que buscar otra opción. Ahí es donde entra en juego un módulo para el kernel llamado «netfilter rtsp», se trata de un pequeño pero potente paquete de software libre desarrollado para resolver precisamente este problema, identifica las peticiones de video bajo demanda (flujos RTSP) e instala lo necesario en el kernel para aceptar el tráfico cuando empiece a llegar.
¿Cómo funciona?
Sigamos el gráfico anterior. Cuando pulsas el botón «Movistar TV» en tu mando, el Deco busca al servidor que gestiona la parrilla, lo primero que hace es enviar una consulta al DNS Server (1) para preguntar quién es el servidor que gestiona la parrilla y los menús. Una vez que consigue su dirección establece un diálogo con él (2) y es ahí donde recibes y ves los menús en tu tele. Navegando por los menús y una vez seleccionas una grabación, serie o película y pulsas en «Ver», el deco solicita el video a otro servidor distinto que llamo gestor de videos bajo demanda (3) mediante el protocolo RTSP. En esta última petición se envía un paquete SETUP que contiene el número del puerto por el que el Deco se quedará escuchando para recibir el futuro video. Mientras el deco espera, el gestor de videos bajo demanda solicita (4) que uno de los servidores que llamo MPEG Servers envíe de vuelta el stream de video MPEG (5) al puerto que se solicitó en el paquete SETUP.
En el gráfico de captura anterior vemos como el Deco solicita que se envíe el video al puerto 27171. El servidor que hará de emisor del stream MPEG será distinto y empezará a enviar tráfico MPEG-2 TS (Transport Stream) en modo Unicast a la IP visible del router (Linux) al puerto solicitado (27171 en este ejemplo). El router (Linux) deberá instalar una regla dinámica para que todo tráfico recibido en su IP exterior y ese puerto se conmute hacia el Deco solicitante y mismo puerto.
¿Cómo lo implemento?
Para conseguir que nuestro Linux haga todo esto necesitamos activar «conntrack» en el Kernel e instalar el programa «Netfilter RTSP», que a fecha 18/Oct/2014 estaba en la versión 3.7-v2. Muy importante: verás que hay que aplicarle un pequeño parche para que funcione con Movistar TV.
Nota 1: En este ejemplo verás que pongo la dirección 10.214.XX.YY como la IP del interfaz vlan2, recuerda que es una dirección IP fija que te asigna Movistar, tal como describo en «Movistar Fusión Fibra + TV + VoIP con router Linux»
Nota 2: Estas pruebas están hechas con el kernel 3.17.0 y en Gentoo «NO» he usado el paquete net-firewall/rtsp-conntrack-3.7, dado que instala unav ersión más antigua. Descargué los fuentes originales y los compilé de forma manual.
1.- Descarga, parchea, compila e instala el programa Netfilter RTSP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | ___DESCARGA___ # mkdir /tmp/rtsp # cd /tmp/rtsp # wget http://mike.it-loops.com/rtsp/rtsp-module-3.7-v2.tar.gz : # tar xvfz rtsp-module-3.7-v2.tar.gz # rm rtsp-module-3.7-v2.tar.gz ___PATCH___ Copia/Pega desde pastebin el parche: http://pastebin.com/4QZ2r7eV Crea un fichero por ejempo en: /tmp/rtsp-3.7-v2.patch # patch < /tmp/rtsp-3.7-v2.patch ___COMPILA___ # make debug : ___INSTALA MODULOS KERNEL___ # make modules_install : # ls -al /lib/modules/3.17.0-gentoo/extra/ total 36 drwxr-xr-x 2 root root 4096 oct 18 16:37 . drwxr-xr-x 5 root root 4096 oct 18 16:41 .. -rw-r--r-- 1 root root 13305 oct 18 16:41 nf_conntrack_rtsp.ko -rw-r--r-- 1 root root 11369 oct 18 16:41 nf_nat_rtsp.ko |
Empleo la opción «debug» al hacer el make. Te recomiendo que lo uses para poder enterarte de lo que está pasando en el log del kernel.
2.- Cargamos el nuevo módulo en el Kernel
Una vez terminada la compilación e instalación anterior ya puedes cargar los módulos en el Kernel:
1 2 3 4 | # modprobe nf_conntrack_rtsp (Este módulo se encarga de "detectar" el SETUP RTSP) # modprobe nf_nat_rtsp (Este módulo se encarga de establecer la asociación (nat)) |
Te vuelves a tu Deco, entras en el menú Movistar TV, busca una grabación y pula en «ver», debería funcionar. Puedes comprobar con el comando dmesg que la asociación es correcta, algo parecido a lo siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # dmesg [358463.389458] nf_conntrack_rtsp v0.7.2 loading [358463.389462] port #0: 554 [359189.716507] nf_nat_rtsp v0.7.2 loading : [359263.569596] conntrackinfo = 2 [359263.576080] IP_CT_DIR_REPLY [359263.583559] IP_CT_DIR_REPLY [359263.585568] found a setup message [359263.585577] tran='Transport: MP2T/H2221/UDP;unicast;client_port=27336' [359263.585596] lo port found : 27336 [359263.585597] udp transport found, ports=(0,27336,27336) [359263.585600] expect_related 0.0.0.0:0-10.214.XX.YY:27336 [359263.585601] NAT rtsp help_out [359263.585603] hdr: len=9, CSeq: 3 [359263.585604] hdr: len=25, User-Agent: MICA-IP-STB [359263.585605] hdr: len=53, Transport: MP2T/H2221/UDP;unicast;client_port=27336 [359263.585606] hdr: Transport [359263.585608] stunaddr=10.214.XX.YY (auto) [359263.585610] using port 27336 [359263.585613] rep: len=53, Transport: MP2T/H2221/UDP;unicast;client_port=27336 [359263.585614] hdr: len=14, x-mayNotify: [359263.624565] IP_CT_DIR_REPLY [359263.718991] IP_CT_DIR_REPLY [359263.992779] IP_CT_DIR_REPLY [359264.285029] IP_CT_DIR_REPLY |
Instalación final
Una vez lo tengas todo funcionando te recomiendo que recompiles sin «debug», vuelvas a instalar los módulos y programes su carga durante el arranque del equipo
Recompila e instala
1 2 3 4 5 6 7 | # cd /tmp/rtsp # make clean # make # make modules_install (quedan copiados en /lib/modules/3.17.0-gentoo/extra/) : |
Nota: Recuerda que si compilas e instalas un nuevo Kernel, tendrás que recompilar e instalar de nuevo estos dos módulos.
Programa su carga durante el boot, añade lo siguiente final del fichero /etc/conf.d/modules
1 2 3 | : modules="nf_conntrack_rtsp" modules="nf_nat_rtsp" |
Monitorizar
Dejo aquí algunos comandos útiles que te pueden servir para monitorizar qué está pasando:
Ver qué ocurre (debes compilar con opción debug)
1 2 3 | # dmesg |
Ver qué flujos UDP tienes contra tu IP fija en la vlan 2. Recuerda cambiar 10.214.XX.YY por tu ip), en Gentoo instala las conntrack tools con «# emerge -v conntrack-tools»
1 2 3 | # /usr/sbin/conntrack -L | grep 10.214.XX.YY | grep udp; |
Comprobar si se creo NAT hacia IP de un Deco concreto (.200 en el ejemplo)
1 2 3 4 5 6 7 8 | # netstat -nat -n | grep 192.168.1.200 Se vería algo así: : udp 17 29 src=172.26.83.137 dst=10.214.XX.YY sport=48440 dport=27645 [UNREPLIED] src=192.168.1.203 \ dst=172.26.83.137 sport=27645 dport=48440 mark=0 use=1 : |
Buenas, interesantisima solucion, Yo resolvi el "problema" creando una nueva red donde pongo el deco de imagenio y poniendo la ip del deco como DMZ del trafico de la Vlan de imagenio.
Gracias donizt, también buena idea la tuya. Volviendo a este apunte… espero que te sirva por si quieres implementarlo, tiene la ventaja de escalar a más de un deco (por si tienes alguno adicional en el futuro).
Puff estoy intentando implementar en pfsense (freeBSD) y me las estoy pasando canutas…. Estoy pensando en virtualizar un linux solo para vlan de imagenio por que no consigo hacer funcionar el netfilter rtsp 🙁
Buena idea 🙂
Hola, a ver si me puedes ayudar. He sacado trazas de red y en el PC si intento abrir por VLC una petición de una grabacion veo por las trazas de red que empieza a llegar las tramas mpeg pero a los pocos segundos se para y en el VLC en ningún momento llega a verse nada. ¿Donde está el problema?
Que yo sepa esto solo funicona utilizando el Deco de Movistar, que es el que sabe moverse por los menús y solicitar el video. No se me ha ocurrido probarlo con VLC y dudo que funcione, dado que tendría que emular la selección del video, el paquete SETUP, el escuchar por un puerto distinto, etc etc….
El caso es que XBMCIMAGENIO lo han implementado…
Gracias José Luis, pues la verdad que no lo conocía, creo que te refieres a este PLUGIN: https://xbmcimagenio.codeplex.com/ Sí tiene una pinta buenísima. Lo que me deja es la duda si existirá algo parecido para VLC, aunque teniendo este plugin no te hace falta este programa…
Lo del ping (los con tcpdump -i eth2.1 veo que los paquetes salen, pero no «hay respuesta» o el iptables lo está bloqueando)
Lo del igmpproxy es como si algunos paquetes no saliesen desde la IP de la eth2.1 (como si algunos paquetes escapasen al source NAT) (no estoy seguro…)
Buenas Luis, antes de nada quería mostrar mi admiración por los tutos que has subido, impresionantes! Tengo una pequeña duda acerca de la Vlan de IPTV. Habría alguna posibilidad de configurarla de forma que se pueda acceder remotamente via vpn?
Gracias!
Por supuesto, asumiendo que tienes tu linux tal cual describo aquí, solo tienes que añadir un servicio de VPN server a este Linux y conectar con él desde un cliente VPN. Hace tiempo escribí un apunte al respecto, (ojo que es del 2014 y puede que haya cambiado algo o salido algo nuevo). Otra opción más compleja es montar un tunel VPN entre este Linux-IPTV y otro Linux y extender tu red, de hecho puedes conectar dos Tvheadend‘s entre ellos (uno en cada linux y los linux conectados via vpn entre ellos). IMPORTANTE: EN AMBOS CASOS estamos introduciendo ROUTING, por… Read more »