Instal­ler l’ex­ten­sion Netflix sur Kodi

Un vidéo projecteur

Bon… j’aime pas Netflix parce que ça utilise des DRM et que ça pue du cul mais la mère de mon gamin a pris un abon­ne­ment (à deux écrans, pour elle et lui) et comme j’ai pas envie qu’il s’use les yeux à regar­der Netflix sur son télé­phone quand il est chez moi… j’ai installé l’ex­ten­sion Netflix sur le Kodi du rasp­berry pi du salon, qui est relié à un vidéo-projec­teur.

J’ai utilisé ce tuto­riel : https://kwar­tix.word­press.com/2019/05/13/netflix-rasp­berry-et-kodi/. Bien fait, mais j’ai rencon­tré des diffi­cul­tés, donc je refais un article avec tout ce que j’au­rais voulu savoir.

Pré-requis

  1. avoir Kodi en version 18 mini­mum. Ça ne m’a pas posé de problème puisque c’était déjà le cas pour moi, mais c’est bon à savoir ;
  2. avoir au moins 2Gio d’es­pace libre : pour choper le bazar de DRM qui va bien, l’ex­ten­sion va télé­char­ger une image Chrome OS, et c’est volu­mi­neux.

Ce qui va nickel dans le tuto

On installe des dépen­dances :

sudo apt install python-pip python-crypto build-essential \
  python-all-dev python-setuptools python-wheel \
  python-crypto-dbg python-crypto-doc python-pip-whl
pip install pycryptodomex
sudo ln -s /usr/lib/python2.7/dist-packages/Crypto /usr/lib/python2.7/dist-packages/Cryptodome

NB : j’ai fait le pip en root, vu que quand j’ai plusieurs commandes sudo à taper, je m’em­bête pas et je me mets en root. Je ne sais pas si ça peut faire une diffé­rence quel­conque.

Une petite typo

Ça, je l’ai dit en commen­taire de l’ar­ticle : une URL n’est pas bonne. Ça arrive.

wget https://raw.githubusercontent.com/sonpero/Netflix/master/repository.castagnait-1.0.0.zip

L’URL de l’ar­ticle pointe sur la page github du fichier et non sur le fichier lui-même.

Après cela, on installe ce fichier dans Kodi comme une exten­sion via l’ins­tal­la­tion par fichier zip. Ce n’est cepen­dant pas une exten­sion : c’est un dépôt d’ex­ten­sion qu’on installe là.

Les problèmes commencent

Il est tout à fait possible que l’au­teur de l’ar­ticle origi­nel n’ait pas rencon­tré les soucis suivants, mais moi si, ce qui justi­fie cet article.

  1. au moment d’ins­tal­ler l’ex­ten­sion Netflix via le nouveau dépôt, j’ai eu droit, comme sous Android, à un message indiquant que l’ins­tal­la­tion d’ex­ten­sion via des sources incon­nues n’était pas auto­risé. Un petit tour dans les para­mètres (le message a la bonne idée d’in­clure un bouton pour s’y rendre direc­te­ment) et c’est réglé ;
  2. une fois l’ex­ten­sion instal­lée et les iden­ti­fiants rentrés, impos­sible de lire une vidéo : il me manquait l’ex­ten­sion InputS­tream Adap­tive, et impos­sible de la trou­ver dans les dépôts. En fait, ayant installé Kodi à partir des dépôts Deb Multi­me­dia, il me fallait l’ins­tal­ler depuis les paquets Debian (et j’en ai installé un autre avec, il me semble qu’ils sont rela­ti­ve­ment liés) :

    apt install kodi-inputstream-adaptive kodi-inputstream-rtmp

    Puis un petit redé­mar­rage de Kodi pour qu’il voit ces nouvelles exten­sions ;

  3. Après, au lance­ment (enfin !) d’une première vidéo, l’ex­ten­sion m’a proposé l’ins­tal­la­tion de wide­vine… et c’est là que j’ai été averti qu’il fallait 2Gio d’es­pace libre. J’ai du faire un peu de place ;
  4. La place faite, Kodi se plai­gnait du fait qu’il fallait fdisk ou parted sur la machine pour pouvoir extraire wide­vine. Deux outils pour­tant bien instal­lés. J’ai lancé Kodi avec l’uti­li­sa­teur root après avoir fait ln -s /home/kodi/.kodi /root/.kodi (oui, j’ai un utili­sa­teur dédié) et j’ai enfin pu termi­ner l’ins­tal­la­tion de wide­vine ;
  5. Les vidéos ne se lançaient pas pour autant, pour des problèmes de permis­sions d’après les messages d’er­reur. L’ins­tal­la­tion de wide­vine via l’uti­li­sa­teur root mais son utili­sa­tion par l’uti­li­sa­teur kodi avait laissé des traces, en l’oc­cu­rence un lien symbo­lique dont la cible était dans /root/. Pour y remé­dier :
    cd /home/kodi/.kodi/cdm
    rm libwidevinecdm.so;
    ln -s /home/kodi/.kodi/userdata/addon_data/script.module.inputstreamhelper/cdm/libwidevinecdm.so

