Une Seedbox derrière un VPN (sur Raspberry Pi)

Attention! Ce tutoriel est obsolète dans la mesure où la solution plus légère du proxy torrent peut vous convenir!

Ceux qui téléchargent (de manière tout à fait légale, cela va sans dire) via le réseau BitTorrent le savent : certains sites requièrent un ratio entre le contenu téléchargé et le partage.
Ce que cela induit, c’est qu’il faut laisser “vivre” ses torrents et que comme, malheureusement, il se peut que le contenu ne soit pas si légal que ça – personne n’est à l’abri! – on finisse par se faire toper par le successeur d’Hadopi qui se mêle évidemment de tout ce qui le regarde au premier chef (et pas du tout de majors hollywoodiens, voyons).

Bon, alors du coup, nous voilà partis pour transformer un Raspberry Pi 3 qui dormait en Seedbox protégée derrière un VPN.

Prérequis

Un Raspberry Pi (ou un PC sous Linux, ça marche aussi) avec son OS installé dessus
ATTENTION : ce Raspberry devant passer par un VPN, il est recommandé de ne PAS lui faire faire autre chose, genre serveur Web : le VPN est certes configurable et le problème n’est pas insoluble, mais le tutoriel n’est pas prévu pour et, pour faire simple, le VPN foutra en l’air votre serveur Web en reroutant toutes les requêtes vers lui… Donc, pensez à séparer, au moins dans un premier temps, Seedbox du reste.

Un SSD en USB, vraiment recommandé car le lecteur de carte SD est absolument instable et peut vous foirer votre carte SD (c’est un défaut très connu des Raspberry Pi…)

Un fournisseur de VPN capable de vous fournir un fichier OVPN (et ses certificats qui vont avec si besoin).

De la connaissance et de la débrouillardise en Linux… Globalement, savoir accéder à votre Raspberry Pi sans difficulté en ligne de commande.

Procédure

1- Boot USB et mise à jour de la bestiole

Dans un premier temps, nous allons faire booter le Pi depuis le SSD USB. Avantage, j’ai écumé pour vous les Internets et je vous recommande chaudement de suivre la Méthode 2 de ce tutoriel que voici et qui répond parfaitement à la problématique. Ca fonctionne crème, je l’ai fait ce week-end. Bah alors.

En ayant terminé la Méthode 2, il convient maintenant de maximiser la taille du système de fichiers. Logguez-vous en SSH sur votre Pi puis :

sudo apt full-upgrade    // Met à jour tous les paquets
sudo rpi-update    // Met à jour le firmware
sudo reboot    // Active le nouveau firmware
sudo raspi-config

Puis dans 6 – System options, choisissez l’option A1 – Expand filesystem.

sudo reboot
lsblk

Cette dernière commande permet de s’assurer que le système de fichier est bien monté sur le SSD. Par exemple, chez moi, cela donne :

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 111.8G 0 disk
└─sda1 8:1 0 111.8G 0 part /
mmcblk0 179:0 0 14.4G 0 disk
├─mmcblk0p1 179:1 0 256M 0 part /boot
└─mmcblk0p2 179:2 0 14.2G 0 part

La mise au format est pénible mais on voit que / (le système de fichiers) est bien monté sur sda1, donc mon SSD. S’il était monté sur mmcblk0p2, ç’aurait été sur la carte SD. Donc : youpi.

2- Mise en place initiale du VPN

sudo apt install openvpn

Placez ensuite votre fichier .ovpn dans un endroit de votre connaissance; dans mon exemple, il sera dans /etc/openvpn/client/profil.ovpn .
Armez-vous de vos login et mot de passe pour la connexion, puis :

sudo openvpn --config /etc/openvpn/client/profil.ovpn

Normalement, vous devriez entrer à la main votre login et votre de passe, et l’idée serait d’arriver à la phrase “Initialization Sequence Completed”

Une fois rendu là, félicitations, le VPN est établi : le plus dur est fait.

Quittez en appuyant sur ctrl-X, et nous allons maintenant automatiser le login et le mot de passe.
Dans un fichier quelconque (alors attention, niveau sécurité c’est moyen), nous allons remplir le login et le mot de passe du vpn, par exemple dans /etc/openvpn/client/credentials.txt.

sudo nano /etc/openvpn/client/credentials.txt

Sur la première ligne, entrez le login, et sur la seconde (via un bête appui sur Enter, pas de subtilité autre) votre mot de passe.
Genre :

monlogin
monmotdepasse

Puis ctrl-X et Y pour quitter et sauvegarder.
Suite à quoi, nous allons tester la commande pour l’autologin :

sudo openvpn --config /etc/openvpn/client/profil.ovpn --auth-user-pass /etc/openvpn/client/credentials.txt

Cette fois-ci, vous devriez atteindre “Initialization Sequence Completed” sans rien avoir à indiquer.
Si tel n’est pas le cas, regardez ce qui a foiré dans la myriade de lignes indiquées au lancement d’OpenVPN.

