En esta tercera entrada complementaria a los Mods del Servidor I y Mods del Servidor II, vamos a darle un pequeño empuje adicional a las opciones que vimos en el post Seguridad de Red y añadir un extra sobre el entorno Multimedia de nuestro Servidor.

Pi-hole PLUS+

Pi-hole configura por defecto unas listas de bloqueos durante su instalación, dichas listas no estan nada mal para empezar, pero enseguida nos damos cuenta de la cantidad de ADS/Mierdato que circula por la red. Lo que vamos a realizar es una backup del fichero de instalación y configurar listas adicionales:

sudo mv /etc/pihole/adlists.list /etc/pihole/adlists.old && sudo nano /etc/pihole/adlists.list

Y le añadimos el siguiente contenido:

https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
https://mirror1.malwaredomains.com/files/justdomains
http://sysctl.org/cameleon/hosts
https://zeustracker.abuse.ch/blocklist.php?download=domainblocklist
https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt
https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
https://hosts-file.net/ad_servers.txt
https://lordpedal.ddns.net/personal.host
https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/fakenews-gambling/hosts
https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt
https://raw.githubusercontent.com/anudeepND/blacklist/master/CoinMiner.txt
https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-blocklist.txt
https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-malware.txt
https://zerodot1.gitlab.io/CoinBlockerLists/list.txt
https://zerodot1.gitlab.io/CoinBlockerLists/list_browser.txt
https://zerodot1.gitlab.io/CoinBlockerLists/list_optional.txt
https://raw.githubusercontent.com/r-a-y/mobile-hosts/master/AdguardMobileAds.txt
https://raw.githubusercontent.com/r-a-y/mobile-hosts/master/AdguardMobileSpyware.txt
https://raw.githubusercontent.com/jerryn70/GoodbyeAds/master/Hosts/GoodbyeAds.txt
https://raw.githubusercontent.com/EnergizedProtection/block/master/ultimate/formats/hosts.txt
https://raw.githubusercontent.com/crazy-max/WindowsSpyBlocker/master/data/hosts/spy.txt
https://tspprs.com/dl/spotify
https://gist.githubusercontent.com/BBcan177/4a8bf37c131be4803cb2/raw/343ff780e15205b4dd0de37c86af34cfb26b2fbe/MS-2
https://gist.githubusercontent.com/BBcan177/b6df57cef74e28d90acf1eec93d62d3b/raw/f0996cf5248657ada2adb396f3636be8716b99eb/MS-4
https://ransomwaretracker.abuse.ch/downloads/RW_DOMBL.txt
https://ransomwaretracker.abuse.ch/downloads/CW_C2_DOMBL.txt
https://ransomwaretracker.abuse.ch/downloads/LY_C2_DOMBL.txt
https://ransomwaretracker.abuse.ch/downloads/TC_C2_DOMBL.txt
https://ransomwaretracker.abuse.ch/downloads/TL_C2_DOMBL.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/adaway.org/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/adblock-nocoin-list/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/adguard-simplified/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/anudeepnd-adservers/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/disconnect.me-ad/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/disconnect.me-malvertising/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/disconnect.me-malware/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/disconnect.me-tracking/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/easyprivacy/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/eth-phishing-detect/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/fademind-add.2o7net/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/fademind-add.dead/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/fademind-add.risk/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/fademind-add.spam/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/kadhosts/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/malwaredomainlist.com/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/malwaredomains.com-immortaldomains/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/malwaredomains.com-justdomains/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/matomo.org-spammers/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/mitchellkrogza-badd-boyz-hosts/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/pgl.yoyo.org/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/ransomwaretracker.abuse.ch/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/someonewhocares.org/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/spam404.com/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/stevenblack/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/winhelp2002.mvps.org/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/zerodot1-coinblockerlists-browser/list.txt
https://raw.githubusercontent.com/hectorm/hmirror/master/data/zeustracker.abuse.ch/list.txt
https://raw.githubusercontent.com/CHEF-KOCH/Audio-fingerprint-pages/master/AudioFp.txt
https://raw.githubusercontent.com/CHEF-KOCH/Canvas-fingerprinting-pages/master/Canvas.txt
https://raw.githubusercontent.com/CHEF-KOCH/WebRTC-tracking/master/WebRTC.txt
https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-blocklist.txt
https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-malware.txt
https://www.stopforumspam.com/downloads/toxic_domains_whole.txt

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y actualizamos los bloqueos en Pi-hole:

pihole -g

Pasaremos de bloquear ±130k dominios a ±920k dominios. Adjunto resultante de ejecutar programa:

pi@overclock:~$ pihole -g
  [i] Pi-hole blocking is enabled
  [i] Neutrino emissions detected...
  [✓] Pulling blocklist source list into range

  [i] Target: raw.githubusercontent.com (hosts)
  [✓] Status: Retrieval successful

  [i] Target: mirror1.malwaredomains.com (justdomains)
  [✓] Status: No changes detected

  [i] Target: sysctl.org (hosts)
  [✓] Status: No changes detected

  [i] Target: zeustracker.abuse.ch (blocklist.php?download=domainblocklist)
  [✓] Status: No changes detected

  [i] Target: s3.amazonaws.com (simple_tracking.txt)
  [✓] Status: No changes detected

  [i] Target: s3.amazonaws.com (simple_ad.txt)
  [✓] Status: No changes detected

  [i] Target: hosts-file.net (ad_servers.txt)
  [✓] Status: No changes detected

  [i] Target: lordpedal.ddns.net (personal.host)
  [✓] Status: No changes detected

  [i] Target: raw.githubusercontent.com (hosts)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (adservers.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (CoinMiner.txt)
  [✓] Status: Retrieval successful

  [i] Target: gitlab.com (notrack-blocklist.txt)
  [✓] Status: Retrieval successful

  [i] Target: gitlab.com (notrack-malware.txt)
  [✓] Status: Retrieval successful

  [i] Target: zerodot1.gitlab.io (list.txt)
  [✓] Status: No changes detected

  [i] Target: zerodot1.gitlab.io (list_browser.txt)
  [✓] Status: No changes detected

  [i] Target: zerodot1.gitlab.io (list_optional.txt)
  [✓] Status: No changes detected

  [i] Target: raw.githubusercontent.com (AdguardMobileAds.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (AdguardMobileSpyware.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (GoodbyeAds.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (hosts.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (spy.txt)
  [✓] Status: Retrieval successful

  [i] Target: tspprs.com (spotify)
  [✓] Status: No changes detected

  [i] Target: gist.githubusercontent.com (MS-2)
  [✓] Status: Retrieval successful

  [i] Target: gist.githubusercontent.com (MS-4)
  [✓] Status: Retrieval successful

  [i] Target: ransomwaretracker.abuse.ch (RW_DOMBL.txt)
  [✓] Status: No changes detected

  [i] Target: ransomwaretracker.abuse.ch (CW_C2_DOMBL.txt)
  [✓] Status: No changes detected

  [i] Target: ransomwaretracker.abuse.ch (LY_C2_DOMBL.txt)
  [✓] Status: No changes detected

  [i] Target: ransomwaretracker.abuse.ch (TC_C2_DOMBL.txt)
  [✓] Status: No changes detected

  [i] Target: ransomwaretracker.abuse.ch (TL_C2_DOMBL.txt)
  [✓] Status: No changes detected

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (list.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (AudioFp.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (Canvas.txt)
  [✓] Status: Retrieval successful

  [i] Target: raw.githubusercontent.com (WebRTC.txt)
  [✓] Status: Retrieval successful

  [i] Target: gitlab.com (notrack-blocklist.txt)
  [✓] Status: Retrieval successful

  [i] Target: gitlab.com (notrack-malware.txt)
  [✓] Status: Retrieval successful

  [i] Target: www.stopforumspam.com (toxic_domains_whole.txt)
  [✓] Status: Retrieval successful

  [✓] Consolidating blocklists
  [✓] Extracting domains from blocklists
  [i] Number of domains being pulled in by gravity: 1368098
  [✓] Removing duplicate domains
  [i] Number of unique domains trapped in the Event Horizon: 918557
  [i] Number of whitelisted domains: 0
  [i] Number of blacklisted domains: 0
  [i] Number of regex filters: 0
  [✓] Parsing domains into hosts format
  [✓] Cleaning up stray matter

  [✓] Force-reloading DNS service
  [✓] DNS service is running
  [✓] Pi-hole blocking is Enabled
  
pi@overclock:~$

A continuación vamos a editar unas reglas para activar unos filtros adicionales, para ello editamos el siguiente fichero:

sudo nano /etc/pihole/regex.list

Y le agregamos el siguiente contenido:

(^r[[:digit:]]+(.|-+)[[:alnum:]]+-+[[:alnum:]]+-+[[:alnum:]]+.)(googlevideo|gvt1).com$
^(.+[-.])??adse?rv(er?|ice)?s?[0-9][-.]
^(.+[-.])??m?ad[sxv]?[0-9][-.]
^adim(age|g)s?[0-9][-.]
^adtrack(er|ing)?[0-9][-.]
^advert(s|is(ing|ements?))?[0-9][-_.]
^aff(iliat(es?|ion))?[-.]
^analytics?[-.]
^banners?[-.]
^beacons?[0-9][-.]
^count(ers?)?[0-9][-.] ^pixels?[-.]
^stat(s|istics)?[0-9][-.]
^telemetry[-.]
^track(ers?|ing)?[0-9]*[-.]
^traff(ic)?[-.]

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y reiniciamos la gestión DNS en Pi-hole:

pihole restartdns
pi@overclock:~$ pihole restartdns
  [✓] Restarting DNS service
pi@overclock:~$

XUPNPD v2

Ya vimos que Xupnpd servia como DLNA de canales y contenido multimedia de forma excepcional.

Entonces ¿para que añadir otro Xupnpd? La respuesta es bien sencilla a mi modo de ver. Si bien la v1 funciona a la perfección con enlaces unicast no reproduce de forma correcta enlaces HLS y la v2 en mi experiencia le ocurre lo opuesto. Por este motivo he decidido que coexistan los dos en el Servidor. Vamos a clonar el repositorio:

cd ~/source && git clone https://github.com/clark15b/xupnpd2.git

Ahora vamos a preparar el entorno de compilación, compilar y configurar el programa:

cd ~/source/xupnpd2 && cp Makefile.linux Makefile && make && cp xupnpd xupnpd2 && mv xupnpd.cfg xupnpd.cfg.old && nano xupnpd.cfg

Y le agregamos el siguiente contenido tal cual:

#
# Copyright (C) 2015-2018 Anton Burdinuk
# clark15b@gmail.com
# http://xupnpd.org
#

# log level: 0 - silent, 1 - errors, 2 - info, 3 - HTTP, 4 - HTTP with headers, 5 - SOAP, 6 - SSDP, 7 - internal, 8 - debug
log_level=0

# log destination
#log_file=xupnpd.log
#log_file=udp://127.0.0.1:514/local0

# detach from terminal
daemon_mode=true

# media
media_root=media/

# default multicast UDP/RTP interface
multicast_interface=br0

# SSDP settings
ssdp_interface=br0               # multicast interface for SSDP exchange, 'auto', 'eth0', 'br0', 'br-lan' for example ('auto', 'lo' and IP for Windows)
ssdp_broadcast_delay=15
ssdp_max_age=1800
ssdp_group_address=239.255.255.250
ssdp_group_port=1900
ssdp_server=eXtensible UPnP agent
ssdp_loop=false
ssdp_ttl=1

# HTTP settings
#http_proxy=user:pass@192.168.6.5:8080
http_port=3044
http_live_port=40000
http_backlog=5
http_rcv_timeout=20
http_snd_timeout=0
http_keep_alive_timeout=15
http_keep_alive_max=10000
http_max_post_size=4096
http_www_root=www/
http_templates=/index.html,/dev.xml

# live streams settings
live_rcv_timeout=120            # timeout for stream source and/or filter
live_snd_timeout=60             # timeout for client before drop current chunk

# UPnP/DLNA settings
upnp_device_name=Lordpedal IPTV v2      # utf-8
upnp_device_uuid=630852f5-6bbd-4068-8f38-7d76f19eb154
upnp_sid_ttl=1800
upnp_objid_offset=100
upnp_live_length=0              # length for live and http stream ('-1' ?)
upnp_live_type=ts               # default type for live streams
upnp_http_type=mp4              # default type for http streams
upnp_logo_profile=JPEG_TN       # type of logos
upnp_hdr_content_disp=true      # Content-Disposition: attachment; filename="file.mp4"

# IO charset
# valid code pages: windows-1251, cp866, utf8, latin1
# windows-1251 default for Windows
# utf8 for other
#io_charset=windows-1251

# db
db_file=xupnpd.db

# reset all dlna extras to '*'
disable_dlna_extras=false

# media excludes
#mime_type_avi=video/x-msvideo
#upnp_proto_avi=http-get:*:video/avi:
#dlna_extras_avi=*

#dlna_extras_ts=DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
#dlna_extras_ts=DLNA.ORG_PN=MPEG_TS_HD_NA;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
dlna_extras_ts=DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
dlna_extras_ts=DLNA.ORG_PN=MPEG_TS_HD_NA;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
dlna_extras_avi=DLNA.ORG_PN=PV_DIVX_DX50;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
dlna_extras_mp4=DLNA.ORG_PN=AVC_MP4_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
dlna_extras_mkv=DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
dlna_extras_mpeg=DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
dlna_extras_wmv=DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
dlna_extras_mp3=DLNA.ORG_PN=MP3;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000

# from old xupnpd
mime_type_ts=video/mpeg
upnp_proto_ts=http-get:*:video/mpeg:
dlna_extras_ts=DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
dlna_extras_ts=*;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
#dlna_extras_ts=DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
#dlna_extras_ts=*;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
dlna_extras_ts=DLNA.ORG_PN=MPEG_TS_HD_NA;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X), movemos el programa a la ruta /etc y le damos permisos root:

cd ~/source && sudo mv xupnpd2 /etc && sudo chown root:root -R /etc/xupnpd2

A continuación vamos a generar una lista de canales y enlaces públicos:

sudo rm /etc/xupnpd2/media/example.m3u && sudo nano /etc/xupnpd2/media/IPTV.m3u

Y le agregamos el siguiente contenido:

#EXTM3U
#EXT-X-M3U: type=ts handler=hls name="IPTV by Lordpedal"
#EXTINF:0 group-title="IPTV",Red Bull TV HD
https://rbmn-live.akamaized.net/hls/live/590964/BoRB-AT/master_6660.m3u8
#EXTINF:-1 group-title="IPTV",Hit TV HD
http://kissfm-cires21-video.secure.footprint.net/hittv/master.m3u8
#EXTINF:-1 group-title="IPTV",RNE
http://rtvev4-live.hss.adaptive.level3.net/egress/ahandler/rtvegl0/irtve08_lv3_aosv4_gl0/irtve08_lv3_aosv4_gl0.isml/master.m3u8
#EXTINF:-1 group-title="IPTV",RNE 3
http://rtvev4-live.hss.adaptive.level3.net/egress/ahandler/rtvegl0/rne_c201_lv3_aosv4_gl0/rne_c201_lv3_aosv4_gl0.isml/master.m3u8
#EXTINF:-1 group-title="IPTV",Los40
https://40-live-hd-f.akamaihd.net/i/CAM40_X@86149/master.m3u8
#EXTINF:-1 group-title="IPTV",Del 40 al 1 HD
https://40al1-lh.akamaihd.net/i/directo40al1_x@764444/master.m3u8
#EXTINF:-1 group-title="IPTV",TVG America
http://america-crtvg.flumotion.com/playlist.m3u8
#EXTINF:-1 group-title="IPTV",Travel TV HD
http://194.179.53.124:1935/live/traveltv/playlist.m3u8
#EXTINF:-1 group-title="IPTV",Miami TV HD
https://59ec5453559f0.streamlock.net/miamitv/smil:miamitvROKU/master.m3u8
#EXTINF:-1 group-title="IPTV",Miami TV Latino HD
https://59ec5453559f0.streamlock.net/canal18/smil:canal18/master.m3u8
#EXTINF:-1 group-title="IPTV",Xite HD
http://highvolume03.streampartner.nl/vleugels_hd6/livestream/master.m3u8
#EXTINF:-1 group-title="IPTV",m2o
http://m2otv-lh.akamaihd.net/i/m2oTv_1@186074/master.m3u8
#EXTINF:-1 group-title="IPTV",TVGE 1
http://rtmp.ott.mx1.com/tvge1/tvge1multi.smil/master.m3u8

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y configuramos arranque del programa al inciar el sistema:

sudo nano /etc/rc.local

Y le agregamos el siguiente contenido una línea previa de la consigna exit 0:

# Xupnpd v2
/etc/xupnpd2/xupnpd2 & >/dev/null 2>&1

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y solo nos queda activar el programa en la sesión actual:

sudo /etc/xupnpd2/xupnpd2 &

Podemos comprobar que el programa esta funcionando correctamente, abriendo en un navegador web a traves de nuestra red local el siguiente enlace:

http://192.168.1.90:3044

TIP: Recuerda sustituir 192.168.1.90 por la IP de tu Servidor

YOUTUBE-DL

Es un programa escrito en python que nos facilita cierta gestión de contenido en las redes de streaming. Primeramente debemos de actualizar los repositorios e instalar el paquete:

sudo apt-get update && sudo apt-get -y install youtube-dl

El problema que nos vamos a encontrar es que la versión que acabamos de instalar es antigua y con limitaciones de uso importantes. Si tratamos de actualizar el programa nos dira:

pi@overclock:~$ sudo youtube-dl -U
It looks like you installed youtube-dl with a package manager, pip, setup.py or a tarball. Please use that to update.
pi@overclock:~$

Resumiendo nos viene a decir que no es posible actualizar sino es vía APT. Para solucinar el problema vamos a forzar la actualización:

sudo wget -O /usr/bin/youtube-dl http://yt-dl.org/downloads/latest/youtube-dl && sudo chmod a+rx /usr/bin/youtube-dl && sudo wget http://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl && sudo chmod a+rx /usr/local/bin/youtube-dl

Y si probamos nuevamente a actualizar:

pi@overclock:~$ sudo youtube-dl -U
youtube-dl is up-to-date (2019.05.20)
pi@overclock:~$

Ya podremos actualizar el programa desde la terminal cuando queramos.