Et voilà, après ça, ça fonc­tionne 🙂

Bonus

Je suis chez un FAI asso­cia­tif (LDN, pour ne pas le nommer) via un VPN. Ce qui veut dire que :

  1. j’ai un pres­ta­taire qui me permet de monter le VPN, en l’oc­cu­rence Orange ;
  2. si je pompe trop de bande passante, c’est mon FAI qui est péna­lisé.

Enfin mon Turris Omnia, qui monte le VPN et redis­tri­bue Inter­net chez moi, n’a pas un proces­seur de folie : le chif­fre­ment/déchif­fre­ment du trafic VPN ne me permet pas de profi­ter de la pleine puis­sance de la connexion fibre Orange (ça reste plus que correct quand même hein !).

Du coup, pour éviter de péna­li­ser mon FAI et de bour­ri­ner mon Turris, je route direc­te­ment le trafic Netflix via la box Orange avec un simple :

ip route add 45.57.49.131 via 192.168.2.1 dev eth1

La première IP est celle d’un serveur Netflix, la deuxième est celle de la box Orange et eth1 est l’in­ter­face du Turris connec­tée à la box.

Bien sûr, il y a plus d’une adresse IP à router ainsi. J’ai fait une compi­la­tion de ce que j’ai trouvé sur un snip­pet Frama­git : https://frama­git.org/snip­pets/3739.

EDIT : On a porté à ma connais­sance la commande bgpq3 -J AS-NFLX, qui permet de connaître les adresses IPv4 de l’AS de Netflix. Je ne sais pas s’il faut toutes les dévier vers la box orange (j’ai eu des soucis sur certaines adresses que j’avais détec­tées) mais en tout cas ça va simpli­fier le boulot ! Pour les IPv6, il faut utili­ser bgpq3 -6 -J AS-NFLX.

Crédit : Photo par Alex Litvin sur Unsplash

Utili­ser un Turris Omnia comme client VPN

J’ai récem­ment acheté un routeur Turris Omnia. En effet, ayant démé­nagé dans un appar­te­ment dispo­sant de la fibre, je ne pouvais plus avoir de liai­son ADSL chez LDN. Qu’à celà ne tienne me disais-je, je prends un VPN chez eux et hop, j’ai un accès tout propre à Inter­net. Mais mon fidèle Buffalo était trop peu puis­sant pour faire office de client VPN pour une bande passante aussi élevée. D’où le Turris, plus puis­sant (et on peut faire plein de trucs avec, c’est un très beau jouet (certes, pas donné)).

Voici comment je m’y suis pris. Tout d’abord, envoyer sur le Turris les fichiers néces­saires à la connexion VPN four­nis par LDN : ca_server.crt, client.crt, et client.key. Je mets tout ça dans /etc/openvpn.

Puis je rajoute la confi­gu­ra­tion VPN au fichier /etc/config/openvpn :

config openvpn 'vpn'
    option enabled '1'
    option client '1'
    option dev 'tun'
    option keepalive '10 1200'
    option nobind '1'
    option ca '/etc/openvpn/ca_server.crt'
    option cert '/etc/openvpn/client.crt'
    option key '/etc/openvpn/client.key'
    option ns_cert_type 'server'
    option comp_lzo 'yes'
    option verb '3'
    option log '/tmp/log/openvpn.log'
    list remote 'vpn.ldn-fai.net 1194'
    option up '/etc/openvpn/up.sh'
    option down '/etc/openvpn/down.sh'
    option script_security '2'

Dans le script /etc/openvpn/up.sh, je remplace les routes par défaut du routeur pour faire passer tout le trafic par le VPN, et dans /etc/openvpn/down.sh, je les remets en place. Je crois (j’ai fait toutes ces mani­pu­la­tions il y a quelques mois, je ne me souviens plus très bien) que j’ai créé ces scripts parce que les routes ne se mettaient pas en place toutes seules.