Quittez OpenVPN avec un bon ctrl-X.

Information importante : ici, nous avons lancé le VPN qui tourne au premier plan, ce qui signifie qu’on ne peut plus rien faire dans la session SSH courante.
Ne testez pas ça tout de suite, mais l’idée pour faire en sorte qu’OpenVPN tourne en arrière-plan est d’ajouter le symbole & en fin de commande :

sudo openvpn --config /etc/openvpn/client/profil.ovpn --auth-user-pass /etc/openvpn/client/credentials.txt &

Ceci nous sera fort utile un peu plus tard.

3- Script, mon ami

Taper des commandes, c’est bien, mais les raccourcir, c’est mieux. Nous allons écrire un petit script (que nous allons enrichir après) permettant de lancer le VPN.
Ceci permet notamment de lancer le VPN au démarrage du Pi, ainsi que de lui coller d’autres étapes dont nous aurons besoin plus tard, à iso-nombre de caractères tapés.

Pour l’exemple, nous allons créer le script /etc/openvpn/client/launchvpn.sh :

sudo nano /etc/openvpn/client/launchvpn.sh

Voici ce que nous allons lui marquer :

#!/bin/bash

sudo openvpn --config /etc/openvpn/client/profil.ovpn --auth-user-pass /etc/openvpn/client/credentials.txt

Puis ctrl-X et Y pour enregistrer.
Suite à quoi, nous allons autoriser l’exécution du script et le lancer :

sudo chmod +x /etc/openvpn/client/launchvpn.sh
/etc/openvpn/client/launchvpn.sh

Si vous arrivez encore à “Initialization Sequence Completed”, c’est un nouveau succès et vous pouvez de nouveau ctrl-X pour quitter le VPN.

4- La joie des iptables

Le VPN, c’est bien, à un détail près : si vous laissez le VPN connecté et que vous quittez votre session SSH… Vous ne pourrez plus accéder au Raspberry Pi, puisque votre connexion (nouvelle) sera renvoyée dans le VPN… C’est ce qu’on lui demande, mais là, ça nous ennuie.

Afin de dégager le port SSH du VPN, nous allons utiliser la fonction iptables et routes offertes par Linux.
Note : par défaut, le port SSH est 22. Si vous l’avez changé, eh bah… Changez dans le script. Ca fait parfaitement sens.

