Qui n'a jamais rêvé de créer son propre tracker torrent ? À nous la possibilité de partager ses fichiers avec des camarades sans devoir passer par des trackers publics — ou même privés — avec les communautés qui vont avec… Pas de ratio ou d'inscription ici, non, du bon vieux torrent sans utiliser ces plateformes tierces !
MÀJ : TBP n'est pas mort contrairement à ce que je pensais.
Contenu
Je débute un peu dans ce monde et certaines assertions présentes dans cet article viennent directement d'observations effectuées sur Wireshark. J'avais la flemme de lire la spécification, j'ai directement regardé ce qui passait. Si vous constatez une bêtise, n'hésitez pas à me le signaler ! (voir pied de page)
Sur ce, c'est parti.
Pourquoi Bittorrent et pas HTTP ?
Mettre à disposition des fichiers via Bittorrent permet de répartir la charge d'envoi (upload) entre les différents pairs participant au téléchargement, au lieu de compter sur un seul serveur.
Télécharger un fichier via Bittorrent peut s'avérer être plus lent que depuis un lien direct HTTP, pour partager des fichiers au sein d'une petite communauté par exemple. Cependant le protocole Bittorrent est beaucoup plus tolérant aux pannes que HTTP, et c'est l'une de ses grandes forces.
C'est le protocole idéal si vous voulez partager de gros fichiers depuis chez vous et qu'une coupure électrique ou d'internet peut faire foirer n'importe quel téléchargement HTTP. Avec le système de découpage de Bittorrent, le client va vérifier chaque petit morceau du téléchargement avant de procéder au suivant, réduisant grandement le risque d'erreur lors d'un téléchargement qui peut se couper puis reprendre sans aucun problème.
Le tracker Bittorrent
Principal rôle : mise en contact des pairs
Un tracker Bittorrent (ou traceur en français) est un logiciel simple qui a pour objectif de mettre en relation des clients (ou pairs) entre eux. Cette mise en contact est effectuée uniquement entre pairs voulant se partager le même fichier torrent. Le tracker n'a cependant pas connaissance du contenu ou du nom du torrent en question. Il se sert uniquement du hash du torrent pour mettre en relation les pairs.
Et… c'est tout. Comme vous pouvez le voir le rôle du tracker est très simple : il doit uniquement mettre en relation des clients en fonction du hash annoncé par le client au tracker (announce).
Sécurité des échanges client/tracker
L'échange de clients avec le tracker est souvent effectué sous la forme d'une requête HTTP en clair. Il suffit de regarder l'URL du tracker dans un fichier torrent pour s'en persuader. On trouve par exemple http://1.2.3.4:6969/announce. Ainsi, lorsque le client va contacter le tracker à cette adresse pour obtenir la liste des pairs correspondant au hash fourni, seul le hash ainsi que les adresses IP des clients vont transiter en clair. Il me semble ici compliqué de savoir quels fichiers sont échangés uniquement en écoutant cette connexion.
Cependant, afin que les IPs des camarades restent protégées ainsi que le hash, il est possible de mettre en place un proxy HTTPS avec nginx et LetsEncrypt afin de chiffrer la connexion. Par contre il faut alors obligatoirement un nom de domaine (et donc un whois…) pour obtenir le certificat, alors qu'on pouvait filer une IPv4 seule auparavant. Exemple : https://mytracker.fr:6969/announce.
Une autre solution est de passer par des certificats autosignés, mais je ne sais pas si il y a ensuite la possibilité de donner le certificat à un client pour qu'il le vérifie par la suite. Dans le doute, joker.
Un tracker… privé ?
Attention à ne pas confondre un tracker Bittorrent avec ce qu'il n'est pas.
On entend souvent parler de trackers privés, qui permettent – modulo inscription — de partager des fichiers torrents entre inconnus. Ces « trackers privés » se basent sur un tracker Bittorrent, mais proposent en plus de nombreuses autres fonctionnalités qui ne sont pas fournies avec un tracker Bittorrent classique :
- mise à disposition de la liste des fichiers torrent ;
- gestion des inscriptions, vérification des adresses mail ;
- vérification du ratio de partage des membres afin d'assurer un partage équitable ;
- modification de l'URL d'announce afin d'y incorporer un identifiant lié au membre (afin de pouvoir mettre à jour son ratio) ;
- système de freeleech (parce-que il y a un sytème de ratio…) ;
- système de ban IP (si envoi de fausses données pour monter le ratio) ;
Il doit exister des solutions logicielles offrant toutes ces fonctionnalités. Néanmoins celles-ci ne font pas parti du standard Bittorrent et me semblent un peu superflues pour mon usage. Toutes ces fonctionnalités ont été créées pour gérer des grandes communautés de partage. Mettre en place toute cette architecture pour simplement partager des fichiers avec quelques personnes connues, c'est un peu trop.
Le tracker que je vais vous présenter ici n'a rien de tout cela. Il permet uniquement de mettre en relation les pairs possédant déjà le fichier torrent (et c'est déjà pas mal, KISS).
Opentracker, un tracker léger écrit en C
opentracker est un tracker Bittorrent libre écrit en C. Parmi ses haut faits, on notera qu'il est utilisé pour le géant The Pirate Bay.
La page du projet est la quasi-seule documentation potable que j'ai pu trouver au cours de mes recherches. Elle n'est pas parfaite mais tout ce qu'il faut savoir s'y trouve. Je vous invite donc à la lire et la relire pour bien comprendre comment l'utiliser.
Activation de la liste blanche
Par défaut opentracker se comporte comme un tracker public : il va essayer de mettre en relation des pairs peu importe l'origine du torrent. Cela veut dire que n'importe qui peut créer un torrent utilisant notre tracker pour assurer sa distribution. Afin que notre tracker ne diffuse que les fichiers torrents que l'on autorise, on doit activer la fonctionnalité de liste blanche d'opentracker.
Pour cela, il faut décommenter la ligne dans le Makefile qui va permettre d'activer la whitelist.
--- a/Makefile
+++ b/Makefile
@@ -22,7 +22,7 @@ BINDIR?=$(PREFIX)/bin
#FEATURES+=-DWANT_V6
#FEATURES+=-DWANT_ACCESSLIST_BLACK
-#FEATURES+=-DWANT_ACCESSLIST_WHITE
+FEATURES+=-DWANT_ACCESSLIST_WHITE
#FEATURES+=-DWANT_SYNC_LIVE
#FEATURES+=-DWANT_IP_FROM_QUERY_STRING
Une fois cette option activée et le tracker compilé, celui-ci regardera dans le fichier spécifié par l'option -w la liste des hashs autorisés. Pour autoriser le seed d'un torrent, il faut alors ajouter le hash du torrent dans ce fichier (rappel : le tracker ne voit jamais les fichiers .torrent, uniquement les hashs de ceux-ci).
Cependant une fois que le tracker tourne il faut lui signaler que le fichier a changé pour qu'il aille le relire et puisse autoriser les nouvelles entrées. Pour cela, il faut alors envoyer le signal SIGHUP au processus du tracker, avec la commande kill ou killall selon vos préférences.
Exemple de procédure pour lancer le tracker, ajouter un hash et recharger la whitelist :
$ # Lance opentracker (bloquant)
$ ./opentracker -w whitelist
$ # Dans un autre terminal
$ echo ee11f030e6cf59da96622fac41b7d2a8329ef83b >> whitelist
$ killall -s SIGHUP opentracker
Créer notre premier torrent pour notre tracker
Maintenant que notre tracker est lancé, il est prêt à mettre en relation les peers. La seule condition pour que cette mise en contact fonctionne est que le hash du torrent ait été ajouté à la liste blanche du tracker.
On peut maintenant créer un fichier .torrent utilisant notre tracker pour la mise en relation. J'ai utilisé pour cela la commande transmission-create, mais sachez qu'il existe d'autres outils en ligne de commande comme mktorrent. Il est également possible de le faire graphiquement dans Transmission par exemple.
$ transmission-create --help
Usage: transmission-create [options] <file|directory>
Options:
-h --help Display this help page and exit
-p --private Allow this torrent to only be used with the
specified tracker(s)
-o --outfile <file> Save the generated .torrent to this filename
-s --piecesize <size in KiB> Set how many KiB each piece should be, overriding
the preferred default
-c --comment <comment> Add a comment
-t --tracker <url> Add a tracker's announce URL
-V --version Show version number and exit
$ transmission-create \
-o random_file.torrent \
-t http://212.213.214.215:6969/announce -p \
-c "Random file example" \
random_file.bin
Normalement toutes les options sont assez claires. Il est très important d'activer l'option -p (--private) afin que le client n'essaye pas de fuiter nos fichiers torrents en cherchant des pairs autrement qu'en passant par notre tracker (en utilisant PEX, DHT, etc.).
La création du fichier torrent peut être longue car il faut découper le ou les fichiers en plein de petits morceaux et calculer une somme de contrôle (checksum) pour chacun de ces morceaux. Cela permet aux clients possédant le fichier torrent de vérifier que le morceau reçu est le bon. C'est une protection contre deux phénomènes :
- Un des pairs est malveillant et envoie des morceaux corrompus afin de rendre le ou les fichiers finaux inutilisables ;
- Les morceaux reçu sont altérés lors du transport (perte de paquets, …).
Une fois le fichier créé, n'oubliez pas d'ajouter son hash à la liste blanche de votre tracker si vous avez (déjà ?!) oublié la section précédente.
Mise en seed avec rtorrent
Une fois le fichier torrent créé, vous pouvez lancer votre client Bittorrent favori et lui passer le fichier .torrent. Votre client doit avoir accès aux fichiers du torrent. Il va alors vérifier les fichiers à seed en calculant toutes les sommes de contrôle et en les comparant avec celles contenues dans le fichier torrent.
Une fois cette vérification faite votre client va passer en seed. Il sera alors en mesure de distribuer les morceaux de fichiers aux autres clients entrant en contact avec le tracker.
Attention néanmoins à bien choisir votre client Bittorrent pour le seed. J'utilisais auparavant Transmission avec son interface web mais j'ai rencontré quelques problèmes avec celui-ci. Au bout d'un certain temps en seed sans aucune activité (aucun peer à qui transmettre des morceaux) Transmission semble mettre le torrent de côté et n'arrive plus à contacter les nouveaux peers qui arrivent ensuite. Je ne sais pas si je suis le seul à avoir rencontré ce problème.
Je suis du coup passé à rtorrent qui ne me pose pas ce problème d'arrêt de seed. Celui-ci fonctionne en ligne de commande et sera ravi de tourner dans une session tmux pour rester toujours actif.
Il existe également rutorrent qui fourni une interface web pour rtorrent, en reprenant la super interface graphique des anciennes versions de μTorrent. Enfin j'utilise également le set de patches rtorrent-ps qui permet d'avoir une interface édulcorée bien plus sympa que la version de base dans le terminal.
Distribuer son fichier torrent
Étape délicate car n'importe quel individu en possession de ce petit fichier torrent pourra télécharger nos très gros contenus.
Sur les trackers privés grand public (sic) les fichiers torrent sont mis à disposition via le protocole HTTP, avec pour seule barrière à l'entrée un compte à créer. J'ai un peu la flemme de mettre en place un mécanisme de protection similaire pour distribuer des fichiers torrents.
Je pense donc actuellement distribuer ces fichiers aux copains copines par mail (chiffré PGP, parce-que ça m'embêterait que tous les intermédiaires qui voient le mail passer puisse se joindre au téléchargement). Comme toujours, pourquoi mettre en place un système compliqué quand on peut faire simple ?
Conclusion
C'est déjà la fin pour cet article technique. Il reste plein de choses à dire, notamment comment forcer le chiffrement sur son client, ou le fait rigolo qu'un client dualstack IPv4/IPv6 va seeder moitié moitié sur ses deux adresse, etc.. Cependant je fatigue et j'ai déjà plusieurs heures de rédaction sur cet article. Le net regorge de ressources sur le sujet pour qui sait taper les bons mots clés, même dans les moteurs de recherche alternatifs.
J'éspère que celui-ci vous aura un peu éclairé sur le partage de fichiers via Bittorrent et démystifié le système de tracker privé. Bon ok il a pas de formulaire d'inscription et de pubs douteuses aux quatres coins de page, mais si si, on vient de faire un tracker privé !
Allez, bon seed à tous.