NB : le réseau de la box opéra­teur est 192.168.2.0/24, je l’ai modi­fié pour ne pas le confondre avec mon réseau local 192.168.1.0/24 fourni par le Turris. 192.168.2.1 est l’adresse IP de la box.

/etc/openvpn/up.sh :

#!/bin/ash
ip route del default via 192.168.2.1 dev eth1
ip route add default via mon_IP_publique_fournie_par_LDN dev tun0
exit 0

/etc/openvpn/down.sh :

#!/bin/ash
ip route del default via mon_IP_publique_fournie_par_LDN dev tun0
ip route add default via 192.168.2.1 dev eth1
exit 0

Pour que le routeur arrive quand même à joindre le serveur VPN de LDN une fois les routes par défaut modi­fiées, j’ai modi­fié le fichier /etc/config/network :

config route
    option interface 'wan'
    option target '80.67.188.131' # IP du serveur vpn.ldn-fai.net
    option metric '10'
    option gateway '192.168.2.1'

config route
    option interface 'vpn'
    option target '0.0.0.0'
    option netmask '0.0.0.0'
    option gateway 'mon_IP_publique_fournie_par_LDN'

Au niveau du fire­wall, il faut créer une zone tun et ajou­ter quelque petits trucs (dans /etc/config/firewall) :

config zone
    option input 'ACCEPT'
    option output 'ACCEPT'
    option name 'tun'
    option masq '1'
    option network 'vpn'
    option forward 'REJECT'

config forwarding
    option dest 'wan'
    option src 'lan'

config forwarding
    option dest 'wan'
    option src 'tun'

config forwarding
    option dest 'tun'
    option src 'lan'

Norma­le­ment, il y a tout ce qu’il faut pour faire du Turris (et par exten­sion, d’un routeur sous OpenWRT) un client VPN qui va four­nir un réseau exploi­tant ce VPN.

Et l’IPv6 ? C’est vrai, je n’ai pas parlé d’IPv6 ici. Tout d’abord parce qu’il m’a moins embêté qu’IPv4 (pas besoin de redé­fi­nir les routes par défaut dans des scripts par exemple), ensuite parce que j’ai des bouts de confi­gu­ra­tion IPv6 dont je ne pas convaincu qu’ils soient néces­saires. Je vous les donne quand même :

Dans /etc/config/network :

config route6
    option interface 'wan'
    option target '2001:913:0:2000::131'  # IP du serveur vpn.ldn-fai.net
    option gateway 'fe80::a3e:5dff:fe74:b40a' # adresse link-local de la route IPv6 par défaut de mon Turris

config route6
    option interface 'vpn'
    option target '::/0'
    option gateway 'fe80::a3e:5dff:fe74:b40a'
    # Oui, c'est la même qu'au dessus. On pourrait croire que ça ne fonctionne pas, mais si.
    # Et je ne vois pas trace d'une IP orange lors d'un traceroute6.
    # Donc vraiment, je ne sais pas si c'est nécessaire

Pour propo­ser de l’IPv6 en DHCP à votre réseau local, mettez ceci dans /etc/config/network :

config interface 'lan'
    option ifname 'eth0 eth2'
    option force_link '1'
    option type 'bridge'
    option proto 'static'
    option ipaddr '192.168.1.1'
    option netmask '255.255.255.0'
    option ip6prefix '2001:DB8:42::/48' # Range IPv6 fourni par LDN
    option ip6assign '64' # Je réduis à un /64 pour mon réseau local
    option ip6hint 'beef' # Je choisis 2001:DB8:42:beef::/64 pour mon réseau local

Pourquoi créer un bridge entre eth0 et eth2 ? Bon sang, je ne sais plus… mais ça fonc­tionne donc bon.

Bonus : si les hôtes de votre réseau local ne peuvent pas se connec­ter les uns aux autres, j’avais déjà écrit un article avec la solu­tion 🙂

Pour le Turris, j’ai fait ainsi, dans /etc/config/network, d’après ce post :

config switch
    option name 'switch0'
    option reset '1'
    option enable_vlan '1'

config switch_vlan
    option device 'switch0'
    option vlan '1'
    option ports '0 1 2 3 5'

config switch_vlan
    option device 'switch0'
    option vlan '2'
    option ports '4 6'