Nous allons également partir du principe que notre IP publique (que vous pouvez récupérer sur http://www.whatismyip.com) est 1.2.3.4.
De même, nous allons partir du principe que votre adresse IP locale (celle entre votre box internet et vous) est 192.168.0.1.

Editez notre script de plus tôt :

sudo nano /etc/openvpn/client/launchvpn.sh

Et modifiez le script de la sorte :

#!/bin/bash

ip rule add table 128 to 1.2.3.4
ip route add table 128 default via 192.168.0.1
iptables -A INPUT -d 1.2.3.4 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -d 1.2.3.4 -j DROP

sudo openvpn --config /etc/openvpn/client/profil.ovpn --auth-user-pass /etc/openvpn/client/credentials.txt &

Suite à quoi, ctrl-X puis Y, comme toujours.
Relancez le script maintenant, puis ouvrez une autre session SSH vers votre Pi via un autre terminal.
Normalement, vous devriez pouvoir vous y connecter sans aucun problème, en dépit du VPN!

Pour couper le VPN, utilisez la commande :

sudo pkill openvpn

Ce que je vous invite à faire immédiatement.

5- Transmission

Le client BitTorrent que nous allons utiliser est transmission-daemon. Du coup :

sudo apt install transmission-daemon

Ensuite, nous allons créer un dossier, s’il n’existe pas, pour le stockage des torrents téléchargés :

sudo mkdir /downloads && sudo chmod 777 /downloads -R

Notez que le mode 777 n’est vraiment pas recommandé, mais il nous permet d’avoir la paix le temps de la mise en route de notre seedbox sans se préoccuper des droits d’accès. Il faudra penser à les changer après…

Ceci fait, nous allons éditer la configuration de Transmission via :

sudo nano /var/lib/transmission-daemon/info/settings.json

Il existe plusieurs niveaux de sécurisation du daemon transmission, pour ma part, je vote pour du simple et funky, mais pas sécurisé.
Voici les paramètres que j’ai changés dans mon settings.json :

"download-dir": "/downloads",
"rpc-host-whitelist-enabled": false,
"rpc-whitelist-enabled": false,

La première ligne est bien entendu le dossier de destination que nous avons créé ci-dessus, et les seconde et troisième lignes permettent à n’importe quel appareil de se connecter sur l’interface sans faire partie d’une liste des invités autorisés.

sudo service transmission-daemon restart

Attendu que votre IP locale est 192.168.1.100, vous pouvez donc vous connecter via votre navigateur à : http://192.168.1.100:9091/transmission
Et entrez le login transmission, ainsi que le mot de passe transmission

Si vous avez l’image ci-dessus, alors tout va bien!

Hyper important : par défaut, Transmission écoute sur le port 9091. Il est crucial de procéder au port forwarding de ce port sur votre box Internet vers votre Pi! Attendu que chaque box est différente, Google sera votre ami, mais attention à ne pas oublier ce détail : ça aura l’air de marcher… Mais en fait , très mal.

Vous pouvez maintenant ajouter un torrent via votre site favori et vérifier que tout fonctionne.
Si votre torrent ne se télécharge pas passé les premiers pourcents, vous devriez avoir un message d’erreur dans Transmission qui indique un problème de permission : votre dossier /downloads (ou autre) ne dispose pas des bonnes autorisations!

6- Up/Down : le killswitch

Maintenant que nous avons un VPN et un client Torrent qui fonctionne, nous allons lier les deux via un killswitch, c’est-à-dire une action automatique permettant dans notre cas de couper les torrents en cas de perte du VPN.

Pour cela, OpenVPN dispose d’une astuce à implémenter : up et down.
Ces options permettent, l’établissement (up) et à la coupure (down) du VPN, d’exécuter un script pour faire basiquement ce que l’on veut.

Dans ce but, nous allons créer deux scripts : vpnup.sh et vpndown.sh.

sudo touch /etc/openvpn/client/vpnup.sh && sudo chmod +x /etc/openvpn/client/vpnup.sh
sudo touch /etc/openvpn/client/vpndown.sh && sudo chmod +x /etc/openvpn/client/vpndown.sh
sudo nano /etc/openvpn/client/vpnup.sh

Copiez le contenu suivant dans vpnup.sh :

#!/bin/bash
echo "VPN up : starting all torrents"
sudo service transmission-daemon start
transmission-remote --auth "transmission:transmission" -tall --start

C’est un peu brutal, mais nous démarrons le service transmission-daemon, puis nous démarrons tous les torrents qui y sont couramment associés.
Il est possible de faire plus dans le sélectif, mais il faudra tuner le script en fonction, et ça, c’est votre affaire 😀

Ctrl-X puis Y, puis :

sudo nano /etc/openvpn/client/vpndown.sh

Et copiez-y :

#!/bin/bash
echo "VPN down : stopping all torrents!"
transmission-remote --auth "transmission:transmission" -tall --stop
sudo service transmission-daemon stop

Toujours dans le brutal : à la coupure du VPN, on arrête tous les torrents et on arrête même le service transmission-daemon pour bonne mesure.
La raison à ça est que transmission-remote envoie une commande à transmission-daemon, lequel répond “accepté” si tout se passe bien…
Mais quid de quand la commande, pour une raison ou pour une autre, est refusée?
Comme la priorité est de couper tout téléchargement si le VPN n’est pas actif, on se donne les moyens de ses envies!

Prochaine chose à faire : autoriser OpenVPN à appeler des scripts à l’établissement et à la coupure du VPN. En effet, il existe des options dans les fichiers .ovpn à indiquer pour explicitement autoriser l’exécution de scripts.
Reprenons notre fichier ovpn :

sudo nano /etc/openvpn/client/profil.ovpn

Puis cherchez éventuellement une ligne optionnelle indiquant script-security. Cette ligne peut ne pas exister, auquel cas rajoutez-la (l’emplacement importe peu, j’ai mis la mienne après le premier bloc de paramètres), ou modifiez l’existante de la sorte :

script-security 2

Enregistrez et fermez.
Maintenant, nous allons ajouter les appels à ces deux petits scripts à notre script de lancement du VPN :

sudo nano /etc/openvpn/client/launchvpn.sh

Et modifiez-le de la manière suivante :

#/bin/bash
ip rule add table 128 to 1.2.3.4
ip route add table 128 default via 192.168.0.1
iptables -A INPUT -d 1.2.3.4 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -d 1.2.3.4 -j DROP
sudo openvpn --config /etc/openvpn/client/profil.ovpn \
--auth-user-pass /etc/openvpn/client/credentials.txt \
--up /etc/openvpn/client/vpnup.sh\
--down /etc/openvpn/client/vpndown.sh &

(l’antislash permet d’écrire une commande sur plusieurs lignes)
Ctrl-X puis Y, et nous voilà presque arrivés à la fin!

Reste à faire

En vrac, il reste :
– A ouvrir sur la box internet et vérifier que le port 9091 fonctionne, ce qui passera par l’ajout probable de la ligne :

iptables -A INPUT -d 1.2.3.4 -p tcp --dport 9091 -j ACCEPT

dans launchvpn.sh,
– automatiser le lancement de launchvpn au démarrage, via le crontab root (sudo crontab -e).
– pourquoi pas le transfert des données depuis la seedbox vers un autre serveur.

Leave a Reply

Your email address will not be published. Required fields are marked *